limine_protocol_for_rust/requests/
memory_map.rs1use 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}