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