use core::mem;
use multiboot2_common::Header;
#[repr(u32)]
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum HeaderTagISA {
I386 = 0,
MIPS32 = 4,
}
#[repr(u16)]
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum HeaderTagType {
End = 0,
InformationRequest = 1,
Address = 2,
EntryAddress = 3,
ConsoleFlags = 4,
Framebuffer = 5,
ModuleAlign = 6,
EfiBS = 7,
EntryAddressEFI32 = 8,
EntryAddressEFI64 = 9,
Relocatable = 10,
}
impl HeaderTagType {
#[must_use]
pub const fn count() -> u32 {
11
}
}
#[repr(u16)]
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum HeaderTagFlag {
Required = 0,
Optional = 1,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
pub struct HeaderTagHeader {
typ: HeaderTagType,
flags: HeaderTagFlag,
size: u32,
}
impl HeaderTagHeader {
#[must_use]
pub const fn new(typ: HeaderTagType, flags: HeaderTagFlag, size: u32) -> Self {
Self { typ, flags, size }
}
#[must_use]
pub const fn typ(&self) -> HeaderTagType {
self.typ
}
#[must_use]
pub const fn flags(&self) -> HeaderTagFlag {
self.flags
}
#[must_use]
pub const fn size(&self) -> u32 {
self.size
}
}
impl Header for HeaderTagHeader {
fn payload_len(&self) -> usize {
self.size as usize - mem::size_of::<Self>()
}
fn set_size(&mut self, total_size: usize) {
self.size = total_size as u32;
}
}
#[cfg(test)]
mod tests {
use crate::HeaderTagHeader;
#[test]
fn test_assert_size() {
assert_eq!(core::mem::size_of::<HeaderTagHeader>(), 2 + 2 + 4);
}
}