xref: /openbsd/sys/dev/x86emu/x86emu_util.c (revision 4b013528)
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