uefi_bs.rs 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. use crate::{HeaderTagFlag, HeaderTagHeader, HeaderTagType};
  2. use core::mem::size_of;
  3. /// This tag indicates that payload supports starting without terminating UEFI boot services.
  4. /// Or in other words: The payload wants to use UEFI boot services.
  5. #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
  6. #[repr(C)]
  7. pub struct EfiBootServiceHeaderTag {
  8. header: HeaderTagHeader,
  9. }
  10. impl EfiBootServiceHeaderTag {
  11. /// Constructs a new tag.
  12. #[must_use]
  13. pub const fn new(flags: HeaderTagFlag) -> Self {
  14. let header = HeaderTagHeader::new(HeaderTagType::EfiBS, flags, size_of::<Self>() as u32);
  15. Self { header }
  16. }
  17. /// Returns the [`HeaderTagType`].
  18. #[must_use]
  19. pub const fn typ(&self) -> HeaderTagType {
  20. self.header.typ()
  21. }
  22. /// Returns the [`HeaderTagFlag`]s.
  23. #[must_use]
  24. pub const fn flags(&self) -> HeaderTagFlag {
  25. self.header.flags()
  26. }
  27. /// Returns the size.
  28. #[must_use]
  29. pub const fn size(&self) -> u32 {
  30. self.header.size()
  31. }
  32. }
  33. #[cfg(test)]
  34. mod tests {
  35. use crate::EfiBootServiceHeaderTag;
  36. #[test]
  37. fn test_assert_size() {
  38. assert_eq!(core::mem::size_of::<EfiBootServiceHeaderTag>(), 2 + 2 + 4);
  39. }
  40. }