xref: /openbmc/u-boot/drivers/bios_emulator/x86emu/sys.c (revision ece92f85053b8df613edcf05b26a416cbc3d629c)
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