Skip to content

Commit 9716a32

Browse files
committed
Make disk_buffer placed on stack.
1 parent a63b0c2 commit 9716a32

2 files changed

Lines changed: 40 additions & 17 deletions

File tree

bios/stage-2/src/main.rs

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,7 @@ const STAGE_4_DST: *mut u8 = 0x0013_0000 as *mut u8;
3131
// 16MiB
3232
const KERNEL_DST: *mut u8 = 0x0100_0000 as *mut u8;
3333

34-
static mut DISK_BUFFER: AlignedArrayBuffer<0x4000> = AlignedArrayBuffer {
35-
buffer: [0; 0x4000],
36-
};
34+
const BUF_LEN: usize = 0x4000;
3735

3836
#[unsafe(no_mangle)]
3937
#[unsafe(link_section = ".start")]
@@ -88,27 +86,52 @@ fn start(disk_number: u16, partition_table_start: *const u8) -> ! {
8886

8987
let mut fs = fat::FileSystem::parse(disk.clone());
9088

91-
#[allow(static_mut_refs)]
92-
let disk_buffer = unsafe { &mut DISK_BUFFER };
89+
let mut disk_buffer = AlignedArrayBuffer {
90+
buffer: [0; BUF_LEN],
91+
};
9392

94-
let stage_3_len = load_file("boot-stage-3", STAGE_3_DST, &mut fs, &mut disk, disk_buffer);
93+
let stage_3_len = load_file(
94+
"boot-stage-3",
95+
STAGE_3_DST,
96+
&mut fs,
97+
&mut disk,
98+
&mut disk_buffer,
99+
);
95100
writeln!(screen::Writer, "stage 3 loaded at {STAGE_3_DST:#p}").unwrap();
96101
let stage_4_dst = {
97102
let stage_3_end = STAGE_3_DST.wrapping_add(usize::try_from(stage_3_len).unwrap());
98-
assert!(STAGE_4_DST > stage_3_end);
103+
assert!(STAGE_4_DST >= stage_3_end);
99104
STAGE_4_DST
100105
};
101-
let stage_4_len = load_file("boot-stage-4", stage_4_dst, &mut fs, &mut disk, disk_buffer);
106+
let stage_4_len = load_file(
107+
"boot-stage-4",
108+
stage_4_dst,
109+
&mut fs,
110+
&mut disk,
111+
&mut disk_buffer,
112+
);
102113
writeln!(screen::Writer, "stage 4 loaded at {stage_4_dst:#p}").unwrap();
103114

104115
writeln!(screen::Writer, "loading kernel...").unwrap();
105-
let kernel_len = load_file("kernel-x86_64", KERNEL_DST, &mut fs, &mut disk, disk_buffer);
116+
let kernel_len = load_file(
117+
"kernel-x86_64",
118+
KERNEL_DST,
119+
&mut fs,
120+
&mut disk,
121+
&mut disk_buffer,
122+
);
106123
writeln!(screen::Writer, "kernel loaded at {KERNEL_DST:#p}").unwrap();
107124
let kernel_page_size = (((kernel_len - 1) / 4096) + 1) as usize;
108125
let ramdisk_start = KERNEL_DST.wrapping_add(kernel_page_size * 4096);
109126
writeln!(screen::Writer, "Loading ramdisk...").unwrap();
110-
let ramdisk_len =
111-
try_load_file("ramdisk", ramdisk_start, &mut fs, &mut disk, disk_buffer).unwrap_or(0u64);
127+
let ramdisk_len = try_load_file(
128+
"ramdisk",
129+
ramdisk_start,
130+
&mut fs,
131+
&mut disk,
132+
&mut disk_buffer,
133+
)
134+
.unwrap_or(0u64);
112135

113136
if ramdisk_len == 0 {
114137
writeln!(screen::Writer, "No ramdisk found, skipping.").unwrap();
@@ -121,7 +144,7 @@ fn start(disk_number: u16, partition_table_start: *const u8) -> ! {
121144
config_file_start,
122145
&mut fs,
123146
&mut disk,
124-
disk_buffer,
147+
&mut disk_buffer,
125148
)
126149
.unwrap_or(0);
127150

@@ -132,7 +155,7 @@ fn start(disk_number: u16, partition_table_start: *const u8) -> ! {
132155
let max_width = 1280;
133156
let max_height = 720;
134157

135-
let mut vesa_info = vesa::VesaInfo::query(disk_buffer).unwrap();
158+
let mut vesa_info = vesa::VesaInfo::query(&mut disk_buffer).unwrap();
136159
let vesa_mode = vesa_info
137160
.get_best_mode(max_width, max_height)
138161
.unwrap()
@@ -191,7 +214,7 @@ fn try_load_file(
191214
dst: *mut u8,
192215
fs: &mut fat::FileSystem<disk::DiskAccess>,
193216
disk: &mut disk::DiskAccess,
194-
disk_buffer: &mut AlignedArrayBuffer<16384>,
217+
disk_buffer: &mut AlignedArrayBuffer<BUF_LEN>,
195218
) -> Option<u64> {
196219
let disk_buffer_size = disk_buffer.buffer.len();
197220
let file = fs.find_file_in_root_dir(file_name, disk_buffer)?;
@@ -244,7 +267,7 @@ fn load_file(
244267
dst: *mut u8,
245268
fs: &mut fat::FileSystem<disk::DiskAccess>,
246269
disk: &mut disk::DiskAccess,
247-
disk_buffer: &mut AlignedArrayBuffer<16384>,
270+
disk_buffer: &mut AlignedArrayBuffer<BUF_LEN>,
248271
) -> u64 {
249272
try_load_file(file_name, dst, fs, disk, disk_buffer).expect("file not found")
250273
}

bios/stage-3/src/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ pub fn enter_long_mode_and_jump_to_stage_4(info: &mut BiosInfo) {
3434
let _ = writeln!(Writer, "Paging init done, jumping to stage 4");
3535
unsafe {
3636
asm!(
37-
// align the stack
38-
"and esp, 0xffffff00",
37+
// Move the stack to new base address to make space for stage 4 and the kernel.
38+
"mov esp, 0x00080000",
3939
// push arguments (extended to 64 bit)
4040
"push 0",
4141
"push {info:e}",

0 commit comments

Comments
 (0)