xref: /openbmc/u-boot/drivers/bios_emulator/x86emu/sys.c (revision 78cff50edba6b1508eb15c2f53ce966ac891eb9e)
1ece92f85SJason Jin /****************************************************************************
2ece92f85SJason Jin *
3ece92f85SJason Jin *                       Realmode X86 Emulator Library
4ece92f85SJason Jin *
5ece92f85SJason Jin *               Copyright (C) 1991-2004 SciTech Software, Inc.
6ece92f85SJason Jin *                    Copyright (C) David Mosberger-Tang
7ece92f85SJason Jin *                      Copyright (C) 1999 Egbert Eich
8ece92f85SJason Jin *
9ece92f85SJason Jin *  ========================================================================
10ece92f85SJason Jin *
11ece92f85SJason Jin *  Permission to use, copy, modify, distribute, and sell this software and
12ece92f85SJason Jin *  its documentation for any purpose is hereby granted without fee,
13ece92f85SJason Jin *  provided that the above copyright notice appear in all copies and that
14ece92f85SJason Jin *  both that copyright notice and this permission notice appear in
15ece92f85SJason Jin *  supporting documentation, and that the name of the authors not be used
16ece92f85SJason Jin *  in advertising or publicity pertaining to distribution of the software
17ece92f85SJason Jin *  without specific, written prior permission.  The authors makes no
18ece92f85SJason Jin *  representations about the suitability of this software for any purpose.
19ece92f85SJason Jin *  It is provided "as is" without express or implied warranty.
20ece92f85SJason Jin *
21ece92f85SJason Jin *  THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
22ece92f85SJason Jin *  INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
23ece92f85SJason Jin *  EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
24ece92f85SJason Jin *  CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
25ece92f85SJason Jin *  USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
26ece92f85SJason Jin *  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
27ece92f85SJason Jin *  PERFORMANCE OF THIS SOFTWARE.
28ece92f85SJason Jin *
29ece92f85SJason Jin *  ========================================================================
30ece92f85SJason Jin *
31ece92f85SJason Jin * Language:     ANSI C
32ece92f85SJason Jin * Environment:  Any
33ece92f85SJason Jin * Developer:    Kendall Bennett
34ece92f85SJason Jin *
35ece92f85SJason Jin * Description:  This file includes subroutines which are related to
36ece92f85SJason Jin *               programmed I/O and memory access. Included in this module
37ece92f85SJason Jin *               are default functions that do nothing. For real uses these
38ece92f85SJason Jin *               functions will have to be overriden by the user library.
39ece92f85SJason Jin *
40ece92f85SJason Jin ****************************************************************************/
41ece92f85SJason Jin 
42*78cff50eSMichal Simek #include <common.h>
43*78cff50eSMichal Simek 
44ce981dc8SJason Jin #if defined(CONFIG_BIOSEMU)
45ce981dc8SJason Jin 
465b4de930SMichal Simek #include "x86emu/x86emui.h"
475b4de930SMichal Simek 
48ece92f85SJason Jin /*------------------------- Global Variables ------------------------------*/
49ece92f85SJason Jin 
50ece92f85SJason Jin X86EMU_sysEnv _X86EMU_env;	/* Global emulator machine state */
51ece92f85SJason Jin X86EMU_intrFuncs _X86EMU_intrTab[256];
52ece92f85SJason Jin 
53ece92f85SJason Jin int debug_intr;
54ece92f85SJason Jin 
55ece92f85SJason Jin /*----------------------------- Implementation ----------------------------*/
56ece92f85SJason Jin 
57ece92f85SJason Jin /****************************************************************************
58ece92f85SJason Jin PARAMETERS:
59ece92f85SJason Jin addr    - Emulator memory address to read
60ece92f85SJason Jin 
61ece92f85SJason Jin RETURNS:
62ece92f85SJason Jin Byte value read from emulator memory.
63ece92f85SJason Jin 
64ece92f85SJason Jin REMARKS:
65ece92f85SJason Jin Reads a byte value from the emulator memory.
66ece92f85SJason Jin ****************************************************************************/
67ece92f85SJason Jin u8 X86API rdb(u32 addr)
68ece92f85SJason Jin {
69ece92f85SJason Jin 	return 0;
70ece92f85SJason Jin }
71ece92f85SJason Jin 
72ece92f85SJason Jin /****************************************************************************
73ece92f85SJason Jin PARAMETERS:
74ece92f85SJason Jin addr    - Emulator memory address to read
75ece92f85SJason Jin 
76ece92f85SJason Jin RETURNS:
77ece92f85SJason Jin Word value read from emulator memory.
78ece92f85SJason Jin 
79ece92f85SJason Jin REMARKS:
80ece92f85SJason Jin Reads a word value from the emulator memory.
81ece92f85SJason Jin ****************************************************************************/
82ece92f85SJason Jin u16 X86API rdw(u32 addr)
83ece92f85SJason Jin {
84ece92f85SJason Jin 	return 0;
85ece92f85SJason Jin }
86ece92f85SJason Jin 
87ece92f85SJason Jin /****************************************************************************
88ece92f85SJason Jin PARAMETERS:
89ece92f85SJason Jin addr    - Emulator memory address to read
90ece92f85SJason Jin 
91ece92f85SJason Jin RETURNS:
92ece92f85SJason Jin Long value read from emulator memory.
93ece92f85SJason Jin REMARKS:
94ece92f85SJason Jin Reads a long value from the emulator memory.
95ece92f85SJason Jin ****************************************************************************/
96ece92f85SJason Jin u32 X86API rdl(u32 addr)
97ece92f85SJason Jin {
98ece92f85SJason Jin 	return 0;
99ece92f85SJason Jin }
100ece92f85SJason Jin 
101ece92f85SJason Jin /****************************************************************************
102ece92f85SJason Jin PARAMETERS:
103ece92f85SJason Jin addr    - Emulator memory address to read
104ece92f85SJason Jin val     - Value to store
105ece92f85SJason Jin 
106ece92f85SJason Jin REMARKS:
107ece92f85SJason Jin Writes a byte value to emulator memory.
108ece92f85SJason Jin ****************************************************************************/
109ece92f85SJason Jin void X86API wrb(u32 addr, u8 val)
110ece92f85SJason Jin {
111ece92f85SJason Jin }
112ece92f85SJason Jin 
113ece92f85SJason Jin /****************************************************************************
114ece92f85SJason Jin PARAMETERS:
115ece92f85SJason Jin addr    - Emulator memory address to read
116ece92f85SJason Jin val     - Value to store
117ece92f85SJason Jin 
118ece92f85SJason Jin REMARKS:
119ece92f85SJason Jin Writes a word value to emulator memory.
120ece92f85SJason Jin ****************************************************************************/
121ece92f85SJason Jin void X86API wrw(u32 addr, u16 val)
122ece92f85SJason Jin {
123ece92f85SJason Jin }
124ece92f85SJason Jin 
125ece92f85SJason Jin /****************************************************************************
126ece92f85SJason Jin PARAMETERS:
127ece92f85SJason Jin addr    - Emulator memory address to read
128ece92f85SJason Jin val     - Value to store
129ece92f85SJason Jin 
130ece92f85SJason Jin REMARKS:
131ece92f85SJason Jin Writes a long value to emulator memory.
132ece92f85SJason Jin ****************************************************************************/
133ece92f85SJason Jin void X86API wrl(u32 addr, u32 val)
134ece92f85SJason Jin {
135ece92f85SJason Jin }
136ece92f85SJason Jin 
137ece92f85SJason Jin /****************************************************************************
138ece92f85SJason Jin PARAMETERS:
139ece92f85SJason Jin addr    - PIO address to read
140ece92f85SJason Jin RETURN:
141ece92f85SJason Jin 0
142ece92f85SJason Jin REMARKS:
143ece92f85SJason Jin Default PIO byte read function. Doesn't perform real inb.
144ece92f85SJason Jin ****************************************************************************/
145ece92f85SJason Jin static u8 X86API p_inb(X86EMU_pioAddr addr)
146ece92f85SJason Jin {
147ece92f85SJason Jin 	DB(if (DEBUG_IO_TRACE())
148ece92f85SJason Jin 	   printk("inb %#04x \n", addr);)
149ece92f85SJason Jin 		return 0;
150ece92f85SJason Jin }
151ece92f85SJason Jin 
152ece92f85SJason Jin /****************************************************************************
153ece92f85SJason Jin PARAMETERS:
154ece92f85SJason Jin addr    - PIO address to read
155ece92f85SJason Jin RETURN:
156ece92f85SJason Jin 0
157ece92f85SJason Jin REMARKS:
158ece92f85SJason Jin Default PIO word read function. Doesn't perform real inw.
159ece92f85SJason Jin ****************************************************************************/
160ece92f85SJason Jin static u16 X86API p_inw(X86EMU_pioAddr addr)
161ece92f85SJason Jin {
162ece92f85SJason Jin 	DB(if (DEBUG_IO_TRACE())
163ece92f85SJason Jin 	   printk("inw %#04x \n", addr);)
164ece92f85SJason Jin 		return 0;
165ece92f85SJason Jin }
166ece92f85SJason Jin 
167ece92f85SJason Jin /****************************************************************************
168ece92f85SJason Jin PARAMETERS:
169ece92f85SJason Jin addr    - PIO address to read
170ece92f85SJason Jin RETURN:
171ece92f85SJason Jin 0
172ece92f85SJason Jin REMARKS:
173ece92f85SJason Jin Default PIO long read function. Doesn't perform real inl.
174ece92f85SJason Jin ****************************************************************************/
175ece92f85SJason Jin static u32 X86API p_inl(X86EMU_pioAddr addr)
176ece92f85SJason Jin {
177ece92f85SJason Jin 	DB(if (DEBUG_IO_TRACE())
178ece92f85SJason Jin 	   printk("inl %#04x \n", addr);)
179ece92f85SJason Jin 		return 0;
180ece92f85SJason Jin }
181ece92f85SJason Jin 
182ece92f85SJason Jin /****************************************************************************
183ece92f85SJason Jin PARAMETERS:
184ece92f85SJason Jin addr    - PIO address to write
185ece92f85SJason Jin val     - Value to store
186ece92f85SJason Jin REMARKS:
187ece92f85SJason Jin Default PIO byte write function. Doesn't perform real outb.
188ece92f85SJason Jin ****************************************************************************/
189ece92f85SJason Jin static void X86API p_outb(X86EMU_pioAddr addr, u8 val)
190ece92f85SJason Jin {
191ece92f85SJason Jin 	DB(if (DEBUG_IO_TRACE())
192ece92f85SJason Jin 	   printk("outb %#02x -> %#04x \n", val, addr);)
193ece92f85SJason Jin 		return;
194ece92f85SJason Jin }
195ece92f85SJason Jin 
196ece92f85SJason Jin /****************************************************************************
197ece92f85SJason Jin PARAMETERS:
198ece92f85SJason Jin addr    - PIO address to write
199ece92f85SJason Jin val     - Value to store
200ece92f85SJason Jin REMARKS:
201ece92f85SJason Jin Default PIO word write function. Doesn't perform real outw.
202ece92f85SJason Jin ****************************************************************************/
203ece92f85SJason Jin static void X86API p_outw(X86EMU_pioAddr addr, u16 val)
204ece92f85SJason Jin {
205ece92f85SJason Jin 	DB(if (DEBUG_IO_TRACE())
206ece92f85SJason Jin 	   printk("outw %#04x -> %#04x \n", val, addr);)
207ece92f85SJason Jin 		return;
208ece92f85SJason Jin }
209ece92f85SJason Jin 
210ece92f85SJason Jin /****************************************************************************
211ece92f85SJason Jin PARAMETERS:
212ece92f85SJason Jin addr    - PIO address to write
213ece92f85SJason Jin val     - Value to store
214ece92f85SJason Jin REMARKS:
215ece92f85SJason Jin Default PIO ;ong write function. Doesn't perform real outl.
216ece92f85SJason Jin ****************************************************************************/
217ece92f85SJason Jin static void X86API p_outl(X86EMU_pioAddr addr, u32 val)
218ece92f85SJason Jin {
219ece92f85SJason Jin 	DB(if (DEBUG_IO_TRACE())
220ece92f85SJason Jin 	   printk("outl %#08x -> %#04x \n", val, addr);)
221ece92f85SJason Jin 		return;
222ece92f85SJason Jin }
223ece92f85SJason Jin 
224ece92f85SJason Jin /*------------------------- Global Variables ------------------------------*/
225ece92f85SJason Jin 
226ece92f85SJason Jin u8(X86APIP sys_rdb) (u32 addr) = rdb;
227ece92f85SJason Jin u16(X86APIP sys_rdw) (u32 addr) = rdw;
228ece92f85SJason Jin u32(X86APIP sys_rdl) (u32 addr) = rdl;
229ece92f85SJason Jin void (X86APIP sys_wrb) (u32 addr, u8 val) = wrb;
230ece92f85SJason Jin void (X86APIP sys_wrw) (u32 addr, u16 val) = wrw;
231ece92f85SJason Jin void (X86APIP sys_wrl) (u32 addr, u32 val) = wrl;
232ece92f85SJason Jin u8(X86APIP sys_inb) (X86EMU_pioAddr addr) = p_inb;
233ece92f85SJason Jin u16(X86APIP sys_inw) (X86EMU_pioAddr addr) = p_inw;
234ece92f85SJason Jin u32(X86APIP sys_inl) (X86EMU_pioAddr addr) = p_inl;
235ece92f85SJason Jin void (X86APIP sys_outb) (X86EMU_pioAddr addr, u8 val) = p_outb;
236ece92f85SJason Jin void (X86APIP sys_outw) (X86EMU_pioAddr addr, u16 val) = p_outw;
237ece92f85SJason Jin void (X86APIP sys_outl) (X86EMU_pioAddr addr, u32 val) = p_outl;
238ece92f85SJason Jin 
239ece92f85SJason Jin /*----------------------------- Setup -------------------------------------*/
240ece92f85SJason Jin 
241ece92f85SJason Jin /****************************************************************************
242ece92f85SJason Jin PARAMETERS:
243ece92f85SJason Jin funcs   - New memory function pointers to make active
244ece92f85SJason Jin 
245ece92f85SJason Jin REMARKS:
246ece92f85SJason Jin This function is used to set the pointers to functions which access
247ece92f85SJason Jin memory space, allowing the user application to override these functions
248ece92f85SJason Jin and hook them out as necessary for their application.
249ece92f85SJason Jin ****************************************************************************/
250ece92f85SJason Jin void X86EMU_setupMemFuncs(X86EMU_memFuncs * funcs)
251ece92f85SJason Jin {
252ece92f85SJason Jin 	sys_rdb = funcs->rdb;
253ece92f85SJason Jin 	sys_rdw = funcs->rdw;
254ece92f85SJason Jin 	sys_rdl = funcs->rdl;
255ece92f85SJason Jin 	sys_wrb = funcs->wrb;
256ece92f85SJason Jin 	sys_wrw = funcs->wrw;
257ece92f85SJason Jin 	sys_wrl = funcs->wrl;
258ece92f85SJason Jin }
259ece92f85SJason Jin 
260ece92f85SJason Jin /****************************************************************************
261ece92f85SJason Jin PARAMETERS:
262ece92f85SJason Jin funcs   - New programmed I/O function pointers to make active
263ece92f85SJason Jin 
264ece92f85SJason Jin REMARKS:
265ece92f85SJason Jin This function is used to set the pointers to functions which access
266ece92f85SJason Jin I/O space, allowing the user application to override these functions
267ece92f85SJason Jin and hook them out as necessary for their application.
268ece92f85SJason Jin ****************************************************************************/
269ece92f85SJason Jin void X86EMU_setupPioFuncs(X86EMU_pioFuncs * funcs)
270ece92f85SJason Jin {
271ece92f85SJason Jin 	sys_inb = funcs->inb;
272ece92f85SJason Jin 	sys_inw = funcs->inw;
273ece92f85SJason Jin 	sys_inl = funcs->inl;
274ece92f85SJason Jin 	sys_outb = funcs->outb;
275ece92f85SJason Jin 	sys_outw = funcs->outw;
276ece92f85SJason Jin 	sys_outl = funcs->outl;
277ece92f85SJason Jin }
278ece92f85SJason Jin 
279ece92f85SJason Jin /****************************************************************************
280ece92f85SJason Jin PARAMETERS:
281ece92f85SJason Jin funcs   - New interrupt vector table to make active
282ece92f85SJason Jin 
283ece92f85SJason Jin REMARKS:
284ece92f85SJason Jin This function is used to set the pointers to functions which handle
285ece92f85SJason Jin interrupt processing in the emulator, allowing the user application to
286ece92f85SJason Jin hook interrupts as necessary for their application. Any interrupts that
287ece92f85SJason Jin are not hooked by the user application, and reflected and handled internally
288ece92f85SJason Jin in the emulator via the interrupt vector table. This allows the application
289ece92f85SJason Jin to get control when the code being emulated executes specific software
290ece92f85SJason Jin interrupts.
291ece92f85SJason Jin ****************************************************************************/
292ece92f85SJason Jin void X86EMU_setupIntrFuncs(X86EMU_intrFuncs funcs[])
293ece92f85SJason Jin {
294ece92f85SJason Jin 	int i;
295ece92f85SJason Jin 
296ece92f85SJason Jin 	for (i = 0; i < 256; i++)
297ece92f85SJason Jin 		_X86EMU_intrTab[i] = NULL;
298ece92f85SJason Jin 	if (funcs) {
299ece92f85SJason Jin 		for (i = 0; i < 256; i++)
300ece92f85SJason Jin 			_X86EMU_intrTab[i] = funcs[i];
301ece92f85SJason Jin 	}
302ece92f85SJason Jin }
303ece92f85SJason Jin 
304ece92f85SJason Jin /****************************************************************************
305ece92f85SJason Jin PARAMETERS:
306ece92f85SJason Jin int - New software interrupt to prepare for
307ece92f85SJason Jin 
308ece92f85SJason Jin REMARKS:
309ece92f85SJason Jin This function is used to set up the emulator state to exceute a software
310ece92f85SJason Jin interrupt. This can be used by the user application code to allow an
311ece92f85SJason Jin interrupt to be hooked, examined and then reflected back to the emulator
312ece92f85SJason Jin so that the code in the emulator will continue processing the software
313ece92f85SJason Jin interrupt as per normal. This essentially allows system code to actively
314ece92f85SJason Jin hook and handle certain software interrupts as necessary.
315ece92f85SJason Jin ****************************************************************************/
316ece92f85SJason Jin void X86EMU_prepareForInt(int num)
317ece92f85SJason Jin {
318ece92f85SJason Jin 	push_word((u16) M.x86.R_FLG);
319ece92f85SJason Jin 	CLEAR_FLAG(F_IF);
320ece92f85SJason Jin 	CLEAR_FLAG(F_TF);
321ece92f85SJason Jin 	push_word(M.x86.R_CS);
322ece92f85SJason Jin 	M.x86.R_CS = mem_access_word(num * 4 + 2);
323ece92f85SJason Jin 	push_word(M.x86.R_IP);
324ece92f85SJason Jin 	M.x86.R_IP = mem_access_word(num * 4);
325ece92f85SJason Jin 	M.x86.intr = 0;
326ece92f85SJason Jin }
327ce981dc8SJason Jin 
328ce981dc8SJason Jin #endif
329