module_align.rs 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. use crate::{HeaderTagFlag, HeaderTagHeader, HeaderTagType};
  2. use core::mem;
  3. use multiboot2_common::{MaybeDynSized, Tag};
  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))]
  7. pub struct ModuleAlignHeaderTag {
  8. header: HeaderTagHeader,
  9. }
  10. impl ModuleAlignHeaderTag {
  11. /// Constructs a new tag.
  12. #[must_use]
  13. pub const fn new(flags: HeaderTagFlag) -> Self {
  14. let header = HeaderTagHeader::new(
  15. HeaderTagType::ModuleAlign,
  16. flags,
  17. mem::size_of::<Self>() as u32,
  18. );
  19. Self { header }
  20. }
  21. /// Returns the [`HeaderTagType`].
  22. #[must_use]
  23. pub const fn typ(&self) -> HeaderTagType {
  24. self.header.typ()
  25. }
  26. /// Returns the [`HeaderTagFlag`]s.
  27. #[must_use]
  28. pub const fn flags(&self) -> HeaderTagFlag {
  29. self.header.flags()
  30. }
  31. /// Returns the size.
  32. #[must_use]
  33. pub const fn size(&self) -> u32 {
  34. self.header.size()
  35. }
  36. }
  37. impl MaybeDynSized for ModuleAlignHeaderTag {
  38. type Header = HeaderTagHeader;
  39. const BASE_SIZE: usize = mem::size_of::<Self>();
  40. fn dst_len(_header: &Self::Header) -> Self::Metadata {}
  41. }
  42. impl Tag for ModuleAlignHeaderTag {
  43. type IDType = HeaderTagType;
  44. const ID: HeaderTagType = HeaderTagType::ModuleAlign;
  45. }
  46. #[cfg(test)]
  47. mod tests {
  48. use crate::ModuleAlignHeaderTag;
  49. #[test]
  50. fn test_assert_size() {
  51. assert_eq!(core::mem::size_of::<ModuleAlignHeaderTag>(), 2 + 2 + 4);
  52. }
  53. }