@@ -122,6 +122,7 @@ where
122
122
& mut page_tables,
123
123
system_info. framebuffer . as_ref ( ) ,
124
124
& config,
125
+ & system_info
125
126
) ;
126
127
let boot_info = create_boot_info (
127
128
& config,
@@ -153,6 +154,7 @@ pub fn set_up_mappings<I, D>(
153
154
page_tables : & mut PageTables ,
154
155
framebuffer : Option < & RawFrameBufferInfo > ,
155
156
config : & BootloaderConfig ,
157
+ system_info : & SystemInfo
156
158
) -> Mappings
157
159
where
158
160
I : ExactSizeIterator < Item = D > + Clone ,
@@ -184,7 +186,6 @@ where
184
186
)
185
187
. expect ( "no entry point" ) ;
186
188
log:: info!( "Entry point at: {:#x}" , entry_point. as_u64( ) ) ;
187
-
188
189
// create a stack
189
190
let stack_start_addr = mapping_addr (
190
191
config. mappings . kernel_stack ,
@@ -269,6 +270,36 @@ where
269
270
} else {
270
271
None
271
272
} ;
273
+ let ramdisk_slice_len = system_info. ramdisk_len ;
274
+ let ramdisk_slice_start = if let Some ( ramdisk_address) = system_info. ramdisk_addr {
275
+
276
+ let ramdisk_address_start = mapping_addr (
277
+ config. mappings . ramdisk_memory ,
278
+ system_info. ramdisk_len ,
279
+ 8 ,
280
+ & mut used_entries
281
+ ) ;
282
+ let physical_address = PhysAddr :: new ( ramdisk_address) ;
283
+ let ramdisk_physical_start_page: PhysFrame < Size4KiB > = PhysFrame :: containing_address ( physical_address) ;
284
+ let ramdisk_page_count = ( system_info. ramdisk_len - 1 / Size4KiB :: SIZE ) + 1 ;
285
+ let ramdisk_physical_end_page = ramdisk_physical_start_page + ramdisk_page_count;
286
+ let start_page = Page :: containing_address ( ramdisk_address_start) ;
287
+
288
+ let flags = PageTableFlags :: PRESENT | PageTableFlags :: WRITABLE ;
289
+ for ( i, frame) in PhysFrame :: range_inclusive ( ramdisk_physical_start_page, ramdisk_physical_end_page) . enumerate ( ) {
290
+ let page = start_page + i as u64 ;
291
+ match unsafe { kernel_page_table. map_to ( page, frame, flags, frame_allocator) } {
292
+ Ok ( tlb) => tlb. ignore ( ) ,
293
+ Err ( err) => panic ! (
294
+ "Failed to map page {:?} to frame {:?}: {:?}" ,
295
+ page, frame, err
296
+ ) ,
297
+ } ;
298
+ }
299
+ Some ( ramdisk_address_start)
300
+ } else {
301
+ None
302
+ } ;
272
303
273
304
let physical_memory_offset = if let Some ( mapping) = config. mappings . physical_memory {
274
305
log:: info!( "Map physical memory" ) ;
@@ -343,6 +374,8 @@ where
343
374
344
375
kernel_slice_start,
345
376
kernel_slice_len,
377
+ ramdisk_slice_start,
378
+ ramdisk_slice_len
346
379
}
347
380
}
348
381
@@ -368,6 +401,8 @@ pub struct Mappings {
368
401
pub kernel_slice_start : u64 ,
369
402
/// Size of the kernel slice allocation in memory.
370
403
pub kernel_slice_len : u64 ,
404
+ pub ramdisk_slice_start : Option < VirtAddr > ,
405
+ pub ramdisk_slice_len : u64
371
406
}
372
407
373
408
/// Allocates and initializes the boot info struct and the memory map.
@@ -477,8 +512,8 @@ where
477
512
info. recursive_index = mappings. recursive_index . map ( Into :: into) . into ( ) ;
478
513
info. rsdp_addr = system_info. rsdp_addr . map ( |addr| addr. as_u64 ( ) ) . into ( ) ;
479
514
info. tls_template = mappings. tls_template . into ( ) ;
480
- info. ramdisk_addr = system_info . ramdisk_addr . into ( ) ;
481
- info. ramdisk_len = system_info . ramdisk_len ;
515
+ info. ramdisk_addr = mappings . ramdisk_slice_start . map ( |addr| addr . as_u64 ( ) ) . into ( ) ;
516
+ info. ramdisk_len = mappings . ramdisk_slice_len ;
482
517
info
483
518
} ) ;
484
519
0 commit comments