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