pub struct Header<'a>(/* private fields */);Expand description
A parsed complete Multiboot2 header.
It consists of the fixed Multiboot2BasicHeader prefix followed by all
header tags (see HeaderTagType). Multiboot2BasicHeader represents
only that prefix; use this type when working with the complete, dynamically
sized header.
Use this to parse a header from a pointer. To construct a header, use
Builder (requires the builder feature).
Implementations§
Source§impl<'a> Header<'a>
impl<'a> Header<'a>
Sourcepub unsafe fn load(ptr: *const Multiboot2BasicHeader) -> Result<Self, LoadError>
pub unsafe fn load(ptr: *const Multiboot2BasicHeader) -> Result<Self, LoadError>
Loads a complete Header from a pointer.
If the header is invalid, it returns a LoadError.
This may be because:
ptris a null pointerptris not 8-byte aligned- the reported total size is invalid
- the magic value of the header is not present
- the checksum field is invalid
- the tag sequence is incomplete or malformed
- the mandatory end tag is missing
§Safety
ptrmust be valid for reading the complete reported header size. Otherwise, this function might cause invalid machine state or crash your binary.- The memory at
ptrmust not be modified after callingloador the program may observe unsynchronized mutation.
Examples found in repository?
7fn main() {
8 // We create a Multiboot2 header during runtime here. A more practical
9 // example, however, would be that you parse the header from kernel binary
10 // at runtime.
11 let header_bytes = Builder::new(HeaderTagISA::I386)
12 .relocatable_tag(RelocatableHeaderTag::new(
13 HeaderTagFlag::Required,
14 0x1337,
15 0xdeadbeef,
16 4096,
17 RelocatableHeaderTagPreference::None,
18 ))
19 .information_request_tag(InformationRequestHeaderTag::new(
20 HeaderTagFlag::Required,
21 &[
22 MbiTagType::Cmdline.into(),
23 MbiTagType::BootLoaderName.into(),
24 ],
25 ))
26 .build();
27
28 let header = unsafe { Header::load(header_bytes.as_ptr()) }.unwrap();
29 println!("{header:#?}");
30}Sourcepub fn find_header(buffer: &[u8]) -> Result<(Self, usize), LoadError>
pub fn find_header(buffer: &[u8]) -> Result<(Self, usize), LoadError>
Tries finding a Multiboot2 header in a given slice of binary data.
Performs basic checks, such as length checks and a checksum match.
The Multiboot2 header must be contained completely within the first
HEADER_SEARCH_LIMIT bytes of the OS image, and must be
64-bit aligned.
On success, it returns the parsed header and an index into the original buffer pointing to where the header starts.
§Parameters
buffer: 64-bit aligned buffer describing the firstHEADER_SEARCH_LIMITbytes of a potential Multiboot2 kernel image.
Sourcepub const fn verify_checksum(&self) -> Result<(), (u32, u32)>
pub const fn verify_checksum(&self) -> Result<(), (u32, u32)>
Wrapper around Multiboot2BasicHeader::verify_checksum.
Sourcepub const fn header_magic(&self) -> u32
pub const fn header_magic(&self) -> u32
Wrapper around Multiboot2BasicHeader::header_magic.
Sourcepub const fn arch(&self) -> HeaderTagISA
pub const fn arch(&self) -> HeaderTagISA
Wrapper around Multiboot2BasicHeader::arch.
Sourcepub const fn length(&self) -> u32
pub const fn length(&self) -> u32
Wrapper around Multiboot2BasicHeader::length.
Sourcepub const fn checksum(&self) -> u32
pub const fn checksum(&self) -> u32
Wrapper around Multiboot2BasicHeader::checksum.
Sourcepub const fn calc_checksum(magic: u32, arch: HeaderTagISA, length: u32) -> u32
pub const fn calc_checksum(magic: u32, arch: HeaderTagISA, length: u32) -> u32
Wrapper around Multiboot2BasicHeader::calc_checksum.
Sourcepub fn information_request_tag(&self) -> Option<&InformationRequestHeaderTag>
pub fn information_request_tag(&self) -> Option<&InformationRequestHeaderTag>
Search for the InformationRequestHeaderTag header tag.
Sourcepub fn address_tag(&self) -> Option<&AddressHeaderTag>
pub fn address_tag(&self) -> Option<&AddressHeaderTag>
Search for the AddressHeaderTag header tag.
Sourcepub fn entry_address_tag(&self) -> Option<&EntryAddressHeaderTag>
pub fn entry_address_tag(&self) -> Option<&EntryAddressHeaderTag>
Search for the EntryAddressHeaderTag header tag.
Sourcepub fn entry_address_efi32_tag(&self) -> Option<&EntryEfi32HeaderTag>
pub fn entry_address_efi32_tag(&self) -> Option<&EntryEfi32HeaderTag>
Search for the EntryEfi32HeaderTag header tag.
Sourcepub fn entry_address_efi64_tag(&self) -> Option<&EntryEfi64HeaderTag>
pub fn entry_address_efi64_tag(&self) -> Option<&EntryEfi64HeaderTag>
Search for the EntryEfi64HeaderTag header tag.
Sourcepub fn console_flags_tag(&self) -> Option<&ConsoleHeaderTag>
pub fn console_flags_tag(&self) -> Option<&ConsoleHeaderTag>
Search for the ConsoleHeaderTag header tag.
Sourcepub fn framebuffer_tag(&self) -> Option<&FramebufferHeaderTag>
pub fn framebuffer_tag(&self) -> Option<&FramebufferHeaderTag>
Search for the FramebufferHeaderTag header tag.
Sourcepub fn module_align_tag(&self) -> Option<&ModuleAlignHeaderTag>
pub fn module_align_tag(&self) -> Option<&ModuleAlignHeaderTag>
Search for the ModuleAlignHeaderTag header tag.
Sourcepub fn efi_boot_services_tag(&self) -> Option<&EfiBootServiceHeaderTag>
pub fn efi_boot_services_tag(&self) -> Option<&EfiBootServiceHeaderTag>
Search for the EfiBootServiceHeaderTag header tag.
Sourcepub fn relocatable_tag(&self) -> Option<&RelocatableHeaderTag>
pub fn relocatable_tag(&self) -> Option<&RelocatableHeaderTag>
Search for the RelocatableHeaderTag header tag.