xref: /openbmc/u-boot/drivers/bios_emulator/x86emu/sys.c (revision 5b4de9309d7a03aa1db2e5391ab696363391f460)
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 
42ce981dc8SJason Jin #if defined(CONFIG_BIOSEMU)
43ce981dc8SJason Jin 
44*5b4de930SMichal Simek #include "x86emu/x86emui.h"
45*5b4de930SMichal Simek 
46ece92f85SJason Jin /*------------------------- Global Variables ------------------------------*/
47ece92f85SJason Jin 
48ece92f85SJason Jin X86EMU_sysEnv _X86EMU_env;	/* Global emulator machine state */
49ece92f85SJason Jin X86EMU_intrFuncs _X86EMU_intrTab[256];
50ece92f85SJason Jin 
51ece92f85SJason Jin int debug_intr;
52ece92f85SJason Jin 
53ece92f85SJason Jin /*----------------------------- Implementation ----------------------------*/
54ece92f85SJason Jin 
55ece92f85SJason Jin /****************************************************************************
56ece92f85SJason Jin PARAMETERS:
57ece92f85SJason Jin addr    - Emulator memory address to read
58ece92f85SJason Jin 
59ece92f85SJason Jin RETURNS:
60ece92f85SJason Jin Byte value read from emulator memory.
61ece92f85SJason Jin 
62ece92f85SJason Jin REMARKS:
63ece92f85SJason Jin Reads a byte value from the emulator memory.
64ece92f85SJason Jin ****************************************************************************/
65ece92f85SJason Jin u8 X86API rdb(u32 addr)
66ece92f85SJason Jin {
67ece92f85SJason Jin 	return 0;
68ece92f85SJason Jin }
69ece92f85SJason Jin 
70ece92f85SJason Jin /****************************************************************************
71ece92f85SJason Jin PARAMETERS:
72ece92f85SJason Jin addr    - Emulator memory address to read
73ece92f85SJason Jin 
74ece92f85SJason Jin RETURNS:
75ece92f85SJason Jin Word value read from emulator memory.
76ece92f85SJason Jin 
77ece92f85SJason Jin REMARKS:
78ece92f85SJason Jin Reads a word value from the emulator memory.
79ece92f85SJason Jin ****************************************************************************/
80ece92f85SJason Jin u16 X86API rdw(u32 addr)
81ece92f85SJason Jin {
82ece92f85SJason Jin 	return 0;
83ece92f85SJason Jin }
84ece92f85SJason Jin 
85ece92f85SJason Jin /****************************************************************************
86ece92f85SJason Jin PARAMETERS:
87ece92f85SJason Jin addr    - Emulator memory address to read
88ece92f85SJason Jin 
89ece92f85SJason Jin RETURNS:
90ece92f85SJason Jin Long value read from emulator memory.
91ece92f85SJason Jin REMARKS:
92ece92f85SJason Jin Reads a long value from the emulator memory.
93ece92f85SJason Jin ****************************************************************************/
94ece92f85SJason Jin u32 X86API rdl(u32 addr)
95ece92f85SJason Jin {
96ece92f85SJason Jin 	return 0;
97ece92f85SJason Jin }
98ece92f85SJason Jin 
99ece92f85SJason Jin /****************************************************************************
100ece92f85SJason Jin PARAMETERS:
101ece92f85SJason Jin addr    - Emulator memory address to read
102ece92f85SJason Jin val     - Value to store
103ece92f85SJason Jin 
104ece92f85SJason Jin REMARKS:
105ece92f85SJason Jin Writes a byte value to emulator memory.
106ece92f85SJason Jin ****************************************************************************/
107ece92f85SJason Jin void X86API wrb(u32 addr, u8 val)
108ece92f85SJason Jin {
109ece92f85SJason Jin }
110ece92f85SJason Jin 
111ece92f85SJason Jin /****************************************************************************
112ece92f85SJason Jin PARAMETERS:
113ece92f85SJason Jin addr    - Emulator memory address to read
114ece92f85SJason Jin val     - Value to store
115ece92f85SJason Jin 
116ece92f85SJason Jin REMARKS:
117ece92f85SJason Jin Writes a word value to emulator memory.
118ece92f85SJason Jin ****************************************************************************/
119ece92f85SJason Jin void X86API wrw(u32 addr, u16 val)
120ece92f85SJason Jin {
121ece92f85SJason Jin }
122ece92f85SJason Jin 
123ece92f85SJason Jin /****************************************************************************
124ece92f85SJason Jin PARAMETERS:
125ece92f85SJason Jin addr    - Emulator memory address to read
126ece92f85SJason Jin val     - Value to store
127ece92f85SJason Jin 
128ece92f85SJason Jin REMARKS:
129ece92f85SJason Jin Writes a long value to emulator memory.
130ece92f85SJason Jin ****************************************************************************/
131ece92f85SJason Jin void X86API wrl(u32 addr, u32 val)
132ece92f85SJason Jin {
133ece92f85SJason Jin }
134ece92f85SJason Jin 
135ece92f85SJason Jin /****************************************************************************
136ece92f85SJason Jin PARAMETERS:
137ece92f85SJason Jin addr    - PIO address to read
138ece92f85SJason Jin RETURN:
139ece92f85SJason Jin 0
140ece92f85SJason Jin REMARKS:
141ece92f85SJason Jin Default PIO byte read function. Doesn't perform real inb.
142ece92f85SJason Jin ****************************************************************************/
143ece92f85SJason Jin static u8 X86API p_inb(X86EMU_pioAddr addr)
144ece92f85SJason Jin {
145ece92f85SJason Jin 	DB(if (DEBUG_IO_TRACE())
146ece92f85SJason Jin 	   printk("inb %#04x \n", addr);)
147ece92f85SJason Jin 		return 0;
148ece92f85SJason Jin }
149ece92f85SJason Jin 
150ece92f85SJason Jin /****************************************************************************
151ece92f85SJason Jin PARAMETERS:
152ece92f85SJason Jin addr    - PIO address to read
153ece92f85SJason Jin RETURN:
154ece92f85SJason Jin 0
155ece92f85SJason Jin REMARKS:
156ece92f85SJason Jin Default PIO word read function. Doesn't perform real inw.
157ece92f85SJason Jin ****************************************************************************/
158ece92f85SJason Jin static u16 X86API p_inw(X86EMU_pioAddr addr)
159ece92f85SJason Jin {
160ece92f85SJason Jin 	DB(if (DEBUG_IO_TRACE())
161ece92f85SJason Jin 	   printk("inw %#04x \n", addr);)
162ece92f85SJason Jin 		return 0;
163ece92f85SJason Jin }
164ece92f85SJason Jin 
165ece92f85SJason Jin /****************************************************************************
166ece92f85SJason Jin PARAMETERS:
167ece92f85SJason Jin addr    - PIO address to read
168ece92f85SJason Jin RETURN:
169ece92f85SJason Jin 0
170ece92f85SJason Jin REMARKS:
171ece92f85SJason Jin Default PIO long read function. Doesn't perform real inl.
172ece92f85SJason Jin ****************************************************************************/
173ece92f85SJason Jin static u32 X86API p_inl(X86EMU_pioAddr addr)
174ece92f85SJason Jin {
175ece92f85SJason Jin 	DB(if (DEBUG_IO_TRACE())
176ece92f85SJason Jin 	   printk("inl %#04x \n", addr);)
177ece92f85SJason Jin 		return 0;
178ece92f85SJason Jin }
179ece92f85SJason Jin 
180ece92f85SJason Jin /****************************************************************************
181ece92f85SJason Jin PARAMETERS:
182ece92f85SJason Jin addr    - PIO address to write
183ece92f85SJason Jin val     - Value to store
184ece92f85SJason Jin REMARKS:
185ece92f85SJason Jin Default PIO byte write function. Doesn't perform real outb.
186ece92f85SJason Jin ****************************************************************************/
187ece92f85SJason Jin static void X86API p_outb(X86EMU_pioAddr addr, u8 val)
188ece92f85SJason Jin {
189ece92f85SJason Jin 	DB(if (DEBUG_IO_TRACE())
190ece92f85SJason Jin 	   printk("outb %#02x -> %#04x \n", val, addr);)
191ece92f85SJason Jin 		return;
192ece92f85SJason Jin }
193ece92f85SJason Jin 
194ece92f85SJason Jin /****************************************************************************
195ece92f85SJason Jin PARAMETERS:
196ece92f85SJason Jin addr    - PIO address to write
197ece92f85SJason Jin val     - Value to store
198ece92f85SJason Jin REMARKS:
199ece92f85SJason Jin Default PIO word write function. Doesn't perform real outw.
200ece92f85SJason Jin ****************************************************************************/
201ece92f85SJason Jin static void X86API p_outw(X86EMU_pioAddr addr, u16 val)
202ece92f85SJason Jin {
203ece92f85SJason Jin 	DB(if (DEBUG_IO_TRACE())
204ece92f85SJason Jin 	   printk("outw %#04x -> %#04x \n", val, addr);)
205ece92f85SJason Jin 		return;
206ece92f85SJason Jin }
207ece92f85SJason Jin 
208ece92f85SJason Jin /****************************************************************************
209ece92f85SJason Jin PARAMETERS:
210ece92f85SJason Jin addr    - PIO address to write
211ece92f85SJason Jin val     - Value to store
212ece92f85SJason Jin REMARKS:
213ece92f85SJason Jin Default PIO ;ong write function. Doesn't perform real outl.
214ece92f85SJason Jin ****************************************************************************/
215ece92f85SJason Jin static void X86API p_outl(X86EMU_pioAddr addr, u32 val)
216ece92f85SJason Jin {
217ece92f85SJason Jin 	DB(if (DEBUG_IO_TRACE())
218ece92f85SJason Jin 	   printk("outl %#08x -> %#04x \n", val, addr);)
219ece92f85SJason Jin 		return;
220ece92f85SJason Jin }
221ece92f85SJason Jin 
222ece92f85SJason Jin /*------------------------- Global Variables ------------------------------*/
223ece92f85SJason Jin 
224ece92f85SJason Jin u8(X86APIP sys_rdb) (u32 addr) = rdb;
225ece92f85SJason Jin u16(X86APIP sys_rdw) (u32 addr) = rdw;
226ece92f85SJason Jin u32(X86APIP sys_rdl) (u32 addr) = rdl;
227ece92f85SJason Jin void (X86APIP sys_wrb) (u32 addr, u8 val) = wrb;
228ece92f85SJason Jin void (X86APIP sys_wrw) (u32 addr, u16 val) = wrw;
229ece92f85SJason Jin void (X86APIP sys_wrl) (u32 addr, u32 val) = wrl;
230ece92f85SJason Jin u8(X86APIP sys_inb) (X86EMU_pioAddr addr) = p_inb;
231ece92f85SJason Jin u16(X86APIP sys_inw) (X86EMU_pioAddr addr) = p_inw;
232ece92f85SJason Jin u32(X86APIP sys_inl) (X86EMU_pioAddr addr) = p_inl;
233ece92f85SJason Jin void (X86APIP sys_outb) (X86EMU_pioAddr addr, u8 val) = p_outb;
234ece92f85SJason Jin void (X86APIP sys_outw) (X86EMU_pioAddr addr, u16 val) = p_outw;
235ece92f85SJason Jin void (X86APIP sys_outl) (X86EMU_pioAddr addr, u32 val) = p_outl;
236ece92f85SJason Jin 
237ece92f85SJason Jin /*----------------------------- Setup -------------------------------------*/
238ece92f85SJason Jin 
239ece92f85SJason Jin /****************************************************************************
240ece92f85SJason Jin PARAMETERS:
241ece92f85SJason Jin funcs   - New memory function pointers to make active
242ece92f85SJason Jin 
243ece92f85SJason Jin REMARKS:
244ece92f85SJason Jin This function is used to set the pointers to functions which access
245ece92f85SJason Jin memory space, allowing the user application to override these functions
246ece92f85SJason Jin and hook them out as necessary for their application.
247ece92f85SJason Jin ****************************************************************************/
248ece92f85SJason Jin void X86EMU_setupMemFuncs(X86EMU_memFuncs * funcs)
249ece92f85SJason Jin {
250ece92f85SJason Jin 	sys_rdb = funcs->rdb;
251ece92f85SJason Jin 	sys_rdw = funcs->rdw;
252ece92f85SJason Jin 	sys_rdl = funcs->rdl;
253ece92f85SJason Jin 	sys_wrb = funcs->wrb;
254ece92f85SJason Jin 	sys_wrw = funcs->wrw;
255ece92f85SJason Jin 	sys_wrl = funcs->wrl;
256ece92f85SJason Jin }
257ece92f85SJason Jin 
258ece92f85SJason Jin /****************************************************************************
259ece92f85SJason Jin PARAMETERS:
260ece92f85SJason Jin funcs   - New programmed I/O function pointers to make active
261ece92f85SJason Jin 
262ece92f85SJason Jin REMARKS:
263ece92f85SJason Jin This function is used to set the pointers to functions which access
264ece92f85SJason Jin I/O space, allowing the user application to override these functions
265ece92f85SJason Jin and hook them out as necessary for their application.
266ece92f85SJason Jin ****************************************************************************/
267ece92f85SJason Jin void X86EMU_setupPioFuncs(X86EMU_pioFuncs * funcs)
268ece92f85SJason Jin {
269ece92f85SJason Jin 	sys_inb = funcs->inb;
270ece92f85SJason Jin 	sys_inw = funcs->inw;
271ece92f85SJason Jin 	sys_inl = funcs->inl;
272ece92f85SJason Jin 	sys_outb = funcs->outb;
273ece92f85SJason Jin 	sys_outw = funcs->outw;
274ece92f85SJason Jin 	sys_outl = funcs->outl;
275ece92f85SJason Jin }
276ece92f85SJason Jin 
277ece92f85SJason Jin /****************************************************************************
278ece92f85SJason Jin PARAMETERS:
279ece92f85SJason Jin funcs   - New interrupt vector table to make active
280ece92f85SJason Jin 
281ece92f85SJason Jin REMARKS:
282ece92f85SJason Jin This function is used to set the pointers to functions which handle
283ece92f85SJason Jin interrupt processing in the emulator, allowing the user application to
284ece92f85SJason Jin hook interrupts as necessary for their application. Any interrupts that
285ece92f85SJason Jin are not hooked by the user application, and reflected and handled internally
286ece92f85SJason Jin in the emulator via the interrupt vector table. This allows the application
287ece92f85SJason Jin to get control when the code being emulated executes specific software
288ece92f85SJason Jin interrupts.
289ece92f85SJason Jin ****************************************************************************/
290ece92f85SJason Jin void X86EMU_setupIntrFuncs(X86EMU_intrFuncs funcs[])
291ece92f85SJason Jin {
292ece92f85SJason Jin 	int i;
293ece92f85SJason Jin 
294ece92f85SJason Jin 	for (i = 0; i < 256; i++)
295ece92f85SJason Jin 		_X86EMU_intrTab[i] = NULL;
296ece92f85SJason Jin 	if (funcs) {
297ece92f85SJason Jin 		for (i = 0; i < 256; i++)
298ece92f85SJason Jin 			_X86EMU_intrTab[i] = funcs[i];
299ece92f85SJason Jin 	}
300ece92f85SJason Jin }
301ece92f85SJason Jin 
302ece92f85SJason Jin /****************************************************************************
303ece92f85SJason Jin PARAMETERS:
304ece92f85SJason Jin int - New software interrupt to prepare for
305ece92f85SJason Jin 
306ece92f85SJason Jin REMARKS:
307ece92f85SJason Jin This function is used to set up the emulator state to exceute a software
308ece92f85SJason Jin interrupt. This can be used by the user application code to allow an
309ece92f85SJason Jin interrupt to be hooked, examined and then reflected back to the emulator
310ece92f85SJason Jin so that the code in the emulator will continue processing the software
311ece92f85SJason Jin interrupt as per normal. This essentially allows system code to actively
312ece92f85SJason Jin hook and handle certain software interrupts as necessary.
313ece92f85SJason Jin ****************************************************************************/
314ece92f85SJason Jin void X86EMU_prepareForInt(int num)
315ece92f85SJason Jin {
316ece92f85SJason Jin 	push_word((u16) M.x86.R_FLG);
317ece92f85SJason Jin 	CLEAR_FLAG(F_IF);
318ece92f85SJason Jin 	CLEAR_FLAG(F_TF);
319ece92f85SJason Jin 	push_word(M.x86.R_CS);
320ece92f85SJason Jin 	M.x86.R_CS = mem_access_word(num * 4 + 2);
321ece92f85SJason Jin 	push_word(M.x86.R_IP);
322ece92f85SJason Jin 	M.x86.R_IP = mem_access_word(num * 4);
323ece92f85SJason Jin 	M.x86.intr = 0;
324ece92f85SJason Jin }
325ce981dc8SJason Jin 
326ce981dc8SJason Jin #endif
327