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