Skip to main content

multiboot2_header/
module_align.rs

1use crate::{HeaderTagFlag, HeaderTagHeader, HeaderTagType};
2use multiboot2_common::{MaybeDynSized, Tag};
3
4/// If this tag is present, provided boot modules must be page aligned.
5#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
6#[repr(C, align(8))]
7pub struct ModuleAlignHeaderTag {
8    header: HeaderTagHeader,
9}
10
11const _: () = assert!(size_of::<ModuleAlignHeaderTag>() == 2 + 2 + 4);
12
13impl ModuleAlignHeaderTag {
14    /// Constructs a new tag.
15    #[must_use]
16    pub const fn new(flags: HeaderTagFlag) -> Self {
17        let header =
18            HeaderTagHeader::new(HeaderTagType::ModuleAlign, flags, size_of::<Self>() as u32);
19        Self { header }
20    }
21
22    /// Returns the [`HeaderTagType`].
23    #[must_use]
24    pub const fn typ(&self) -> HeaderTagType {
25        self.header.typ()
26    }
27
28    /// Returns the [`HeaderTagFlag`]s.
29    #[must_use]
30    pub const fn flags(&self) -> HeaderTagFlag {
31        self.header.flags()
32    }
33
34    /// Returns the size.
35    #[must_use]
36    pub const fn size(&self) -> u32 {
37        self.header.size()
38    }
39}
40
41// SAFETY: The tag is repr(C) with the header as first field, any bit
42// pattern is valid, and `BASE_SIZE`/`dst_len` match the ABI.
43unsafe impl MaybeDynSized for ModuleAlignHeaderTag {
44    type Header = HeaderTagHeader;
45
46    const BASE_SIZE: usize = size_of::<Self>();
47}
48
49impl Tag for ModuleAlignHeaderTag {
50    type IDType = HeaderTagType;
51    const ID: HeaderTagType = HeaderTagType::ModuleAlign;
52}