multiboot2_header/
module_align.rs

1use crate::{HeaderTagFlag, HeaderTagHeader, HeaderTagType};
2use core::mem;
3use multiboot2_common::{MaybeDynSized, Tag};
4
5/// If this tag is present, provided boot modules must be page aligned.
6#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
7#[repr(C, align(8))]
8pub struct ModuleAlignHeaderTag {
9    header: HeaderTagHeader,
10}
11
12impl ModuleAlignHeaderTag {
13    /// Constructs a new tag.
14    #[must_use]
15    pub const fn new(flags: HeaderTagFlag) -> Self {
16        let header = HeaderTagHeader::new(
17            HeaderTagType::ModuleAlign,
18            flags,
19            mem::size_of::<Self>() as u32,
20        );
21        Self { header }
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
43impl MaybeDynSized for ModuleAlignHeaderTag {
44    type Header = HeaderTagHeader;
45
46    const BASE_SIZE: usize = mem::size_of::<Self>();
47
48    fn dst_len(_header: &Self::Header) -> Self::Metadata {}
49}
50
51impl Tag for ModuleAlignHeaderTag {
52    type IDType = HeaderTagType;
53    const ID: HeaderTagType = HeaderTagType::ModuleAlign;
54}
55
56#[cfg(test)]
57mod tests {
58    use crate::ModuleAlignHeaderTag;
59
60    #[test]
61    fn test_assert_size() {
62        assert_eq!(core::mem::size_of::<ModuleAlignHeaderTag>(), 2 + 2 + 4);
63    }
64}