diff --git a/bios/stage-2/src/main.rs b/bios/stage-2/src/main.rs index d8335e14..1fecd0d8 100644 --- a/bios/stage-2/src/main.rs +++ b/bios/stage-2/src/main.rs @@ -39,10 +39,11 @@ pub extern "C" fn _start(disk_number: u16, partition_table_start: *const u8) -> } fn start(disk_number: u16, partition_table_start: *const u8) -> ! { - screen::Writer.write_str(" -> SECOND STAGE\n").unwrap(); - + // Enter unreal mode before doing anything else. enter_unreal_mode(); + screen::Writer.write_str(" -> SECOND STAGE\n").unwrap(); + // parse partition table let partitions = { const MAX_ENTRIES: usize = 4; diff --git a/bios/stage-2/src/protected_mode.rs b/bios/stage-2/src/protected_mode.rs index e1fe5780..2b70182a 100644 --- a/bios/stage-2/src/protected_mode.rs +++ b/bios/stage-2/src/protected_mode.rs @@ -59,8 +59,10 @@ unsafe impl Sync for GdtPointer {} pub fn enter_unreal_mode() { let ds: u16; + let ss: u16; unsafe { asm!("mov {0:x}, ds", out(reg) ds, options(nomem, nostack, preserves_flags)); + asm!("mov {0:x}, ss", out(reg) ss, options(nomem, nostack, preserves_flags)); } GDT.clear_interrupts_and_load(); @@ -70,7 +72,7 @@ pub fn enter_unreal_mode() { // load GDT unsafe { - asm!("mov {0}, 0x10", "mov ds, {0}", out(reg) _); + asm!("mov {0}, 0x10", "mov ds, {0}", "mov ss, {0}", out(reg) _); } // unset protected mode bit again @@ -78,6 +80,7 @@ pub fn enter_unreal_mode() { unsafe { asm!("mov ds, {0:x}", in(reg) ds, options(nostack, preserves_flags)); + asm!("mov ss, {0:x}", in(reg) ss, options(nostack, preserves_flags)); asm!("sti"); } }