multiboot2_header/
entry_address.rs1use crate::{HeaderTagFlag, HeaderTagHeader, HeaderTagType};
2use core::fmt;
3use core::fmt::{Debug, Formatter};
4use multiboot2_common::{MaybeDynSized, Tag};
5
6#[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 #[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 #[must_use]
26 pub const fn typ(&self) -> HeaderTagType {
27 self.header.typ()
28 }
29
30 #[must_use]
32 pub const fn flags(&self) -> HeaderTagFlag {
33 self.header.flags()
34 }
35
36 #[must_use]
38 pub const fn size(&self) -> u32 {
39 self.header.size()
40 }
41
42 #[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}