limine_protocol_for_rust/requests/
memory_map.rs

1//![Memory Map Feature](https://codeberg.org/Limine/limine-protocol/src/branch/trunk/PROTOCOL.md#memory-map-feature)
2
3use crate::requests::LimineRequest;
4use core::mem::MaybeUninit;
5use core::slice::from_raw_parts;
6use crate::{impl_limine_req, LimineReqId};
7use crate::util::PointerSlice;
8
9#[repr(C, align(8))]
10pub struct MemoryMapRequest {
11    id: LimineReqId,
12    revision: u64,
13    resp: MaybeUninit<usize>
14}
15
16impl MemoryMapRequest {
17    pub const fn new(revision: u64) -> Self {
18        Self {
19            id: LimineReqId::new([0x67cf3d9d378a806f, 0xe304acdfc50c3c62]),
20            revision,
21            resp: MaybeUninit::uninit()
22        }
23    }
24}
25
26impl_limine_req!(MemoryMapRequest, MemoryMapResponse);
27
28#[repr(C, align(8))]
29#[derive(Copy, Clone)]
30pub struct MemoryMapResponse {
31    revision: u64,
32    entry_count: u64,
33    entries: *const *const MemoryRegionInfo
34}
35
36impl MemoryMapResponse {
37    pub fn get_entries(&self) -> PointerSlice<MemoryRegionInfo> {
38        PointerSlice::from(unsafe {
39            from_raw_parts(self.entries, self.entry_count as usize)
40        })
41    }
42}
43
44#[repr(C, align(8))]
45#[derive(Copy, Clone)]
46pub struct MemoryRegionInfo {
47    pub base: u64,
48    pub length: u64,
49    region_type: u64
50}
51
52impl MemoryRegionInfo {
53    pub fn get_type(&self) -> MemoryRegionType {
54        MemoryRegionType::from(self.region_type)
55    }
56}
57
58#[derive(PartialEq, Debug)]
59pub enum MemoryRegionType {
60    Usable,
61    Reserved,
62    AcpiReclaimable,
63    AcpiNvs,
64    BadMemory,
65    BootloaderReclaimable,
66    ExecutableAndModules,
67    Framebuffer,
68    AcpiTables
69}
70
71impl From<u64> for MemoryRegionType {
72    fn from(value: u64) -> Self {
73        match value {
74            0 => MemoryRegionType::Usable,
75            1 => MemoryRegionType::Reserved,
76            2 => MemoryRegionType::AcpiReclaimable,
77            3 => MemoryRegionType::AcpiNvs,
78            4 => MemoryRegionType::BadMemory,
79            5 => MemoryRegionType::BootloaderReclaimable,
80            6 => MemoryRegionType::ExecutableAndModules,
81            7 => MemoryRegionType::Framebuffer,
82            8 => MemoryRegionType::AcpiTables,
83            _ => panic!("Invalid MemoryMap Type")
84        }
85    }
86}