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