use crate::parser::{ByteOrder, Invalid, Parser};
use crate::{Error, Head};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum MemoryType {
Reserved,
LoaderCode,
LoaderData,
BootServicesCode,
BootServicesData,
RuntimeServicesCode,
RuntimeServicesData,
ConventionalMemory,
UnusableMemory,
AcpiReclaimMemory,
AcpiMemoryNvs,
MemoryMappedIo,
MemoryMappedIoPortSpace,
PalCode,
PersistentMemory,
UnacceptedMemory,
MaxMemory,
}
impl Parser<MemoryType> for &[u8] {
type Arg = ByteOrder;
fn parse(&mut self, arg: Self::Arg) -> Result<MemoryType, Invalid> {
match self.parse(arg)? {
0u32 => Ok(MemoryType::Reserved),
1 => Ok(MemoryType::LoaderCode),
2 => Ok(MemoryType::LoaderData),
3 => Ok(MemoryType::BootServicesCode),
4 => Ok(MemoryType::BootServicesData),
5 => Ok(MemoryType::RuntimeServicesCode),
6 => Ok(MemoryType::RuntimeServicesData),
7 => Ok(MemoryType::ConventionalMemory),
8 => Ok(MemoryType::UnusableMemory),
9 => Ok(MemoryType::AcpiReclaimMemory),
10 => Ok(MemoryType::AcpiMemoryNvs),
11 => Ok(MemoryType::MemoryMappedIo),
12 => Ok(MemoryType::MemoryMappedIoPortSpace),
13 => Ok(MemoryType::PalCode),
14 => Ok(MemoryType::PersistentMemory),
15 => Ok(MemoryType::UnacceptedMemory),
16 => Ok(MemoryType::MaxMemory),
_ => Err(Invalid),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct MemMap {
pub kind: MemoryType,
pub start: u64,
pub end: u64,
}
impl<'a> TryFrom<Head<'a>> for MemMap {
type Error = Error;
fn try_from(mut node: Head<'a>) -> Result<Self, Self::Error> {
Ok(Self {
kind: node.data.parse(ByteOrder::Little)?,
start: node.data.parse(ByteOrder::Little)?,
end: node.data.finish(ByteOrder::Little)?,
})
}
}