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