@@ -204,20 +204,19 @@ where
204
204
. expect ( "no entry point" ) ;
205
205
log:: info!( "Entry point at: {:#x}" , entry_point. as_u64( ) ) ;
206
206
// create a stack
207
- let stack_start_addr = {
208
- let guard_page_start = mapping_addr (
207
+ let stack_start = {
208
+ // we need page-alignment because we want a guard page directly below the stack
209
+ let guard_page = mapping_addr_page_aligned (
209
210
config. mappings . kernel_stack ,
210
211
// allocate an additional page as a guard page
211
212
Size4KiB :: SIZE + config. kernel_stack_size ,
212
- // we need page-alignment because we want a guard page directly below the stack
213
- Size4KiB :: SIZE ,
214
213
& mut used_entries,
214
+ "kernel stack start" ,
215
215
) ;
216
- guard_page_start + Size4KiB :: SIZE
216
+ guard_page + 1
217
217
} ;
218
- let stack_end_addr = stack_start_addr + config. kernel_stack_size ;
218
+ let stack_end_addr = stack_start . start_address ( ) + config. kernel_stack_size ;
219
219
220
- let stack_start: Page = Page :: containing_address ( stack_start_addr) ;
221
220
let stack_end = Page :: containing_address ( stack_end_addr - 1u64 ) ;
222
221
for page in Page :: range_inclusive ( stack_start, stack_end) {
223
222
let frame = frame_allocator
@@ -266,13 +265,12 @@ where
266
265
let framebuffer_start_frame: PhysFrame = PhysFrame :: containing_address ( framebuffer. addr ) ;
267
266
let framebuffer_end_frame =
268
267
PhysFrame :: containing_address ( framebuffer. addr + framebuffer. info . byte_len - 1u64 ) ;
269
- let start_page = Page :: from_start_address ( mapping_addr (
268
+ let start_page = mapping_addr_page_aligned (
270
269
config. mappings . framebuffer ,
271
270
u64:: from_usize ( framebuffer. info . byte_len ) ,
272
- Size4KiB :: SIZE ,
273
271
& mut used_entries,
274
- ) )
275
- . expect ( "the framebuffer address must be page aligned" ) ;
272
+ "framebuffer" ,
273
+ ) ;
276
274
for ( i, frame) in
277
275
PhysFrame :: range_inclusive ( framebuffer_start_frame, framebuffer_end_frame) . enumerate ( )
278
276
{
@@ -293,19 +291,17 @@ where
293
291
} ;
294
292
let ramdisk_slice_len = system_info. ramdisk_len ;
295
293
let ramdisk_slice_start = if let Some ( ramdisk_address) = system_info. ramdisk_addr {
296
- let ramdisk_address_start = mapping_addr (
294
+ let start_page = mapping_addr_page_aligned (
297
295
config. mappings . ramdisk_memory ,
298
296
system_info. ramdisk_len ,
299
- Size4KiB :: SIZE ,
300
297
& mut used_entries,
298
+ "ramdisk start" ,
301
299
) ;
302
300
let physical_address = PhysAddr :: new ( ramdisk_address) ;
303
301
let ramdisk_physical_start_page: PhysFrame < Size4KiB > =
304
302
PhysFrame :: containing_address ( physical_address) ;
305
303
let ramdisk_page_count = ( system_info. ramdisk_len - 1 ) / Size4KiB :: SIZE ;
306
304
let ramdisk_physical_end_page = ramdisk_physical_start_page + ramdisk_page_count;
307
- let start_page = Page :: from_start_address ( ramdisk_address_start)
308
- . expect ( "the ramdisk start address must be page aligned" ) ;
309
305
310
306
let flags = PageTableFlags :: PRESENT | PageTableFlags :: WRITABLE ;
311
307
for ( i, frame) in
@@ -321,7 +317,7 @@ where
321
317
) ,
322
318
} ;
323
319
}
324
- Some ( ramdisk_address_start )
320
+ Some ( start_page . start_address ( ) )
325
321
} else {
326
322
None
327
323
} ;
@@ -335,7 +331,8 @@ where
335
331
336
332
let size = max_phys. as_u64 ( ) ;
337
333
let alignment = Size2MiB :: SIZE ;
338
- let offset = mapping_addr ( mapping, size, alignment, & mut used_entries) ;
334
+ let offset = mapping_addr ( mapping, size, alignment, & mut used_entries)
335
+ . expect ( "start addraess for physical memory mapping must be 2MiB-page-aligned" ) ;
339
336
340
337
for frame in PhysFrame :: range_inclusive ( start_frame, end_frame) {
341
338
let page = Page :: containing_address ( offset + frame. start_address ( ) . as_u64 ( ) ) ;
@@ -465,11 +462,8 @@ where
465
462
u64:: from_usize ( combined. size ( ) ) ,
466
463
u64:: from_usize ( combined. align ( ) ) ,
467
464
& mut mappings. used_entries ,
468
- ) ;
469
- assert ! (
470
- boot_info_addr. is_aligned( u64 :: from_usize( combined. align( ) ) ) ,
471
- "boot info addr is not properly aligned"
472
- ) ;
465
+ )
466
+ . expect ( "boot info addr is not properly aligned" ) ;
473
467
474
468
let memory_map_regions_addr = boot_info_addr + memory_regions_offset;
475
469
let memory_map_regions_end = boot_info_addr + combined. size ( ) ;
@@ -614,15 +608,32 @@ struct Addresses {
614
608
boot_info : & ' static mut BootInfo ,
615
609
}
616
610
611
+ fn mapping_addr_page_aligned (
612
+ mapping : Mapping ,
613
+ size : u64 ,
614
+ used_entries : & mut UsedLevel4Entries ,
615
+ kind : & str ,
616
+ ) -> Page {
617
+ match mapping_addr ( mapping, size, Size4KiB :: SIZE , used_entries) {
618
+ Ok ( addr) => Page :: from_start_address ( addr) . unwrap ( ) ,
619
+ Err ( addr) => panic ! ( "{kind} address must be page-aligned (is `{addr:?})`" ) ,
620
+ }
621
+ }
622
+
617
623
fn mapping_addr (
618
624
mapping : Mapping ,
619
625
size : u64 ,
620
626
alignment : u64 ,
621
627
used_entries : & mut UsedLevel4Entries ,
622
- ) -> VirtAddr {
623
- match mapping {
628
+ ) -> Result < VirtAddr , VirtAddr > {
629
+ let addr = match mapping {
624
630
Mapping :: FixedAddress ( addr) => VirtAddr :: new ( addr) ,
625
631
Mapping :: Dynamic => used_entries. get_free_address ( size, alignment) ,
632
+ } ;
633
+ if addr. is_aligned ( alignment) {
634
+ Ok ( addr)
635
+ } else {
636
+ Err ( addr)
626
637
}
627
638
}
628
639
0 commit comments