@@ -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,93 @@ 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 , Debug , 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
+ /// Abstraction over defined memory types for the memory map as well as custom
148
+ /// ones. Types 1 to 5 are defined in the Multiboot2 spec and correspond to the
149
+ /// entry types of e820 memory maps.
150
+ ///
151
+ /// This is not binary compatible with the Multiboot2 spec. Please use
152
+ /// [`MemoryAreaTypeId`] instead.
133
153
#[ derive( Copy , Clone , Debug , PartialEq , Eq , PartialOrd , Ord , Hash ) ]
134
- #[ repr( u32 ) ]
135
154
pub enum MemoryAreaType {
136
155
/// Available memory free to be used by the OS.
137
- Available = 1 ,
156
+ Available , /* 1 */
138
157
139
158
/// A reserved area that must not be used.
140
- Reserved = 2 ,
159
+ Reserved , /* 2, */
141
160
142
161
/// Usable memory holding ACPI information.
143
- AcpiAvailable = 3 ,
162
+ AcpiAvailable , /* 3, */
144
163
145
164
/// Reserved memory which needs to be preserved on hibernation.
146
165
/// Also called NVS in spec, which stands for "Non-Volatile Sleep/Storage",
147
166
/// which is part of ACPI specification.
148
- ReservedHibernate = 4 ,
167
+ ReservedHibernate , /* 4, */
149
168
150
169
/// Memory which is occupied by defective RAM modules.
151
- Defective = 5 ,
170
+ Defective , /* = 5, */
171
+
172
+ /// Custom memory map type.
173
+ Custom ( u32 ) ,
174
+ }
175
+
176
+ impl From < MemoryAreaTypeId > for MemoryAreaType {
177
+ fn from ( value : MemoryAreaTypeId ) -> Self {
178
+ match value. 0 {
179
+ 1 => Self :: Available ,
180
+ 2 => Self :: Reserved ,
181
+ 3 => Self :: AcpiAvailable ,
182
+ 4 => Self :: ReservedHibernate ,
183
+ 5 => Self :: Defective ,
184
+ val => Self :: Custom ( val) ,
185
+ }
186
+ }
187
+ }
188
+
189
+ impl From < MemoryAreaType > for MemoryAreaTypeId {
190
+ fn from ( value : MemoryAreaType ) -> Self {
191
+ let integer = match value {
192
+ MemoryAreaType :: Available => 1 ,
193
+ MemoryAreaType :: Reserved => 2 ,
194
+ MemoryAreaType :: AcpiAvailable => 3 ,
195
+ MemoryAreaType :: ReservedHibernate => 4 ,
196
+ MemoryAreaType :: Defective => 5 ,
197
+ MemoryAreaType :: Custom ( val) => val,
198
+ } ;
199
+ integer. into ( )
200
+ }
201
+ }
202
+
203
+ impl PartialEq < MemoryAreaType > for MemoryAreaTypeId {
204
+ fn eq ( & self , other : & MemoryAreaType ) -> bool {
205
+ let val: MemoryAreaTypeId = ( * other) . into ( ) ;
206
+ let val: u32 = val. 0 ;
207
+ self . 0 . eq ( & val)
208
+ }
209
+ }
210
+
211
+ impl PartialEq < MemoryAreaTypeId > for MemoryAreaType {
212
+ fn eq ( & self , other : & MemoryAreaTypeId ) -> bool {
213
+ let val: MemoryAreaTypeId = ( * self ) . into ( ) ;
214
+ let val: u32 = val. 0 ;
215
+ other. 0 . eq ( & val)
216
+ }
152
217
}
153
218
154
219
/// Basic memory info tag.
0 commit comments