11use crate :: { Tag , TagTrait , TagType , TagTypeId } ;
22use core:: convert:: TryInto ;
3- use core:: fmt:: Debug ;
3+ use core:: fmt:: { Debug , Formatter } ;
44use core:: marker:: PhantomData ;
55use core:: mem;
66
@@ -84,17 +84,17 @@ impl StructAsBytes for MemoryMapTag {
8484pub struct MemoryArea {
8585 base_addr : u64 ,
8686 length : u64 ,
87- typ : MemoryAreaType ,
87+ typ : MemoryAreaTypeId ,
8888 _reserved : u32 ,
8989}
9090
9191impl MemoryArea {
9292 /// 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 {
9494 Self {
9595 base_addr,
9696 length,
97- typ,
97+ typ : typ . into ( ) ,
9898 _reserved : 0 ,
9999 }
100100 }
@@ -115,7 +115,7 @@ impl MemoryArea {
115115 }
116116
117117 /// The type of the memory region.
118- pub fn typ ( & self ) -> MemoryAreaType {
118+ pub fn typ ( & self ) -> MemoryAreaTypeId {
119119 self . typ
120120 }
121121}
@@ -127,28 +127,100 @@ impl StructAsBytes for MemoryArea {
127127 }
128128}
129129
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.
133160#[ derive( Copy , Clone , Debug , PartialEq , Eq , PartialOrd , Ord , Hash ) ]
134- #[ repr( u32 ) ]
135161pub enum MemoryAreaType {
136162 /// Available memory free to be used by the OS.
137- Available = 1 ,
163+ Available , /* 1 */
138164
139165 /// A reserved area that must not be used.
140- Reserved = 2 ,
166+ Reserved , /* 2, */
141167
142168 /// Usable memory holding ACPI information.
143- AcpiAvailable = 3 ,
169+ AcpiAvailable , /* 3, */
144170
145171 /// Reserved memory which needs to be preserved on hibernation.
146172 /// Also called NVS in spec, which stands for "Non-Volatile Sleep/Storage",
147173 /// which is part of ACPI specification.
148- ReservedHibernate = 4 ,
174+ ReservedHibernate , /* 4, */
149175
150176 /// 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+ }
152224}
153225
154226/// Basic memory info tag.
0 commit comments