From acff86a794eecca3f48c15b1bd217434644b41a5 Mon Sep 17 00:00:00 2001 From: Jeremy Soller <jackpot51@gmail.com> Date: Sat, 5 Feb 2022 20:57:53 -0700 Subject: [PATCH] Use 32-bit registers for thunking --- src/disk.rs | 8 ++++---- src/lib.rs | 30 +++++++++++++++--------------- src/thunk.rs | 32 ++++++++++++++++---------------- x86/thunk.asm | 4 ++-- 4 files changed, 37 insertions(+), 37 deletions(-) diff --git a/src/disk.rs b/src/disk.rs index ae88d39..e6dcac8 100644 --- a/src/disk.rs +++ b/src/disk.rs @@ -48,14 +48,14 @@ impl Disk for DiskBios { ptr::write(DISK_ADDRESS_PACKET_ADDR as *mut DiskAddressPacket, dap); let mut data = ThunkData::new(); - data.ax = 0x4200; - data.dx = self.boot_disk as u16; - data.si = DISK_ADDRESS_PACKET_ADDR as u16; + data.eax = 0x4200; + data.edx = self.boot_disk as u32; + data.esi = DISK_ADDRESS_PACKET_ADDR as u32; data.with(self.thunk13); //TODO: return result on error - assert_eq!(data.ax, 0); + assert_eq!(data.eax, 0); //TODO: check blocks transferred dap = ptr::read(DISK_ADDRESS_PACKET_ADDR as *mut DiskAddressPacket); diff --git a/src/lib.rs b/src/lib.rs index ccec136..7bf287f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -54,15 +54,15 @@ pub unsafe extern "C" fn kstart( { // Make sure we are in mode 3 (80x25 text mode) let mut data = ThunkData::new(); - data.ax = 0x03; + data.eax = 0x03; data.with(thunk10); } { // Disable cursor let mut data = ThunkData::new(); - data.ax = 0x0100; - data.cx = 0x3F00; + data.eax = 0x0100; + data.ecx = 0x3F00; data.with(thunk10); } @@ -123,10 +123,10 @@ pub unsafe extern "C" fn kstart( { // Get card info let mut data = ThunkData::new(); - data.ax = 0x4F00; - data.di = VBE_CARD_INFO_ADDR as u16; + data.eax = 0x4F00; + data.edi = VBE_CARD_INFO_ADDR as u32; data.with(thunk10); - if data.ax == 0x004F { + if data.eax == 0x004F { let card_info = ptr::read(VBE_CARD_INFO_ADDR as *const VbeCardInfo); let mut mode_ptr = card_info.videomodeptr as *const u16; @@ -140,11 +140,11 @@ pub unsafe extern "C" fn kstart( // Get mode info let mut data = ThunkData::new(); - data.ax = 0x4F01; - data.cx = mode; - data.di = VBE_MODE_INFO_ADDR as u16; + data.eax = 0x4F01; + data.ecx = mode as u32; + data.edi = VBE_MODE_INFO_ADDR as u32; data.with(thunk10); - if data.ax == 0x004F { + if data.eax == 0x004F { let mode_info = ptr::read(VBE_MODE_INFO_ADDR as *const VbeModeInfo); // We only support 32-bits per pixel modes @@ -176,11 +176,11 @@ pub unsafe extern "C" fn kstart( format!("{:>4}x{:<4} {:>3}:{:<3}", w, h, aspect_w, aspect_h) )); } else { - error!("Failed to read VBE mode 0x{:04X} info: 0x{:04X}", mode, data.ax); + error!("Failed to read VBE mode 0x{:04X} info: 0x{:04X}", mode, data.eax); } } } else { - error!("Failed to read VBE card info: 0x{:04X}", data.ax); + error!("Failed to read VBE card info: 0x{:04X}", data.eax); } } @@ -222,7 +222,7 @@ pub unsafe extern "C" fn kstart( // Read keypress let mut data = ThunkData::new(); data.with(thunk16); - match (data.ax >> 8) as u8 { + match (data.eax >> 8) as u8 { 0x4B /* Left */ => { if let Some(mut mode_i) = modes.iter().position(|x| x.0 == selected) { if mode_i < rows { @@ -277,8 +277,8 @@ pub unsafe extern "C" fn kstart( }, 0x1C /* Enter */ => { let mut data = ThunkData::new(); - data.ax = 0x4F02; - data.bx = selected; + data.eax = 0x4F02; + data.ebx = selected as u32; data.with(thunk10); }, _ => (), diff --git a/src/thunk.rs b/src/thunk.rs index 4b96fcf..658967a 100644 --- a/src/thunk.rs +++ b/src/thunk.rs @@ -5,27 +5,27 @@ use crate::THUNK_STACK_ADDR; #[derive(Clone, Copy)] #[repr(packed)] pub struct ThunkData { - pub di: u16, - pub si: u16, - pub bp: u16, - sp: u16, - pub bx: u16, - pub dx: u16, - pub cx: u16, - pub ax: u16, + pub edi: u32, + pub esi: u32, + pub ebp: u32, + esp: u32, + pub ebx: u32, + pub edx: u32, + pub ecx: u32, + pub eax: u32, } impl ThunkData { pub fn new() -> Self { Self { - di: 0, - si: 0, - bp: 0, - sp: THUNK_STACK_ADDR as u16, - bx: 0, - dx: 0, - cx: 0, - ax: 0, + edi: 0, + esi: 0, + ebp: 0, + esp: THUNK_STACK_ADDR as u32, + ebx: 0, + edx: 0, + ecx: 0, + eax: 0, } } diff --git a/x86/thunk.asm b/x86/thunk.asm index 80e1b90..cb7662e 100644 --- a/x86/thunk.asm +++ b/x86/thunk.asm @@ -104,7 +104,7 @@ USE16 mov esp, 0x7C00 - 16 ; load registers - popa + popad ; enable interrupts sti @@ -116,7 +116,7 @@ USE16 cli ; save registers - pusha + pushad ; restore cr0, will enable protected mode mov eax, [.cr0] -- GitLab