1 /****************************************************************************
2 *
3 *                        BIOS emulator and interface
4 *                      to Realmode X86 Emulator Library
5 *
6 *               Copyright (C) 1996-1999 SciTech Software, Inc.
7 *
8 *  ========================================================================
9 *
10 *  Permission to use, copy, modify, distribute, and sell this software and
11 *  its documentation for any purpose is hereby granted without fee,
12 *  provided that the above copyright notice appear in all copies and that
13 *  both that copyright notice and this permission notice appear in
14 *  supporting documentation, and that the name of the authors not be used
15 *  in advertising or publicity pertaining to distribution of the software
16 *  without specific, written prior permission.  The authors makes no
17 *  representations about the suitability of this software for any purpose.
18 *  It is provided "as is" without express or implied warranty.
19 *
20 *  THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
21 *  INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
22 *  EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
23 *  CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
24 *  USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
25 *  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
26 *  PERFORMANCE OF THIS SOFTWARE.
27 *
28 *  ========================================================================
29 *
30 * Language:     ANSI C
31 * Environment:  Any
32 * Developer:    Kendall Bennett
33 *
34 * Description:  Header file for the real mode x86 BIOS emulator, which is
35 *               used to warmboot any number of VGA compatible PCI/AGP
36 *               controllers under any OS, on any processor family that
37 *               supports PCI. We also allow the user application to call
38 *               real mode BIOS functions and Int 10h functions (including
39 *               the VESA BIOS).
40 *
41 ****************************************************************************/
42 
43 #ifndef __BIOSEMU_H
44 #define __BIOSEMU_H
45 
46 #include <bios_emul.h>
47 
48 #ifdef __KERNEL__
49 #include "x86emu.h"
50 #else
51 #include "x86emu.h"
52 #include "pmapi.h"
53 #include "pcilib.h"
54 #endif
55 
56 /*---------------------- Macros and type definitions ----------------------*/
57 
58 #pragma pack(1)
59 
60 #define CRT_C   24		/* 24  CRT Controller Registers             */
61 #define ATT_C   21		/* 21  Attribute Controller Registers       */
62 #define GRA_C   9		/* 9   Graphics Controller Registers        */
63 #define SEQ_C   5		/* 5   Sequencer Registers                  */
64 #define PAL_C   768		/* 768 Palette Registers                    */
65 
66 /****************************************************************************
67 REMARKS:
68 Data structure used to describe the details for the BIOS emulator system
69 environment as used by the X86 emulator library.
70 
71 HEADER:
72 biosemu.h
73 
74 MEMBERS:
75 vgaInfo         - VGA BIOS information structure
76 biosmem_base    - Base of the BIOS image
77 biosmem_limit   - Limit of the BIOS image
78 busmem_base     - Base of the VGA bus memory
79 timer           - Timer used to emulate PC timer ports
80 timer0          - Latched value for timer 0
81 timer0Latched   - true if timer 0 value was just latched
82 timer2          - Current value for timer 2
83 emulateVGA      - true to emulate VGA I/O and memory accesses
84 ****************************************************************************/
85 
86 typedef struct {
87 	BE_VGAInfo vgaInfo;
88 	ulong biosmem_base;
89 	ulong biosmem_limit;
90 	ulong busmem_base;
91 
92 	u32 timer0;
93 	int timer0Latched;
94 	u32 timer1;
95 	int timer1Latched;
96 	u32 timer2;
97 	int timer2Latched;
98 
99 	int emulateVGA;
100 	u8 emu61;
101 	u8 emu70;
102 	int flipFlop3C0;
103 	u32 configAddress;
104 	u8 emu3C0;
105 	u8 emu3C1[ATT_C];
106 	u8 emu3C2;
107 	u8 emu3C4;
108 	u8 emu3C5[SEQ_C];
109 	u8 emu3C6;
110 	uint emu3C7;
111 	uint emu3C8;
112 	u8 emu3C9[PAL_C];
113 	u8 emu3CE;
114 	u8 emu3CF[GRA_C];
115 	u8 emu3D4;
116 	u8 emu3D5[CRT_C];
117 	u8 emu3DA;
118 
119 } BE_sysEnv;
120 
121 #ifdef __KERNEL__
122 
123 /* Define some types when compiling for the Linux kernel that normally
124  * come from the SciTech PM library.
125  */
126 
127 /****************************************************************************
128 REMARKS:
129 Structure describing the 32-bit extended x86 CPU registers
130 
131 HEADER:
132 pmapi.h
133 
134 MEMBERS:
135 eax     - Value of the EAX register
136 ebx     - Value of the EBX register
137 ecx     - Value of the ECX register
138 edx     - Value of the EDX register
139 esi     - Value of the ESI register
140 edi     - Value of the EDI register
141 cflag   - Value of the carry flag
142 ****************************************************************************/
143 typedef struct {
144 	u32 eax;
145 	u32 ebx;
146 	u32 ecx;
147 	u32 edx;
148 	u32 esi;
149 	u32 edi;
150 	u32 cflag;
151 } RMDWORDREGS;
152 
153 /****************************************************************************
154 REMARKS:
155 Structure describing the 16-bit x86 CPU registers
156 
157 HEADER:
158 pmapi.h
159 
160 MEMBERS:
161 ax      - Value of the AX register
162 bx      - Value of the BX register
163 cx      - Value of the CX register
164 dx      - Value of the DX register
165 si      - Value of the SI register
166 di      - Value of the DI register
167 cflag   - Value of the carry flag
168 ****************************************************************************/
169 #ifdef __BIG_ENDIAN__
170 typedef struct {
171 	u16 ax_hi, ax;
172 	u16 bx_hi, bx;
173 	u16 cx_hi, cx;
174 	u16 dx_hi, dx;
175 	u16 si_hi, si;
176 	u16 di_hi, di;
177 	u16 cflag_hi, cflag;
178 } RMWORDREGS;
179 #else
180 typedef struct {
181 	u16 ax, ax_hi;
182 	u16 bx, bx_hi;
183 	u16 cx, cx_hi;
184 	u16 dx, dx_hi;
185 	u16 si, si_hi;
186 	u16 di, di_hi;
187 	u16 cflag, cflag_hi;
188 } RMWORDREGS;
189 #endif
190 
191 /****************************************************************************
192 REMARKS:
193 Structure describing the 8-bit x86 CPU registers
194 
195 HEADER:
196 pmapi.h
197 
198 MEMBERS:
199 al      - Value of the AL register
200 ah      - Value of the AH register
201 bl      - Value of the BL register
202 bh      - Value of the BH register
203 cl      - Value of the CL register
204 ch      - Value of the CH register
205 dl      - Value of the DL register
206 dh      - Value of the DH register
207 ****************************************************************************/
208 #ifdef __BIG_ENDIAN__
209 typedef struct {
210 	u16 ax_hi;
211 	u8 ah, al;
212 	u16 bx_hi;
213 	u8 bh, bl;
214 	u16 cx_hi;
215 	u8 ch, cl;
216 	u16 dx_hi;
217 	u8 dh, dl;
218 } RMBYTEREGS;
219 #else
220 typedef struct {
221 	u8 al;
222 	u8 ah;
223 	u16 ax_hi;
224 	u8 bl;
225 	u8 bh;
226 	u16 bx_hi;
227 	u8 cl;
228 	u8 ch;
229 	u16 cx_hi;
230 	u8 dl;
231 	u8 dh;
232 	u16 dx_hi;
233 } RMBYTEREGS;
234 #endif
235 
236 /****************************************************************************
237 REMARKS:
238 Structure describing all the x86 CPU registers
239 
240 HEADER:
241 pmapi.h
242 
243 MEMBERS:
244 e   - Member to access registers as 32-bit values
245 x   - Member to access registers as 16-bit values
246 h   - Member to access registers as 8-bit values
247 ****************************************************************************/
248 typedef union {
249 	RMDWORDREGS e;
250 	RMWORDREGS x;
251 	RMBYTEREGS h;
252 } RMREGS;
253 
254 /****************************************************************************
255 REMARKS:
256 Structure describing all the x86 segment registers
257 
258 HEADER:
259 pmapi.h
260 
261 MEMBERS:
262 es  - ES segment register
263 cs  - CS segment register
264 ss  - SS segment register
265 ds  - DS segment register
266 fs  - FS segment register
267 gs  - GS segment register
268 ****************************************************************************/
269 typedef struct {
270 	u16 es;
271 	u16 cs;
272 	u16 ss;
273 	u16 ds;
274 	u16 fs;
275 	u16 gs;
276 } RMSREGS;
277 
278 #endif				/* __KERNEL__ */
279 
280 #ifndef __KERNEL__
281 
282 /****************************************************************************
283 REMARKS:
284 Structure defining all the BIOS Emulator API functions as exported from
285 the Binary Portable DLL.
286 {secret}
287 ****************************************************************************/
288 typedef struct {
289 	ulong dwSize;
290 	 ibool(PMAPIP BE_init) (u32 debugFlags, int memSize, BE_VGAInfo * info);
291 	void (PMAPIP BE_setVGA) (BE_VGAInfo * info);
292 	void (PMAPIP BE_getVGA) (BE_VGAInfo * info);
293 	void *(PMAPIP BE_mapRealPointer) (uint r_seg, uint r_off);
294 	void *(PMAPIP BE_getVESABuf) (uint * len, uint * rseg, uint * roff);
295 	void (PMAPIP BE_callRealMode) (uint seg, uint off, RMREGS * regs,
296 				       RMSREGS * sregs);
297 	int (PMAPIP BE_int86) (int intno, RMREGS * in, RMREGS * out);
298 	int (PMAPIP BE_int86x) (int intno, RMREGS * in, RMREGS * out,
299 				RMSREGS * sregs);
300 	void *reserved1;
301 	void (PMAPIP BE_exit) (void);
302 } BE_exports;
303 
304 /****************************************************************************
305 REMARKS:
306 Function pointer type for the Binary Portable DLL initialisation entry point.
307 {secret}
308 ****************************************************************************/
309 typedef BE_exports *(PMAPIP BE_initLibrary_t) (PM_imports * PMImp);
310 #endif
311 
312 #pragma pack()
313 
314 /*---------------------------- Global variables ---------------------------*/
315 
316 #ifdef  __cplusplus
317 extern "C" {			/* Use "C" linkage when in C++ mode */
318 #endif
319 
320 /* {secret} Global BIOS emulator system environment */
321 	extern BE_sysEnv _BE_env;
322 
323 /*-------------------------- Function Prototypes --------------------------*/
324 
325 /* BIOS emulator library entry points */
326 	int X86API BE_init(u32 debugFlags, int memSize, BE_VGAInfo * info,
327 			   int shared);
328 	void X86API BE_setVGA(BE_VGAInfo * info);
329 	void X86API BE_getVGA(BE_VGAInfo * info);
330 	void X86API BE_setDebugFlags(u32 debugFlags);
331 	void *X86API BE_mapRealPointer(uint r_seg, uint r_off);
332 	void *X86API BE_getVESABuf(uint * len, uint * rseg, uint * roff);
333 	void X86API BE_callRealMode(uint seg, uint off, RMREGS * regs,
334 				    RMSREGS * sregs);
335 	int X86API BE_int86(int intno, RMREGS * in, RMREGS * out);
336 	int X86API BE_int86x(int intno, RMREGS * in, RMREGS * out,
337 			     RMSREGS * sregs);
338 	void X86API BE_exit(void);
339 
340 #ifdef  __cplusplus
341 }				/* End of "C" linkage for C++       */
342 #endif
343 #endif				/* __BIOSEMU_H */
344