1
- use crate :: memory_map:: MemoryRegion ;
1
+ use crate :: memory_map:: { MemoryRegion , MemoryRegionKind } ;
2
2
use core:: mem:: MaybeUninit ;
3
3
use x86_64:: {
4
4
structures:: paging:: { FrameAllocator , PhysFrame , Size4KiB } ,
@@ -8,7 +8,7 @@ use x86_64::{
8
8
pub trait LegacyMemoryRegion : Copy + core:: fmt:: Debug {
9
9
fn start ( & self ) -> PhysAddr ;
10
10
fn len ( & self ) -> u64 ;
11
- fn usable ( & self ) -> bool ;
11
+ fn kind ( & self ) -> MemoryRegionKind ;
12
12
13
13
fn set_start ( & mut self , new_start : PhysAddr ) ;
14
14
}
@@ -76,34 +76,47 @@ where
76
76
self ,
77
77
regions : & mut [ MaybeUninit < MemoryRegion > ] ,
78
78
) -> & mut [ MemoryRegion ] {
79
- use crate :: memory_map:: MemoryRegionKind ;
80
-
81
79
let mut next_index = 0 ;
82
80
83
81
for mut descriptor in self . original {
84
82
let end = descriptor. start ( ) + descriptor. len ( ) ;
85
83
let next_free = self . next_frame . start_address ( ) ;
86
- let kind = if descriptor. usable ( ) {
87
- if end <= next_free {
88
- MemoryRegionKind :: Bootloader
89
- } else if descriptor. start ( ) >= next_free {
90
- MemoryRegionKind :: Usable
91
- } else {
92
- // part of the region is used -> add is separately
93
- let used_region = MemoryRegion {
94
- start : descriptor. start ( ) . as_u64 ( ) ,
95
- end : next_free. as_u64 ( ) ,
96
- kind : MemoryRegionKind :: Bootloader ,
97
- } ;
98
- Self :: add_region ( used_region, regions, & mut next_index)
99
- . expect ( "Failed to add memory region" ) ;
100
-
101
- // add unused part normally
102
- descriptor. set_start ( next_free) ;
103
- MemoryRegionKind :: Usable
84
+ let kind = match descriptor. kind ( ) {
85
+ MemoryRegionKind :: Usable => {
86
+ if end <= next_free {
87
+ MemoryRegionKind :: Bootloader
88
+ } else if descriptor. start ( ) >= next_free {
89
+ MemoryRegionKind :: Usable
90
+ } else {
91
+ // part of the region is used -> add is separately
92
+ let used_region = MemoryRegion {
93
+ start : descriptor. start ( ) . as_u64 ( ) ,
94
+ end : next_free. as_u64 ( ) ,
95
+ kind : MemoryRegionKind :: Bootloader ,
96
+ } ;
97
+ Self :: add_region ( used_region, regions, & mut next_index)
98
+ . expect ( "Failed to add memory region" ) ;
99
+
100
+ // add unused part normally
101
+ descriptor. set_start ( next_free) ;
102
+ MemoryRegionKind :: Usable
103
+ }
104
+ }
105
+ // some mappings created by the UEFI firmware become usable again at this point
106
+ #[ cfg( feature = "uefi_bin" ) ]
107
+ MemoryRegionKind :: UnknownUefi ( other) => {
108
+ use uefi:: table:: boot:: MemoryType as M ;
109
+ match M :: custom ( other) {
110
+ M :: LOADER_CODE
111
+ | M :: LOADER_DATA
112
+ | M :: BOOT_SERVICES_CODE
113
+ | M :: BOOT_SERVICES_DATA
114
+ | M :: RUNTIME_SERVICES_CODE
115
+ | M :: RUNTIME_SERVICES_DATA => MemoryRegionKind :: Usable ,
116
+ other => MemoryRegionKind :: UnknownUefi ( other. 0 ) ,
117
+ }
104
118
}
105
- } else {
106
- MemoryRegionKind :: Reserved // FIXME more types
119
+ other => other,
107
120
} ;
108
121
109
122
let region = MemoryRegion {
@@ -152,7 +165,7 @@ where
152
165
153
166
// find next suitable descriptor
154
167
while let Some ( descriptor) = self . memory_map . next ( ) {
155
- if ! descriptor. usable ( ) {
168
+ if descriptor. kind ( ) != MemoryRegionKind :: Usable {
156
169
continue ;
157
170
}
158
171
if let Some ( frame) = self . allocate_frame_from_descriptor ( descriptor) {
0 commit comments