@@ -169,7 +169,8 @@ fn bootloader_main(
169169 enable_nxe_bit ( ) ;
170170
171171 // 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 ( ) ) ;
173174 let mut entry = PageTableEntry :: new ( ) ;
174175 entry. set_addr (
175176 p4_physical,
@@ -243,7 +244,7 @@ fn bootloader_main(
243244 let page: Page = match BOOT_INFO_ADDRESS {
244245 Some ( addr) => Page :: containing_address ( VirtAddr :: new ( addr) ) ,
245246 None => Page :: from_page_table_indices (
246- level4_entries. get_free_entry ( ) ,
247+ level4_entries. get_free_entries ( 1 ) ,
247248 PageTableIndex :: new ( 0 ) ,
248249 PageTableIndex :: new ( 0 ) ,
249250 PageTableIndex :: new ( 0 ) ,
@@ -286,11 +287,10 @@ fn bootloader_main(
286287
287288 let physical_memory_offset = if cfg ! ( feature = "map_physical_memory" ) {
288289 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 ;
292292 Page :: from_page_table_indices_1gib (
293- level4_entries. get_free_entry ( ) ,
293+ level4_entries. get_free_entries ( level_4_entries ) ,
294294 PageTableIndex :: new ( 0 ) ,
295295 )
296296 . start_address ( )
0 commit comments