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}