multiboot2_header/
entry_address.rs

1use crate::{HeaderTagFlag, HeaderTagHeader, HeaderTagType};
2use core::fmt;
3use core::fmt::{Debug, Formatter};
4use core::mem;
5use multiboot2_common::{MaybeDynSized, Tag};
6
7/// Specifies the physical address to which the boot loader should jump in
8/// order to start running the operating system. Not needed for ELF files.
9#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
10#[repr(C, align(8))]
11pub struct EntryAddressHeaderTag {
12    header: HeaderTagHeader,
13    entry_addr: u32,
14}
15
16impl EntryAddressHeaderTag {
17    /// Constructs a new tag.
18    #[must_use]
19    pub const fn new(flags: HeaderTagFlag, entry_addr: u32) -> Self {
20        let header =
21            HeaderTagHeader::new(HeaderTagType::EntryAddress, flags, Self::BASE_SIZE as u32);
22        Self { header, entry_addr }
23    }
24
25    /// Returns the [`HeaderTagType`].
26    #[must_use]
27    pub const fn typ(&self) -> HeaderTagType {
28        self.header.typ()
29    }
30
31    /// Returns the [`HeaderTagFlag`]s.
32    #[must_use]
33    pub const fn flags(&self) -> HeaderTagFlag {
34        self.header.flags()
35    }
36
37    /// Returns the size.
38    #[must_use]
39    pub const fn size(&self) -> u32 {
40        self.header.size()
41    }
42
43    /// Returns the entry address.
44    #[must_use]
45    pub const fn entry_addr(&self) -> u32 {
46        self.entry_addr
47    }
48}
49
50impl Debug for EntryAddressHeaderTag {
51    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
52        f.debug_struct("EntryAddressHeaderTag")
53            .field("type", &self.typ())
54            .field("flags", &self.flags())
55            .field("size", &self.size())
56            .field("entry_addr", &self.entry_addr)
57            .finish()
58    }
59}
60
61impl MaybeDynSized for EntryAddressHeaderTag {
62    type Header = HeaderTagHeader;
63
64    const BASE_SIZE: usize = mem::size_of::<HeaderTagHeader>() + mem::size_of::<u32>();
65
66    fn dst_len(_header: &Self::Header) -> Self::Metadata {}
67}
68
69impl Tag for EntryAddressHeaderTag {
70    type IDType = HeaderTagType;
71    const ID: HeaderTagType = HeaderTagType::EntryAddress;
72}