Skip to main content

multiboot2_header/
entry_address.rs

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