1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
use core::{mem, slice}; use super::{Cb64, Record}; #[derive(Debug)] #[repr(u32)] pub enum MemoryRangeKind { Ram = 1, Reserved = 2, Acpi = 3, Nvs = 4, Unusable = 5, VendorReserved = 6, Table = 16, } #[derive(Debug)] #[repr(packed)] pub struct MemoryRange { pub start: Cb64, pub size: Cb64, pub kind: MemoryRangeKind, } #[derive(Debug)] #[repr(packed)] pub struct Memory { pub record: Record, } impl Memory { pub fn ranges(&self) -> &[MemoryRange] { let address = (self as *const Memory as usize) + mem::size_of::<Record>(); let size = (self.record.size as usize) - mem::size_of::<Record>(); unsafe { slice::from_raw_parts( address as *const MemoryRange, size / mem::size_of::<MemoryRange>() ) } } }