1*e208dfa2Spirofti /* $NetBSD: x86emu_util.c,v 1.2 2007/12/04 17:32:22 joerg Exp $ */ 2*e208dfa2Spirofti /* $OpenBSD */ 3*e208dfa2Spirofti 4*e208dfa2Spirofti /**************************************************************************** 5*e208dfa2Spirofti * 6*e208dfa2Spirofti * Realmode X86 Emulator Library 7*e208dfa2Spirofti * 8*e208dfa2Spirofti * Copyright (C) 1996-1999 SciTech Software, Inc. 9*e208dfa2Spirofti * Copyright (C) David Mosberger-Tang 10*e208dfa2Spirofti * Copyright (C) 1999 Egbert Eich 11*e208dfa2Spirofti * Copyright (C) 2007 Joerg Sonnenberger 12*e208dfa2Spirofti * 13*e208dfa2Spirofti * ======================================================================== 14*e208dfa2Spirofti * 15*e208dfa2Spirofti * Permission to use, copy, modify, distribute, and sell this software and 16*e208dfa2Spirofti * its documentation for any purpose is hereby granted without fee, 17*e208dfa2Spirofti * provided that the above copyright notice appear in all copies and that 18*e208dfa2Spirofti * both that copyright notice and this permission notice appear in 19*e208dfa2Spirofti * supporting documentation, and that the name of the authors not be used 20*e208dfa2Spirofti * in advertising or publicity pertaining to distribution of the software 21*e208dfa2Spirofti * without specific, written prior permission. The authors makes no 22*e208dfa2Spirofti * representations about the suitability of this software for any purpose. 23*e208dfa2Spirofti * It is provided "as is" without express or implied warranty. 24*e208dfa2Spirofti * 25*e208dfa2Spirofti * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 26*e208dfa2Spirofti * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 27*e208dfa2Spirofti * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR 28*e208dfa2Spirofti * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF 29*e208dfa2Spirofti * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 30*e208dfa2Spirofti * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 31*e208dfa2Spirofti * PERFORMANCE OF THIS SOFTWARE. 32*e208dfa2Spirofti * 33*e208dfa2Spirofti ****************************************************************************/ 34*e208dfa2Spirofti 35*e208dfa2Spirofti #include <sys/param.h> 36*e208dfa2Spirofti #include <sys/endian.h> 37*e208dfa2Spirofti 38*e208dfa2Spirofti #include <lib/libkern/x86emu.h> 39*e208dfa2Spirofti #include <lib/libkern/x86emu_regs.h> 40*e208dfa2Spirofti 41*e208dfa2Spirofti 42*e208dfa2Spirofti /**************************************************************************** 43*e208dfa2Spirofti PARAMETERS: 44*e208dfa2Spirofti addr - Emulator memory address to read 45*e208dfa2Spirofti 46*e208dfa2Spirofti RETURNS: 47*e208dfa2Spirofti Byte value read from emulator memory. 48*e208dfa2Spirofti 49*e208dfa2Spirofti REMARKS: 50*e208dfa2Spirofti Reads a byte value from the emulator memory. 51*e208dfa2Spirofti ****************************************************************************/ 52*e208dfa2Spirofti static uint8_t 53*e208dfa2Spirofti rdb(struct X86EMU *emu, uint32_t addr) 54*e208dfa2Spirofti { 55*e208dfa2Spirofti if (addr > emu->mem_size - 1) 56*e208dfa2Spirofti X86EMU_halt_sys(emu); 57*e208dfa2Spirofti return emu->mem_base[addr]; 58*e208dfa2Spirofti } 59*e208dfa2Spirofti /**************************************************************************** 60*e208dfa2Spirofti PARAMETERS: 61*e208dfa2Spirofti addr - Emulator memory address to read 62*e208dfa2Spirofti 63*e208dfa2Spirofti RETURNS: 64*e208dfa2Spirofti Word value read from emulator memory. 65*e208dfa2Spirofti 66*e208dfa2Spirofti REMARKS: 67*e208dfa2Spirofti Reads a word value from the emulator memory. 68*e208dfa2Spirofti ****************************************************************************/ 69*e208dfa2Spirofti static uint16_t 70*e208dfa2Spirofti rdw(struct X86EMU *emu, uint32_t addr) 71*e208dfa2Spirofti { 72*e208dfa2Spirofti if (addr > emu->mem_size - 2) 73*e208dfa2Spirofti X86EMU_halt_sys(emu); 74*e208dfa2Spirofti /* XXX alignment *sigh* */ 75*e208dfa2Spirofti return *(u_int16_t *)(emu->mem_base + addr); 76*e208dfa2Spirofti } 77*e208dfa2Spirofti /**************************************************************************** 78*e208dfa2Spirofti PARAMETERS: 79*e208dfa2Spirofti addr - Emulator memory address to read 80*e208dfa2Spirofti 81*e208dfa2Spirofti RETURNS: 82*e208dfa2Spirofti Long value read from emulator memory. 83*e208dfa2Spirofti REMARKS: 84*e208dfa2Spirofti Reads a long value from the emulator memory. 85*e208dfa2Spirofti ****************************************************************************/ 86*e208dfa2Spirofti static uint32_t 87*e208dfa2Spirofti rdl(struct X86EMU *emu, uint32_t addr) 88*e208dfa2Spirofti { 89*e208dfa2Spirofti if (addr > emu->mem_size - 4) 90*e208dfa2Spirofti X86EMU_halt_sys(emu); 91*e208dfa2Spirofti /* XXX alignment *sigh* */ 92*e208dfa2Spirofti return *(u_int32_t *)(emu->mem_base + addr); 93*e208dfa2Spirofti } 94*e208dfa2Spirofti /**************************************************************************** 95*e208dfa2Spirofti PARAMETERS: 96*e208dfa2Spirofti addr - Emulator memory address to read 97*e208dfa2Spirofti val - Value to store 98*e208dfa2Spirofti 99*e208dfa2Spirofti REMARKS: 100*e208dfa2Spirofti Writes a byte value to emulator memory. 101*e208dfa2Spirofti ****************************************************************************/ 102*e208dfa2Spirofti static void 103*e208dfa2Spirofti wrb(struct X86EMU *emu, uint32_t addr, uint8_t val) 104*e208dfa2Spirofti { 105*e208dfa2Spirofti if (addr > emu->mem_size - 1) 106*e208dfa2Spirofti X86EMU_halt_sys(emu); 107*e208dfa2Spirofti emu->mem_base[addr] = val; 108*e208dfa2Spirofti } 109*e208dfa2Spirofti /**************************************************************************** 110*e208dfa2Spirofti PARAMETERS: 111*e208dfa2Spirofti addr - Emulator memory address to read 112*e208dfa2Spirofti val - Value to store 113*e208dfa2Spirofti 114*e208dfa2Spirofti REMARKS: 115*e208dfa2Spirofti Writes a word value to emulator memory. 116*e208dfa2Spirofti ****************************************************************************/ 117*e208dfa2Spirofti static void 118*e208dfa2Spirofti wrw(struct X86EMU *emu, uint32_t addr, uint16_t val) 119*e208dfa2Spirofti { 120*e208dfa2Spirofti if (addr > emu->mem_size - 2) 121*e208dfa2Spirofti X86EMU_halt_sys(emu); 122*e208dfa2Spirofti /* XXX alignment */ 123*e208dfa2Spirofti *((u_int16_t *)(emu->mem_base + addr)) = val; 124*e208dfa2Spirofti } 125*e208dfa2Spirofti /**************************************************************************** 126*e208dfa2Spirofti PARAMETERS: 127*e208dfa2Spirofti addr - Emulator memory address to read 128*e208dfa2Spirofti val - Value to store 129*e208dfa2Spirofti 130*e208dfa2Spirofti REMARKS: 131*e208dfa2Spirofti Writes a long value to emulator memory. 132*e208dfa2Spirofti ****************************************************************************/ 133*e208dfa2Spirofti static void 134*e208dfa2Spirofti wrl(struct X86EMU *emu, uint32_t addr, uint32_t val) 135*e208dfa2Spirofti { 136*e208dfa2Spirofti if (addr > emu->mem_size - 4) 137*e208dfa2Spirofti X86EMU_halt_sys(emu); 138*e208dfa2Spirofti /* XXX alignment *sigh* */ 139*e208dfa2Spirofti *((u_int32_t *)(emu->mem_base + addr)) = val; 140*e208dfa2Spirofti } 141*e208dfa2Spirofti 142*e208dfa2Spirofti /*----------------------------- Setup -------------------------------------*/ 143*e208dfa2Spirofti 144*e208dfa2Spirofti void 145*e208dfa2Spirofti X86EMU_init_default(struct X86EMU *emu) 146*e208dfa2Spirofti { 147*e208dfa2Spirofti int i; 148*e208dfa2Spirofti 149*e208dfa2Spirofti emu->emu_rdb = rdb; 150*e208dfa2Spirofti emu->emu_rdw = rdw; 151*e208dfa2Spirofti emu->emu_rdl = rdl; 152*e208dfa2Spirofti emu->emu_wrb = wrb; 153*e208dfa2Spirofti emu->emu_wrw = wrw; 154*e208dfa2Spirofti emu->emu_wrl = wrl; 155*e208dfa2Spirofti 156*e208dfa2Spirofti for (i = 0; i < 256; i++) 157*e208dfa2Spirofti emu->_X86EMU_intrTab[i] = NULL; 158*e208dfa2Spirofti } 159