minimal/
minimal.rs

1use multiboot2_common::MaybeDynSized;
2use multiboot2_header::Builder;
3use multiboot2_header::{
4    HeaderTagFlag, HeaderTagISA, InformationRequestHeaderTag, MbiTagType, Multiboot2Header,
5    RelocatableHeaderTag, RelocatableHeaderTagPreference,
6};
7
8/// Small example that creates a Multiboot2 header and parses it afterwards.
9fn main() {
10    // We create a Multiboot2 header during runtime here. A more practical
11    // example, however, would be that you parse the header from kernel binary
12    // at runtime.
13    let mb2_hdr_bytes = Builder::new(HeaderTagISA::I386)
14        .relocatable_tag(RelocatableHeaderTag::new(
15            HeaderTagFlag::Required,
16            0x1337,
17            0xdeadbeef,
18            4096,
19            RelocatableHeaderTagPreference::None,
20        ))
21        .information_request_tag(InformationRequestHeaderTag::new(
22            HeaderTagFlag::Required,
23            &[
24                MbiTagType::Cmdline.into(),
25                MbiTagType::BootLoaderName.into(),
26            ],
27        ))
28        .build();
29
30    // Cast bytes in vector to Multiboot2 information structure
31    let ptr = mb2_hdr_bytes.as_bytes().as_ptr();
32    let mb2_hdr = unsafe { Multiboot2Header::load(ptr.cast()) };
33    let mb2_hdr = mb2_hdr.unwrap();
34    println!("{mb2_hdr:#?}");
35}