multiboot2_header/
uefi_bs.rs

1use crate::{HeaderTagFlag, HeaderTagHeader, HeaderTagType};
2use core::mem;
3use multiboot2_common::{MaybeDynSized, Tag};
4
5/// This tag indicates that payload supports starting without terminating UEFI boot services.
6/// Or in other words: The payload wants to use UEFI boot services.
7#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
8#[repr(C, align(8))]
9pub struct EfiBootServiceHeaderTag {
10    header: HeaderTagHeader,
11}
12
13impl EfiBootServiceHeaderTag {
14    /// Constructs a new tag.
15    #[must_use]
16    pub const fn new(flags: HeaderTagFlag) -> Self {
17        let header =
18            HeaderTagHeader::new(HeaderTagType::EfiBS, flags, mem::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
41impl MaybeDynSized for EfiBootServiceHeaderTag {
42    type Header = HeaderTagHeader;
43
44    const BASE_SIZE: usize = mem::size_of::<Self>();
45
46    fn dst_len(_header: &Self::Header) -> Self::Metadata {}
47}
48
49impl Tag for EfiBootServiceHeaderTag {
50    type IDType = HeaderTagType;
51    const ID: HeaderTagType = HeaderTagType::EfiBS;
52}
53
54#[cfg(test)]
55mod tests {
56    use crate::EfiBootServiceHeaderTag;
57
58    #[test]
59    fn test_assert_size() {
60        assert_eq!(core::mem::size_of::<EfiBootServiceHeaderTag>(), 2 + 2 + 4);
61    }
62}