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