1 /****************************************************************************
2 *
3 *                       Realmode X86 Emulator Library
4 *
5 *               Copyright (C) 1996-1999 SciTech Software, Inc.
6 *                    Copyright (C) David Mosberger-Tang
7 *                      Copyright (C) 1999 Egbert Eich
8 *
9 *  ========================================================================
10 *
11 *  Permission to use, copy, modify, distribute, and sell this software and
12 *  its documentation for any purpose is hereby granted without fee,
13 *  provided that the above copyright notice appear in all copies and that
14 *  both that copyright notice and this permission notice appear in
15 *  supporting documentation, and that the name of the authors not be used
16 *  in advertising or publicity pertaining to distribution of the software
17 *  without specific, written prior permission.  The authors makes no
18 *  representations about the suitability of this software for any purpose.
19 *  It is provided "as is" without express or implied warranty.
20 *
21 *  THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
22 *  INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
23 *  EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
24 *  CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
25 *  USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
26 *  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
27 *  PERFORMANCE OF THIS SOFTWARE.
28 *
29 *  ========================================================================
30 *
31 * Language:     ANSI C
32 * Environment:  Any
33 * Developer:    Kendall Bennett
34 *
35 * Description:  Header file for public specific functions.
36 *               Any application linking against us should only
37 *               include this header
38 *
39 ****************************************************************************/
40 
41 #ifndef __X86EMU_X86EMU_H
42 #define __X86EMU_X86EMU_H
43 
44 #include <asm/types.h>
45 #include <pci.h>
46 #include <asm/io.h>
47 #define X86API
48 #define X86APIP *
49 typedef u16 X86EMU_pioAddr;
50 
51 #include "x86emu/regs.h"
52 
53 /*---------------------- Macros and type definitions ----------------------*/
54 
55 #if defined(CONFIG_ARM)
56 #define GAS_LINE_COMMENT	"@"
57 #elif defined(CONFIG_MIPS) || defined(CONFIG_PPC) || defined(CONFIG_X86) || defined(CONFIG_RISCV)
58 #define GAS_LINE_COMMENT	"#"
59 #elif defined (CONFIG_SH)
60 #define GAS_LINE_COMMENT	"!"
61 #endif
62 
63 #define GOT2_TYPE	".got2,\"aw\"\t"GAS_LINE_COMMENT
64 
65 #pragma pack(1)
66 
67 /****************************************************************************
68 REMARKS:
69 Data structure containing ponters to programmed I/O functions used by the
70 emulator. This is used so that the user program can hook all programmed
71 I/O for the emulator to handled as necessary by the user program. By
72 default the emulator contains simple functions that do not do access the
73 hardware in any way. To allow the emualtor access the hardware, you will
74 need to override the programmed I/O functions using the X86EMU_setupPioFuncs
75 function.
76 
77 HEADER:
78 x86emu.h
79 
80 MEMBERS:
81 inb     - Function to read a byte from an I/O port
82 inw     - Function to read a word from an I/O port
83 inl     - Function to read a dword from an I/O port
84 outb    - Function to write a byte to an I/O port
85 outw    - Function to write a word to an I/O port
86 outl    - Function to write a dword to an I/O port
87 ****************************************************************************/
88 typedef struct {
89 	u8(X86APIP inb) (X86EMU_pioAddr addr);
90 	u16(X86APIP inw) (X86EMU_pioAddr addr);
91 	u32(X86APIP inl) (X86EMU_pioAddr addr);
92 	void (X86APIP outb) (X86EMU_pioAddr addr, u8 val);
93 	void (X86APIP outw) (X86EMU_pioAddr addr, u16 val);
94 	void (X86APIP outl) (X86EMU_pioAddr addr, u32 val);
95 } X86EMU_pioFuncs;
96 
97 /****************************************************************************
98 REMARKS:
99 Data structure containing ponters to memory access functions used by the
100 emulator. This is used so that the user program can hook all memory
101 access functions as necessary for the emulator. By default the emulator
102 contains simple functions that only access the internal memory of the
103 emulator. If you need specialised functions to handle access to different
104 types of memory (ie: hardware framebuffer accesses and BIOS memory access
105 etc), you will need to override this using the X86EMU_setupMemFuncs
106 function.
107 
108 HEADER:
109 x86emu.h
110 
111 MEMBERS:
112 rdb     - Function to read a byte from an address
113 rdw     - Function to read a word from an address
114 rdl     - Function to read a dword from an address
115 wrb     - Function to write a byte to an address
116 wrw     - Function to write a word to an address
117 wrl     - Function to write a dword to an address
118 ****************************************************************************/
119 typedef struct {
120 	u8(X86APIP rdb) (u32 addr);
121 	u16(X86APIP rdw) (u32 addr);
122 	u32(X86APIP rdl) (u32 addr);
123 	void (X86APIP wrb) (u32 addr, u8 val);
124 	void (X86APIP wrw) (u32 addr, u16 val);
125 	void (X86APIP wrl) (u32 addr, u32 val);
126 } X86EMU_memFuncs;
127 
128 /****************************************************************************
129   Here are the default memory read and write
130   function in case they are needed as fallbacks.
131 ***************************************************************************/
132 extern u8 X86API rdb(u32 addr);
133 extern u16 X86API rdw(u32 addr);
134 extern u32 X86API rdl(u32 addr);
135 extern void X86API wrb(u32 addr, u8 val);
136 extern void X86API wrw(u32 addr, u16 val);
137 extern void X86API wrl(u32 addr, u32 val);
138 
139 #pragma pack()
140 
141 /*--------------------- type definitions -----------------------------------*/
142 
143 typedef void (X86APIP X86EMU_intrFuncs) (int num);
144 extern X86EMU_intrFuncs _X86EMU_intrTab[256];
145 
146 /*-------------------------- Function Prototypes --------------------------*/
147 
148 #ifdef  __cplusplus
149 extern "C" {			/* Use "C" linkage when in C++ mode */
150 #endif
151 
152 	void X86EMU_setupMemFuncs(X86EMU_memFuncs * funcs);
153 	void X86EMU_setupPioFuncs(X86EMU_pioFuncs * funcs);
154 	void X86EMU_setupIntrFuncs(X86EMU_intrFuncs funcs[]);
155 	void X86EMU_setupIntrFunc(int intnum, X86EMU_intrFuncs func);
156 	void X86EMU_prepareForInt(int num);
157 
158 /* decode.c */
159 
160 	void X86EMU_exec(void);
161 	void X86EMU_halt_sys(void);
162 
163 #ifdef CONFIG_X86EMU_DEBUG
164 #define HALT_SYS()  \
165     printf("halt_sys: file %s, line %d\n", __FILE__, __LINE__), \
166     X86EMU_halt_sys()
167 #else
168 #define HALT_SYS()  X86EMU_halt_sys()
169 #endif
170 
171 /* Debug options */
172 
173 #define DEBUG_DECODE_F          0x0001	/* print decoded instruction  */
174 #define DEBUG_TRACE_F           0x0002	/* dump regs before/after execution */
175 #define DEBUG_STEP_F            0x0004
176 #define DEBUG_DISASSEMBLE_F     0x0008
177 #define DEBUG_BREAK_F           0x0010
178 #define DEBUG_SVC_F             0x0020
179 #define DEBUG_SAVE_CS_IP        0x0040
180 #define DEBUG_FS_F              0x0080
181 #define DEBUG_PROC_F            0x0100
182 #define DEBUG_SYSINT_F          0x0200	/* bios system interrupts. */
183 #define DEBUG_TRACECALL_F       0x0400
184 #define DEBUG_INSTRUMENT_F      0x0800
185 #define DEBUG_MEM_TRACE_F       0x1000
186 #define DEBUG_IO_TRACE_F        0x2000
187 #define DEBUG_TRACECALL_REGS_F  0x4000
188 #define DEBUG_DECODE_NOPRINT_F  0x8000
189 #define DEBUG_EXIT              0x10000
190 #define DEBUG_SYS_F             (DEBUG_SVC_F|DEBUG_FS_F|DEBUG_PROC_F)
191 
192 	void X86EMU_trace_regs(void);
193 	void X86EMU_trace_xregs(void);
194 	void X86EMU_dump_memory(u16 seg, u16 off, u32 amt);
195 	int X86EMU_trace_on(void);
196 	int X86EMU_trace_off(void);
197 
198 #ifdef  __cplusplus
199 }				/* End of "C" linkage for C++       */
200 #endif
201 #endif				/* __X86EMU_X86EMU_H */
202