1
1
use core:: marker:: PhantomData ;
2
+ use crate :: TagType ;
2
3
3
4
/// This Tag provides an initial host memory map.
4
5
///
@@ -13,7 +14,7 @@ use core::marker::PhantomData;
13
14
#[ derive( Debug ) ]
14
15
#[ repr( C ) ]
15
16
pub struct MemoryMapTag {
16
- typ : u32 ,
17
+ typ : TagType ,
17
18
size : u32 ,
18
19
entry_size : u32 ,
19
20
entry_version : u32 ,
@@ -23,7 +24,7 @@ pub struct MemoryMapTag {
23
24
impl MemoryMapTag {
24
25
/// Return an iterator over all AVAILABLE marked memory areas.
25
26
pub fn memory_areas ( & self ) -> impl Iterator < Item = & MemoryArea > {
26
- self . all_memory_areas ( ) . filter ( |entry| entry. typ == 1 )
27
+ self . all_memory_areas ( ) . filter ( |entry| matches ! ( entry. typ, MemoryAreaType :: Available ) )
27
28
}
28
29
29
30
/// Return an iterator over all marked memory areas.
@@ -45,7 +46,7 @@ impl MemoryMapTag {
45
46
pub struct MemoryArea {
46
47
base_addr : u64 ,
47
48
length : u64 ,
48
- typ : u32 ,
49
+ typ : MemoryAreaType ,
49
50
_reserved : u32 ,
50
51
}
51
52
@@ -67,33 +68,32 @@ impl MemoryArea {
67
68
68
69
/// The type of the memory region.
69
70
pub fn typ ( & self ) -> MemoryAreaType {
70
- match self . typ {
71
- 1 => MemoryAreaType :: Available ,
72
- 3 => MemoryAreaType :: AcpiAvailable ,
73
- 4 => MemoryAreaType :: ReservedHibernate ,
74
- 5 => MemoryAreaType :: Defective ,
75
- _ => MemoryAreaType :: Reserved ,
76
- }
71
+ self . typ
77
72
}
78
73
}
79
74
80
75
/// An enum of possible reported region types.
81
- #[ derive( Debug , PartialEq , Eq ) ]
76
+ /// Inside the Multiboot2 spec this is kind of hidden
77
+ /// inside the implementation of `struct multiboot_mmap_entry`.
78
+ #[ derive( Debug , PartialEq , Eq , Copy , Clone ) ]
79
+ #[ repr( u32 ) ]
82
80
pub enum MemoryAreaType {
83
- /// A reserved area that must not be used.
84
- Reserved ,
85
-
86
81
/// Available memory free to be used by the OS.
87
- Available ,
82
+ Available = 1 ,
83
+
84
+ /// A reserved area that must not be used.
85
+ Reserved = 2 ,
88
86
89
87
/// Usable memory holding ACPI information.
90
- AcpiAvailable ,
88
+ AcpiAvailable = 3 ,
91
89
92
90
/// Reserved memory which needs to be preserved on hibernation.
93
- ReservedHibernate ,
91
+ /// Also called NVS in spec, which stands for "Non-Volatile Sleep/Storage",
92
+ /// which is part of ACPI specification.
93
+ ReservedHibernate = 4 ,
94
94
95
95
/// Memory which is occupied by defective RAM modules.
96
- Defective ,
96
+ Defective = 5 ,
97
97
}
98
98
99
99
/// An iterator over all memory areas
@@ -122,7 +122,7 @@ impl<'a> Iterator for MemoryAreaIter<'a> {
122
122
#[ derive( Debug ) ]
123
123
#[ repr( C ) ]
124
124
pub struct EFIMemoryMapTag {
125
- typ : u32 ,
125
+ typ : TagType ,
126
126
size : u32 ,
127
127
desc_size : u32 ,
128
128
desc_version : u32 ,
0 commit comments