Skip to content

Commit e9d5eae

Browse files
committed
Load ramdisk starting at the page following the kernel when booting via bios
1 parent 89415ab commit e9d5eae

File tree

1 file changed

+5
-4
lines changed

1 file changed

+5
-4
lines changed

bios/stage-2/src/main.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ const BOOTLOADER_SECOND_STAGE_PARTITION_TYPE: u8 = 0x20;
2727
const STAGE_3_DST: *mut u8 = 0x0010_0000 as *mut u8; // 1MiB (typically 14MiB accessible here)
2828
const STAGE_4_DST: *mut u8 = 0x0020_0000 as *mut u8; // 2MiB (typically still 13MiB accessible here)
2929
const KERNEL_DST: *mut u8 = 0x0100_0000 as *mut u8; // 16MiB
30-
const RAMDISK_DST: *mut u8 = 0x0400_0000 as *mut u8; // 64MiB
3130

3231
static mut DISK_BUFFER: AlignedArrayBuffer<0x4000> = AlignedArrayBuffer {
3332
buffer: [0; 0x4000],
@@ -99,16 +98,18 @@ fn start(disk_number: u16, partition_table_start: *const u8) -> ! {
9998
writeln!(screen::Writer, "loading kernel...").unwrap();
10099
let kernel_len = load_file("kernel-x86_64", KERNEL_DST, &mut fs, &mut disk, disk_buffer);
101100
writeln!(screen::Writer, "kernel loaded at {KERNEL_DST:#p}").unwrap();
101+
let kernel_page_size = (((kernel_len - 1) / 4096) + 1) as usize;
102+
let ramdisk_start = KERNEL_DST.wrapping_add(kernel_page_size * 4096);
102103
writeln!(screen::Writer, "Loading ramdisk...").unwrap();
103-
let ramdisk_len = match try_load_file("ramdisk", RAMDISK_DST, &mut fs, &mut disk, disk_buffer) {
104+
let ramdisk_len = match try_load_file("ramdisk", KERNEL_DST.wrapping_add(kernel_page_size * 4096), &mut fs, &mut disk, disk_buffer) {
104105
Some(s) => s,
105106
None => 0u64,
106107
};
107108

108109
if ramdisk_len == 0 {
109110
writeln!(screen::Writer, "No ramdisk found, skipping.").unwrap();
110111
} else {
111-
writeln!(screen::Writer, "Loaded ramdisk at {RAMDISK_DST:#p}").unwrap();
112+
writeln!(screen::Writer, "Loaded ramdisk at {ramdisk_start:#p}").unwrap();
112113
}
113114

114115
let memory_map = unsafe { memory_map::query_memory_map() }.unwrap();
@@ -142,7 +143,7 @@ fn start(disk_number: u16, partition_table_start: *const u8) -> ! {
142143
len: kernel_len,
143144
},
144145
ramdisk: Region {
145-
start: RAMDISK_DST as u64,
146+
start: ramdisk_start as u64,
146147
len: ramdisk_len,
147148
},
148149
memory_map_addr: memory_map.as_mut_ptr() as u32,

0 commit comments

Comments
 (0)