Skip to content

Commit c73786d

Browse files
authored
Merge pull request #328 from Stary2001/fix-stage2
Correctness fixes for stage2
2 parents 0f6453c + 04b6e14 commit c73786d

File tree

2 files changed

+7
-3
lines changed

2 files changed

+7
-3
lines changed

bios/stage-2/src/main.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,11 @@ pub extern "C" fn _start(disk_number: u16, partition_table_start: *const u8) ->
3939
}
4040

4141
fn start(disk_number: u16, partition_table_start: *const u8) -> ! {
42-
screen::Writer.write_str(" -> SECOND STAGE\n").unwrap();
43-
42+
// Enter unreal mode before doing anything else.
4443
enter_unreal_mode();
4544

45+
screen::Writer.write_str(" -> SECOND STAGE\n").unwrap();
46+
4647
// parse partition table
4748
let partitions = {
4849
const MAX_ENTRIES: usize = 4;

bios/stage-2/src/protected_mode.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,10 @@ unsafe impl Sync for GdtPointer {}
5959

6060
pub fn enter_unreal_mode() {
6161
let ds: u16;
62+
let ss: u16;
6263
unsafe {
6364
asm!("mov {0:x}, ds", out(reg) ds, options(nomem, nostack, preserves_flags));
65+
asm!("mov {0:x}, ss", out(reg) ss, options(nomem, nostack, preserves_flags));
6466
}
6567

6668
GDT.clear_interrupts_and_load();
@@ -70,14 +72,15 @@ pub fn enter_unreal_mode() {
7072

7173
// load GDT
7274
unsafe {
73-
asm!("mov {0}, 0x10", "mov ds, {0}", out(reg) _);
75+
asm!("mov {0}, 0x10", "mov ds, {0}", "mov ss, {0}", out(reg) _);
7476
}
7577

7678
// unset protected mode bit again
7779
write_cr0(cr0);
7880

7981
unsafe {
8082
asm!("mov ds, {0:x}", in(reg) ds, options(nostack, preserves_flags));
83+
asm!("mov ss, {0:x}", in(reg) ss, options(nostack, preserves_flags));
8184
asm!("sti");
8285
}
8386
}

0 commit comments

Comments
 (0)