1ece92f85SJason Jin /**************************************************************************** 2ece92f85SJason Jin * 3ece92f85SJason Jin * Realmode X86 Emulator Library 4ece92f85SJason Jin * 5ece92f85SJason Jin * Copyright (C) 1991-2004 SciTech Software, Inc. 6ece92f85SJason Jin * Copyright (C) David Mosberger-Tang 7ece92f85SJason Jin * Copyright (C) 1999 Egbert Eich 8ece92f85SJason Jin * 9ece92f85SJason Jin * ======================================================================== 10ece92f85SJason Jin * 11ece92f85SJason Jin * Permission to use, copy, modify, distribute, and sell this software and 12ece92f85SJason Jin * its documentation for any purpose is hereby granted without fee, 13ece92f85SJason Jin * provided that the above copyright notice appear in all copies and that 14ece92f85SJason Jin * both that copyright notice and this permission notice appear in 15ece92f85SJason Jin * supporting documentation, and that the name of the authors not be used 16ece92f85SJason Jin * in advertising or publicity pertaining to distribution of the software 17ece92f85SJason Jin * without specific, written prior permission. The authors makes no 18ece92f85SJason Jin * representations about the suitability of this software for any purpose. 19ece92f85SJason Jin * It is provided "as is" without express or implied warranty. 20ece92f85SJason Jin * 21ece92f85SJason Jin * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 22ece92f85SJason Jin * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 23ece92f85SJason Jin * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR 24ece92f85SJason Jin * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF 25ece92f85SJason Jin * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 26ece92f85SJason Jin * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 27ece92f85SJason Jin * PERFORMANCE OF THIS SOFTWARE. 28ece92f85SJason Jin * 29ece92f85SJason Jin * ======================================================================== 30ece92f85SJason Jin * 31ece92f85SJason Jin * Language: ANSI C 32ece92f85SJason Jin * Environment: Any 33ece92f85SJason Jin * Developer: Kendall Bennett 34ece92f85SJason Jin * 35ece92f85SJason Jin * Description: This file includes subroutines which are related to 36ece92f85SJason Jin * programmed I/O and memory access. Included in this module 37ece92f85SJason Jin * are default functions that do nothing. For real uses these 38ece92f85SJason Jin * functions will have to be overriden by the user library. 39ece92f85SJason Jin * 40ece92f85SJason Jin ****************************************************************************/ 41ece92f85SJason Jin 42ce981dc8SJason Jin #if defined(CONFIG_BIOSEMU) 43ce981dc8SJason Jin 44*5b4de930SMichal Simek #include "x86emu/x86emui.h" 45*5b4de930SMichal Simek 46ece92f85SJason Jin /*------------------------- Global Variables ------------------------------*/ 47ece92f85SJason Jin 48ece92f85SJason Jin X86EMU_sysEnv _X86EMU_env; /* Global emulator machine state */ 49ece92f85SJason Jin X86EMU_intrFuncs _X86EMU_intrTab[256]; 50ece92f85SJason Jin 51ece92f85SJason Jin int debug_intr; 52ece92f85SJason Jin 53ece92f85SJason Jin /*----------------------------- Implementation ----------------------------*/ 54ece92f85SJason Jin 55ece92f85SJason Jin /**************************************************************************** 56ece92f85SJason Jin PARAMETERS: 57ece92f85SJason Jin addr - Emulator memory address to read 58ece92f85SJason Jin 59ece92f85SJason Jin RETURNS: 60ece92f85SJason Jin Byte value read from emulator memory. 61ece92f85SJason Jin 62ece92f85SJason Jin REMARKS: 63ece92f85SJason Jin Reads a byte value from the emulator memory. 64ece92f85SJason Jin ****************************************************************************/ 65ece92f85SJason Jin u8 X86API rdb(u32 addr) 66ece92f85SJason Jin { 67ece92f85SJason Jin return 0; 68ece92f85SJason Jin } 69ece92f85SJason Jin 70ece92f85SJason Jin /**************************************************************************** 71ece92f85SJason Jin PARAMETERS: 72ece92f85SJason Jin addr - Emulator memory address to read 73ece92f85SJason Jin 74ece92f85SJason Jin RETURNS: 75ece92f85SJason Jin Word value read from emulator memory. 76ece92f85SJason Jin 77ece92f85SJason Jin REMARKS: 78ece92f85SJason Jin Reads a word value from the emulator memory. 79ece92f85SJason Jin ****************************************************************************/ 80ece92f85SJason Jin u16 X86API rdw(u32 addr) 81ece92f85SJason Jin { 82ece92f85SJason Jin return 0; 83ece92f85SJason Jin } 84ece92f85SJason Jin 85ece92f85SJason Jin /**************************************************************************** 86ece92f85SJason Jin PARAMETERS: 87ece92f85SJason Jin addr - Emulator memory address to read 88ece92f85SJason Jin 89ece92f85SJason Jin RETURNS: 90ece92f85SJason Jin Long value read from emulator memory. 91ece92f85SJason Jin REMARKS: 92ece92f85SJason Jin Reads a long value from the emulator memory. 93ece92f85SJason Jin ****************************************************************************/ 94ece92f85SJason Jin u32 X86API rdl(u32 addr) 95ece92f85SJason Jin { 96ece92f85SJason Jin return 0; 97ece92f85SJason Jin } 98ece92f85SJason Jin 99ece92f85SJason Jin /**************************************************************************** 100ece92f85SJason Jin PARAMETERS: 101ece92f85SJason Jin addr - Emulator memory address to read 102ece92f85SJason Jin val - Value to store 103ece92f85SJason Jin 104ece92f85SJason Jin REMARKS: 105ece92f85SJason Jin Writes a byte value to emulator memory. 106ece92f85SJason Jin ****************************************************************************/ 107ece92f85SJason Jin void X86API wrb(u32 addr, u8 val) 108ece92f85SJason Jin { 109ece92f85SJason Jin } 110ece92f85SJason Jin 111ece92f85SJason Jin /**************************************************************************** 112ece92f85SJason Jin PARAMETERS: 113ece92f85SJason Jin addr - Emulator memory address to read 114ece92f85SJason Jin val - Value to store 115ece92f85SJason Jin 116ece92f85SJason Jin REMARKS: 117ece92f85SJason Jin Writes a word value to emulator memory. 118ece92f85SJason Jin ****************************************************************************/ 119ece92f85SJason Jin void X86API wrw(u32 addr, u16 val) 120ece92f85SJason Jin { 121ece92f85SJason Jin } 122ece92f85SJason Jin 123ece92f85SJason Jin /**************************************************************************** 124ece92f85SJason Jin PARAMETERS: 125ece92f85SJason Jin addr - Emulator memory address to read 126ece92f85SJason Jin val - Value to store 127ece92f85SJason Jin 128ece92f85SJason Jin REMARKS: 129ece92f85SJason Jin Writes a long value to emulator memory. 130ece92f85SJason Jin ****************************************************************************/ 131ece92f85SJason Jin void X86API wrl(u32 addr, u32 val) 132ece92f85SJason Jin { 133ece92f85SJason Jin } 134ece92f85SJason Jin 135ece92f85SJason Jin /**************************************************************************** 136ece92f85SJason Jin PARAMETERS: 137ece92f85SJason Jin addr - PIO address to read 138ece92f85SJason Jin RETURN: 139ece92f85SJason Jin 0 140ece92f85SJason Jin REMARKS: 141ece92f85SJason Jin Default PIO byte read function. Doesn't perform real inb. 142ece92f85SJason Jin ****************************************************************************/ 143ece92f85SJason Jin static u8 X86API p_inb(X86EMU_pioAddr addr) 144ece92f85SJason Jin { 145ece92f85SJason Jin DB(if (DEBUG_IO_TRACE()) 146ece92f85SJason Jin printk("inb %#04x \n", addr);) 147ece92f85SJason Jin return 0; 148ece92f85SJason Jin } 149ece92f85SJason Jin 150ece92f85SJason Jin /**************************************************************************** 151ece92f85SJason Jin PARAMETERS: 152ece92f85SJason Jin addr - PIO address to read 153ece92f85SJason Jin RETURN: 154ece92f85SJason Jin 0 155ece92f85SJason Jin REMARKS: 156ece92f85SJason Jin Default PIO word read function. Doesn't perform real inw. 157ece92f85SJason Jin ****************************************************************************/ 158ece92f85SJason Jin static u16 X86API p_inw(X86EMU_pioAddr addr) 159ece92f85SJason Jin { 160ece92f85SJason Jin DB(if (DEBUG_IO_TRACE()) 161ece92f85SJason Jin printk("inw %#04x \n", addr);) 162ece92f85SJason Jin return 0; 163ece92f85SJason Jin } 164ece92f85SJason Jin 165ece92f85SJason Jin /**************************************************************************** 166ece92f85SJason Jin PARAMETERS: 167ece92f85SJason Jin addr - PIO address to read 168ece92f85SJason Jin RETURN: 169ece92f85SJason Jin 0 170ece92f85SJason Jin REMARKS: 171ece92f85SJason Jin Default PIO long read function. Doesn't perform real inl. 172ece92f85SJason Jin ****************************************************************************/ 173ece92f85SJason Jin static u32 X86API p_inl(X86EMU_pioAddr addr) 174ece92f85SJason Jin { 175ece92f85SJason Jin DB(if (DEBUG_IO_TRACE()) 176ece92f85SJason Jin printk("inl %#04x \n", addr);) 177ece92f85SJason Jin return 0; 178ece92f85SJason Jin } 179ece92f85SJason Jin 180ece92f85SJason Jin /**************************************************************************** 181ece92f85SJason Jin PARAMETERS: 182ece92f85SJason Jin addr - PIO address to write 183ece92f85SJason Jin val - Value to store 184ece92f85SJason Jin REMARKS: 185ece92f85SJason Jin Default PIO byte write function. Doesn't perform real outb. 186ece92f85SJason Jin ****************************************************************************/ 187ece92f85SJason Jin static void X86API p_outb(X86EMU_pioAddr addr, u8 val) 188ece92f85SJason Jin { 189ece92f85SJason Jin DB(if (DEBUG_IO_TRACE()) 190ece92f85SJason Jin printk("outb %#02x -> %#04x \n", val, addr);) 191ece92f85SJason Jin return; 192ece92f85SJason Jin } 193ece92f85SJason Jin 194ece92f85SJason Jin /**************************************************************************** 195ece92f85SJason Jin PARAMETERS: 196ece92f85SJason Jin addr - PIO address to write 197ece92f85SJason Jin val - Value to store 198ece92f85SJason Jin REMARKS: 199ece92f85SJason Jin Default PIO word write function. Doesn't perform real outw. 200ece92f85SJason Jin ****************************************************************************/ 201ece92f85SJason Jin static void X86API p_outw(X86EMU_pioAddr addr, u16 val) 202ece92f85SJason Jin { 203ece92f85SJason Jin DB(if (DEBUG_IO_TRACE()) 204ece92f85SJason Jin printk("outw %#04x -> %#04x \n", val, addr);) 205ece92f85SJason Jin return; 206ece92f85SJason Jin } 207ece92f85SJason Jin 208ece92f85SJason Jin /**************************************************************************** 209ece92f85SJason Jin PARAMETERS: 210ece92f85SJason Jin addr - PIO address to write 211ece92f85SJason Jin val - Value to store 212ece92f85SJason Jin REMARKS: 213ece92f85SJason Jin Default PIO ;ong write function. Doesn't perform real outl. 214ece92f85SJason Jin ****************************************************************************/ 215ece92f85SJason Jin static void X86API p_outl(X86EMU_pioAddr addr, u32 val) 216ece92f85SJason Jin { 217ece92f85SJason Jin DB(if (DEBUG_IO_TRACE()) 218ece92f85SJason Jin printk("outl %#08x -> %#04x \n", val, addr);) 219ece92f85SJason Jin return; 220ece92f85SJason Jin } 221ece92f85SJason Jin 222ece92f85SJason Jin /*------------------------- Global Variables ------------------------------*/ 223ece92f85SJason Jin 224ece92f85SJason Jin u8(X86APIP sys_rdb) (u32 addr) = rdb; 225ece92f85SJason Jin u16(X86APIP sys_rdw) (u32 addr) = rdw; 226ece92f85SJason Jin u32(X86APIP sys_rdl) (u32 addr) = rdl; 227ece92f85SJason Jin void (X86APIP sys_wrb) (u32 addr, u8 val) = wrb; 228ece92f85SJason Jin void (X86APIP sys_wrw) (u32 addr, u16 val) = wrw; 229ece92f85SJason Jin void (X86APIP sys_wrl) (u32 addr, u32 val) = wrl; 230ece92f85SJason Jin u8(X86APIP sys_inb) (X86EMU_pioAddr addr) = p_inb; 231ece92f85SJason Jin u16(X86APIP sys_inw) (X86EMU_pioAddr addr) = p_inw; 232ece92f85SJason Jin u32(X86APIP sys_inl) (X86EMU_pioAddr addr) = p_inl; 233ece92f85SJason Jin void (X86APIP sys_outb) (X86EMU_pioAddr addr, u8 val) = p_outb; 234ece92f85SJason Jin void (X86APIP sys_outw) (X86EMU_pioAddr addr, u16 val) = p_outw; 235ece92f85SJason Jin void (X86APIP sys_outl) (X86EMU_pioAddr addr, u32 val) = p_outl; 236ece92f85SJason Jin 237ece92f85SJason Jin /*----------------------------- Setup -------------------------------------*/ 238ece92f85SJason Jin 239ece92f85SJason Jin /**************************************************************************** 240ece92f85SJason Jin PARAMETERS: 241ece92f85SJason Jin funcs - New memory function pointers to make active 242ece92f85SJason Jin 243ece92f85SJason Jin REMARKS: 244ece92f85SJason Jin This function is used to set the pointers to functions which access 245ece92f85SJason Jin memory space, allowing the user application to override these functions 246ece92f85SJason Jin and hook them out as necessary for their application. 247ece92f85SJason Jin ****************************************************************************/ 248ece92f85SJason Jin void X86EMU_setupMemFuncs(X86EMU_memFuncs * funcs) 249ece92f85SJason Jin { 250ece92f85SJason Jin sys_rdb = funcs->rdb; 251ece92f85SJason Jin sys_rdw = funcs->rdw; 252ece92f85SJason Jin sys_rdl = funcs->rdl; 253ece92f85SJason Jin sys_wrb = funcs->wrb; 254ece92f85SJason Jin sys_wrw = funcs->wrw; 255ece92f85SJason Jin sys_wrl = funcs->wrl; 256ece92f85SJason Jin } 257ece92f85SJason Jin 258ece92f85SJason Jin /**************************************************************************** 259ece92f85SJason Jin PARAMETERS: 260ece92f85SJason Jin funcs - New programmed I/O function pointers to make active 261ece92f85SJason Jin 262ece92f85SJason Jin REMARKS: 263ece92f85SJason Jin This function is used to set the pointers to functions which access 264ece92f85SJason Jin I/O space, allowing the user application to override these functions 265ece92f85SJason Jin and hook them out as necessary for their application. 266ece92f85SJason Jin ****************************************************************************/ 267ece92f85SJason Jin void X86EMU_setupPioFuncs(X86EMU_pioFuncs * funcs) 268ece92f85SJason Jin { 269ece92f85SJason Jin sys_inb = funcs->inb; 270ece92f85SJason Jin sys_inw = funcs->inw; 271ece92f85SJason Jin sys_inl = funcs->inl; 272ece92f85SJason Jin sys_outb = funcs->outb; 273ece92f85SJason Jin sys_outw = funcs->outw; 274ece92f85SJason Jin sys_outl = funcs->outl; 275ece92f85SJason Jin } 276ece92f85SJason Jin 277ece92f85SJason Jin /**************************************************************************** 278ece92f85SJason Jin PARAMETERS: 279ece92f85SJason Jin funcs - New interrupt vector table to make active 280ece92f85SJason Jin 281ece92f85SJason Jin REMARKS: 282ece92f85SJason Jin This function is used to set the pointers to functions which handle 283ece92f85SJason Jin interrupt processing in the emulator, allowing the user application to 284ece92f85SJason Jin hook interrupts as necessary for their application. Any interrupts that 285ece92f85SJason Jin are not hooked by the user application, and reflected and handled internally 286ece92f85SJason Jin in the emulator via the interrupt vector table. This allows the application 287ece92f85SJason Jin to get control when the code being emulated executes specific software 288ece92f85SJason Jin interrupts. 289ece92f85SJason Jin ****************************************************************************/ 290ece92f85SJason Jin void X86EMU_setupIntrFuncs(X86EMU_intrFuncs funcs[]) 291ece92f85SJason Jin { 292ece92f85SJason Jin int i; 293ece92f85SJason Jin 294ece92f85SJason Jin for (i = 0; i < 256; i++) 295ece92f85SJason Jin _X86EMU_intrTab[i] = NULL; 296ece92f85SJason Jin if (funcs) { 297ece92f85SJason Jin for (i = 0; i < 256; i++) 298ece92f85SJason Jin _X86EMU_intrTab[i] = funcs[i]; 299ece92f85SJason Jin } 300ece92f85SJason Jin } 301ece92f85SJason Jin 302ece92f85SJason Jin /**************************************************************************** 303ece92f85SJason Jin PARAMETERS: 304ece92f85SJason Jin int - New software interrupt to prepare for 305ece92f85SJason Jin 306ece92f85SJason Jin REMARKS: 307ece92f85SJason Jin This function is used to set up the emulator state to exceute a software 308ece92f85SJason Jin interrupt. This can be used by the user application code to allow an 309ece92f85SJason Jin interrupt to be hooked, examined and then reflected back to the emulator 310ece92f85SJason Jin so that the code in the emulator will continue processing the software 311ece92f85SJason Jin interrupt as per normal. This essentially allows system code to actively 312ece92f85SJason Jin hook and handle certain software interrupts as necessary. 313ece92f85SJason Jin ****************************************************************************/ 314ece92f85SJason Jin void X86EMU_prepareForInt(int num) 315ece92f85SJason Jin { 316ece92f85SJason Jin push_word((u16) M.x86.R_FLG); 317ece92f85SJason Jin CLEAR_FLAG(F_IF); 318ece92f85SJason Jin CLEAR_FLAG(F_TF); 319ece92f85SJason Jin push_word(M.x86.R_CS); 320ece92f85SJason Jin M.x86.R_CS = mem_access_word(num * 4 + 2); 321ece92f85SJason Jin push_word(M.x86.R_IP); 322ece92f85SJason Jin M.x86.R_IP = mem_access_word(num * 4); 323ece92f85SJason Jin M.x86.intr = 0; 324ece92f85SJason Jin } 325ce981dc8SJason Jin 326ce981dc8SJason Jin #endif 327