@@ -169,7 +169,8 @@ fn bootloader_main(
169
169
enable_nxe_bit ( ) ;
170
170
171
171
// Create a recursive page table entry
172
- let recursive_index = PageTableIndex :: new ( level4_entries. get_free_entry ( ) . try_into ( ) . unwrap ( ) ) ;
172
+ let recursive_index =
173
+ PageTableIndex :: new ( level4_entries. get_free_entries ( 1 ) . try_into ( ) . unwrap ( ) ) ;
173
174
let mut entry = PageTableEntry :: new ( ) ;
174
175
entry. set_addr (
175
176
p4_physical,
@@ -243,7 +244,7 @@ fn bootloader_main(
243
244
let page: Page = match BOOT_INFO_ADDRESS {
244
245
Some ( addr) => Page :: containing_address ( VirtAddr :: new ( addr) ) ,
245
246
None => Page :: from_page_table_indices (
246
- level4_entries. get_free_entry ( ) ,
247
+ level4_entries. get_free_entries ( 1 ) ,
247
248
PageTableIndex :: new ( 0 ) ,
248
249
PageTableIndex :: new ( 0 ) ,
249
250
PageTableIndex :: new ( 0 ) ,
@@ -286,11 +287,10 @@ fn bootloader_main(
286
287
287
288
let physical_memory_offset = if cfg ! ( feature = "map_physical_memory" ) {
288
289
let physical_memory_offset = PHYSICAL_MEMORY_OFFSET . unwrap_or_else ( || {
289
- // If offset not manually provided, find a free p4 entry and map memory here.
290
- // One level 4 entry spans 2^48/512 bytes (over 500gib) so this should suffice.
291
- assert ! ( max_phys_addr < ( 1 << 48 ) / 512 ) ;
290
+ const LEVEL_4_SIZE : u64 = 4096 * 512 * 512 * 512 ;
291
+ let level_4_entries = ( max_phys_addr + ( LEVEL_4_SIZE - 1 ) ) / LEVEL_4_SIZE ;
292
292
Page :: from_page_table_indices_1gib (
293
- level4_entries. get_free_entry ( ) ,
293
+ level4_entries. get_free_entries ( level_4_entries ) ,
294
294
PageTableIndex :: new ( 0 ) ,
295
295
)
296
296
. start_address ( )
0 commit comments