diff --git a/asm/x86-unknown-none/thunk.asm b/asm/x86-unknown-none/thunk.asm index 16a3597aab79f14b525c831234ac7112065c15f7..4423132ee227277b8eadedaa628126012e85f4f0 100644 --- a/asm/x86-unknown-none/thunk.asm +++ b/asm/x86-unknown-none/thunk.asm @@ -107,10 +107,17 @@ USE16 mov ss, eax ; set stack - mov esp, 0x7C00 - 16 - - ; load registers - popad + mov esp, 0x7C00 - 64 + + ; load registers and ES + pop es + pop edi + pop esi + pop ebp + pop ebx + pop edx + pop ecx + pop eax ; enable interrupts sti @@ -121,8 +128,15 @@ USE16 ; disable interrupts cli - ; save registers - pushad + ; save registers and ES + push eax + push ecx + push edx + push ebx + push ebp + push esi + push edi + push es ; load gdt (BIOS sometimes overwrites this) lgdt [gdtr] diff --git a/src/os/bios/thunk.rs b/src/os/bios/thunk.rs index 8fa4125a9dd80d44902c3b5127fc8f1ac87ff578..118f8f84332f628c7df28432566fd7c4c4e4dc47 100644 --- a/src/os/bios/thunk.rs +++ b/src/os/bios/thunk.rs @@ -3,13 +3,13 @@ use core::ptr; use super::THUNK_STACK_ADDR; #[allow(dead_code)] -#[derive(Clone, Copy)] +#[derive(Clone, Copy, Debug)] #[repr(packed)] pub struct ThunkData { + pub es: u16, pub edi: u32, pub esi: u32, pub ebp: u32, - esp: u32, pub ebx: u32, pub edx: u32, pub ecx: u32, @@ -19,10 +19,10 @@ pub struct ThunkData { impl ThunkData { pub fn new() -> Self { Self { + es: 0, edi: 0, esi: 0, ebp: 0, - esp: THUNK_STACK_ADDR as u32, ebx: 0, edx: 0, ecx: 0, @@ -31,11 +31,11 @@ impl ThunkData { } pub unsafe fn save(&self) { - ptr::write((THUNK_STACK_ADDR - 16) as *mut ThunkData, *self); + ptr::write((THUNK_STACK_ADDR - 64) as *mut ThunkData, *self); } pub unsafe fn load(&mut self) { - *self = ptr::read((THUNK_STACK_ADDR - 16) as *const ThunkData); + *self = ptr::read((THUNK_STACK_ADDR - 64) as *const ThunkData); } pub unsafe fn with(&mut self, f: extern "C" fn()) {