1
1
use crate :: { Tag , TagTrait , TagType , TagTypeId } ;
2
2
use core:: convert:: TryInto ;
3
- use core:: fmt:: Debug ;
3
+ use core:: fmt:: { Debug , Formatter } ;
4
4
use core:: marker:: PhantomData ;
5
5
use core:: mem;
6
6
@@ -84,17 +84,17 @@ impl StructAsBytes for MemoryMapTag {
84
84
pub struct MemoryArea {
85
85
base_addr : u64 ,
86
86
length : u64 ,
87
- typ : MemoryAreaType ,
87
+ typ : MemoryAreaTypeId ,
88
88
_reserved : u32 ,
89
89
}
90
90
91
91
impl MemoryArea {
92
92
/// Create a new MemoryArea.
93
- pub fn new ( base_addr : u64 , length : u64 , typ : MemoryAreaType ) -> Self {
93
+ pub fn new ( base_addr : u64 , length : u64 , typ : impl Into < MemoryAreaTypeId > ) -> Self {
94
94
Self {
95
95
base_addr,
96
96
length,
97
- typ,
97
+ typ : typ . into ( ) ,
98
98
_reserved : 0 ,
99
99
}
100
100
}
@@ -115,7 +115,7 @@ impl MemoryArea {
115
115
}
116
116
117
117
/// The type of the memory region.
118
- pub fn typ ( & self ) -> MemoryAreaType {
118
+ pub fn typ ( & self ) -> MemoryAreaTypeId {
119
119
self . typ
120
120
}
121
121
}
@@ -127,28 +127,100 @@ impl StructAsBytes for MemoryArea {
127
127
}
128
128
}
129
129
130
- /// An enum of possible reported region types.
131
- /// Inside the Multiboot2 spec this is kind of hidden
132
- /// inside the implementation of `struct multiboot_mmap_entry`.
130
+ /// ABI-friendly version of [`MemoryAreaType`].
131
+ #[ derive( Copy , Clone , PartialEq , Eq , PartialOrd , Ord , Hash ) ]
132
+ #[ repr( C ) ]
133
+ pub struct MemoryAreaTypeId ( u32 ) ;
134
+
135
+ impl From < u32 > for MemoryAreaTypeId {
136
+ fn from ( value : u32 ) -> Self {
137
+ Self ( value)
138
+ }
139
+ }
140
+
141
+ impl From < MemoryAreaTypeId > for u32 {
142
+ fn from ( value : MemoryAreaTypeId ) -> Self {
143
+ value. 0
144
+ }
145
+ }
146
+
147
+ impl Debug for MemoryAreaTypeId {
148
+ fn fmt ( & self , f : & mut Formatter < ' _ > ) -> core:: fmt:: Result {
149
+ let mt = MemoryAreaType :: from ( * self ) ;
150
+ Debug :: fmt ( & mt, f)
151
+ }
152
+ }
153
+
154
+ /// Abstraction over defined memory types for the memory map as well as custom
155
+ /// ones. Types 1 to 5 are defined in the Multiboot2 spec and correspond to the
156
+ /// entry types of e820 memory maps.
157
+ ///
158
+ /// This is not binary compatible with the Multiboot2 spec. Please use
159
+ /// [`MemoryAreaTypeId`] instead.
133
160
#[ derive( Copy , Clone , Debug , PartialEq , Eq , PartialOrd , Ord , Hash ) ]
134
- #[ repr( u32 ) ]
135
161
pub enum MemoryAreaType {
136
162
/// Available memory free to be used by the OS.
137
- Available = 1 ,
163
+ Available , /* 1 */
138
164
139
165
/// A reserved area that must not be used.
140
- Reserved = 2 ,
166
+ Reserved , /* 2, */
141
167
142
168
/// Usable memory holding ACPI information.
143
- AcpiAvailable = 3 ,
169
+ AcpiAvailable , /* 3, */
144
170
145
171
/// Reserved memory which needs to be preserved on hibernation.
146
172
/// Also called NVS in spec, which stands for "Non-Volatile Sleep/Storage",
147
173
/// which is part of ACPI specification.
148
- ReservedHibernate = 4 ,
174
+ ReservedHibernate , /* 4, */
149
175
150
176
/// Memory which is occupied by defective RAM modules.
151
- Defective = 5 ,
177
+ Defective , /* = 5, */
178
+
179
+ /// Custom memory map type.
180
+ Custom ( u32 ) ,
181
+ }
182
+
183
+ impl From < MemoryAreaTypeId > for MemoryAreaType {
184
+ fn from ( value : MemoryAreaTypeId ) -> Self {
185
+ match value. 0 {
186
+ 1 => Self :: Available ,
187
+ 2 => Self :: Reserved ,
188
+ 3 => Self :: AcpiAvailable ,
189
+ 4 => Self :: ReservedHibernate ,
190
+ 5 => Self :: Defective ,
191
+ val => Self :: Custom ( val) ,
192
+ }
193
+ }
194
+ }
195
+
196
+ impl From < MemoryAreaType > for MemoryAreaTypeId {
197
+ fn from ( value : MemoryAreaType ) -> Self {
198
+ let integer = match value {
199
+ MemoryAreaType :: Available => 1 ,
200
+ MemoryAreaType :: Reserved => 2 ,
201
+ MemoryAreaType :: AcpiAvailable => 3 ,
202
+ MemoryAreaType :: ReservedHibernate => 4 ,
203
+ MemoryAreaType :: Defective => 5 ,
204
+ MemoryAreaType :: Custom ( val) => val,
205
+ } ;
206
+ integer. into ( )
207
+ }
208
+ }
209
+
210
+ impl PartialEq < MemoryAreaType > for MemoryAreaTypeId {
211
+ fn eq ( & self , other : & MemoryAreaType ) -> bool {
212
+ let val: MemoryAreaTypeId = ( * other) . into ( ) ;
213
+ let val: u32 = val. 0 ;
214
+ self . 0 . eq ( & val)
215
+ }
216
+ }
217
+
218
+ impl PartialEq < MemoryAreaTypeId > for MemoryAreaType {
219
+ fn eq ( & self , other : & MemoryAreaTypeId ) -> bool {
220
+ let val: MemoryAreaTypeId = ( * self ) . into ( ) ;
221
+ let val: u32 = val. 0 ;
222
+ other. 0 . eq ( & val)
223
+ }
152
224
}
153
225
154
226
/// Basic memory info tag.
0 commit comments