Skip to main content

kernutil/
memory.rs

1use num_align::NumAlign;
2
3#[derive(Default, Debug, Clone, Copy, PartialEq, Eq)]
4pub struct MemoryDescriptor {
5    pub name: &'static str,
6    pub physical_start: usize,
7    pub size_in_bytes: usize,
8    pub memory_type: MemoryType,
9}
10
11impl MemoryDescriptor {
12    pub fn new_with_range(
13        name: &'static str,
14        range: core::ops::Range<usize>,
15        memory_type: MemoryType,
16    ) -> Self {
17        MemoryDescriptor {
18            name,
19            physical_start: range.start,
20            size_in_bytes: range.end - range.start,
21            memory_type,
22        }
23    }
24
25    pub fn new_with_range_aligned(
26        name: &'static str,
27        range: core::ops::Range<usize>,
28        memory_type: MemoryType,
29        align: usize,
30    ) -> Self {
31        let start = range.start.align_down(align);
32        let end = range.end.align_up(align);
33        MemoryDescriptor {
34            name,
35            physical_start: start,
36            size_in_bytes: end - start,
37            memory_type,
38        }
39    }
40
41    pub fn new_aligned(
42        name: &'static str,
43        physical_start: usize,
44        size_in_bytes: usize,
45        memory_type: MemoryType,
46        align: usize,
47    ) -> Self {
48        let start = physical_start.align_down(align);
49        let end = (physical_start + size_in_bytes).align_up(align);
50        MemoryDescriptor {
51            name,
52            physical_start: start,
53            size_in_bytes: end - start,
54            memory_type,
55        }
56    }
57}
58
59#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
60pub enum MemoryType {
61    #[default]
62    Free,
63    KImage,
64    Reserved,
65    Mmio,
66}
67
68impl ranges_ext::RangeInfo for MemoryDescriptor {
69    type Kind = MemoryType;
70
71    type Type = usize;
72
73    fn range(&self) -> core::ops::Range<Self::Type> {
74        self.physical_start..(self.physical_start + self.size_in_bytes)
75    }
76
77    fn kind(&self) -> Self::Kind {
78        self.memory_type
79    }
80
81    fn overwritable(&self) -> bool {
82        matches!(self.memory_type, MemoryType::Free)
83    }
84
85    fn clone_with_range(&self, range: core::ops::Range<Self::Type>) -> Self {
86        MemoryDescriptor {
87            name: self.name,
88            physical_start: range.start,
89            size_in_bytes: range.end - range.start,
90            memory_type: self.memory_type,
91        }
92    }
93}
94
95#[derive(Debug, Clone, Copy)]
96#[repr(C)]
97pub struct PageTableInfo {
98    pub asid: usize,
99    pub addr: usize,
100}
101
102impl PageTableInfo {
103    pub const fn zero() -> Self {
104        PageTableInfo { asid: 0, addr: 0 }
105    }
106}