coreboot_table/
memory.rs

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}