| /**************************************************************************** | |
| * | |
| * BIOS emulator and interface | |
| * to Realmode X86 Emulator Library | |
| * | |
| * Copyright (C) 1996-1999 SciTech Software, Inc. | |
| * | |
| * ======================================================================== | |
| * | |
| * Permission to use, copy, modify, distribute, and sell this software and | |
| * its documentation for any purpose is hereby granted without fee, | |
| * provided that the above copyright notice appear in all copies and that | |
| * both that copyright notice and this permission notice appear in | |
| * supporting documentation, and that the name of the authors not be used | |
| * in advertising or publicity pertaining to distribution of the software | |
| * without specific, written prior permission. The authors makes no | |
| * representations about the suitability of this software for any purpose. | |
| * It is provided "as is" without express or implied warranty. | |
| * | |
| * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, | |
| * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO | |
| * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR | |
| * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF | |
| * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | |
| * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | |
| * PERFORMANCE OF THIS SOFTWARE. | |
| * | |
| * ======================================================================== | |
| * | |
| * Language: ANSI C | |
| * Environment: Any | |
| * Developer: Kendall Bennett | |
| * | |
| * Description: Header file for the real mode x86 BIOS emulator, which is | |
| * used to warmboot any number of VGA compatible PCI/AGP | |
| * controllers under any OS, on any processor family that | |
| * supports PCI. We also allow the user application to call | |
| * real mode BIOS functions and Int 10h functions (including | |
| * the VESA BIOS). | |
| * | |
| ****************************************************************************/ | |
| #ifndef __BIOSEMU_H | |
| #define __BIOSEMU_H | |
| #include <bios_emul.h> | |
| #ifdef __KERNEL__ | |
| #include "x86emu.h" | |
| #else | |
| #include "x86emu.h" | |
| #include "pmapi.h" | |
| #include "pcilib.h" | |
| #endif | |
| /*---------------------- Macros and type definitions ----------------------*/ | |
| #pragma pack(1) | |
| #define CRT_C 24 /* 24 CRT Controller Registers */ | |
| #define ATT_C 21 /* 21 Attribute Controller Registers */ | |
| #define GRA_C 9 /* 9 Graphics Controller Registers */ | |
| #define SEQ_C 5 /* 5 Sequencer Registers */ | |
| #define PAL_C 768 /* 768 Palette Registers */ | |
| /**************************************************************************** | |
| REMARKS: | |
| Data structure used to describe the details for the BIOS emulator system | |
| environment as used by the X86 emulator library. | |
| HEADER: | |
| biosemu.h | |
| MEMBERS: | |
| vgaInfo - VGA BIOS information structure | |
| biosmem_base - Base of the BIOS image | |
| biosmem_limit - Limit of the BIOS image | |
| busmem_base - Base of the VGA bus memory | |
| timer - Timer used to emulate PC timer ports | |
| timer0 - Latched value for timer 0 | |
| timer0Latched - true if timer 0 value was just latched | |
| timer2 - Current value for timer 2 | |
| emulateVGA - true to emulate VGA I/O and memory accesses | |
| ****************************************************************************/ | |
| typedef struct { | |
| BE_VGAInfo vgaInfo; | |
| ulong biosmem_base; | |
| ulong biosmem_limit; | |
| ulong busmem_base; | |
| u32 timer0; | |
| int timer0Latched; | |
| u32 timer1; | |
| int timer1Latched; | |
| u32 timer2; | |
| int timer2Latched; | |
| int emulateVGA; | |
| u8 emu61; | |
| u8 emu70; | |
| int flipFlop3C0; | |
| u32 configAddress; | |
| u8 emu3C0; | |
| u8 emu3C1[ATT_C]; | |
| u8 emu3C2; | |
| u8 emu3C4; | |
| u8 emu3C5[SEQ_C]; | |
| u8 emu3C6; | |
| uint emu3C7; | |
| uint emu3C8; | |
| u8 emu3C9[PAL_C]; | |
| u8 emu3CE; | |
| u8 emu3CF[GRA_C]; | |
| u8 emu3D4; | |
| u8 emu3D5[CRT_C]; | |
| u8 emu3DA; | |
| } BE_sysEnv; | |
| #ifdef __KERNEL__ | |
| /* Define some types when compiling for the Linux kernel that normally | |
| * come from the SciTech PM library. | |
| */ | |
| /**************************************************************************** | |
| REMARKS: | |
| Structure describing the 32-bit extended x86 CPU registers | |
| HEADER: | |
| pmapi.h | |
| MEMBERS: | |
| eax - Value of the EAX register | |
| ebx - Value of the EBX register | |
| ecx - Value of the ECX register | |
| edx - Value of the EDX register | |
| esi - Value of the ESI register | |
| edi - Value of the EDI register | |
| cflag - Value of the carry flag | |
| ****************************************************************************/ | |
| typedef struct { | |
| u32 eax; | |
| u32 ebx; | |
| u32 ecx; | |
| u32 edx; | |
| u32 esi; | |
| u32 edi; | |
| u32 cflag; | |
| } RMDWORDREGS; | |
| /**************************************************************************** | |
| REMARKS: | |
| Structure describing the 16-bit x86 CPU registers | |
| HEADER: | |
| pmapi.h | |
| MEMBERS: | |
| ax - Value of the AX register | |
| bx - Value of the BX register | |
| cx - Value of the CX register | |
| dx - Value of the DX register | |
| si - Value of the SI register | |
| di - Value of the DI register | |
| cflag - Value of the carry flag | |
| ****************************************************************************/ | |
| #ifdef __BIG_ENDIAN__ | |
| typedef struct { | |
| u16 ax_hi, ax; | |
| u16 bx_hi, bx; | |
| u16 cx_hi, cx; | |
| u16 dx_hi, dx; | |
| u16 si_hi, si; | |
| u16 di_hi, di; | |
| u16 cflag_hi, cflag; | |
| } RMWORDREGS; | |
| #else | |
| typedef struct { | |
| u16 ax, ax_hi; | |
| u16 bx, bx_hi; | |
| u16 cx, cx_hi; | |
| u16 dx, dx_hi; | |
| u16 si, si_hi; | |
| u16 di, di_hi; | |
| u16 cflag, cflag_hi; | |
| } RMWORDREGS; | |
| #endif | |
| /**************************************************************************** | |
| REMARKS: | |
| Structure describing the 8-bit x86 CPU registers | |
| HEADER: | |
| pmapi.h | |
| MEMBERS: | |
| al - Value of the AL register | |
| ah - Value of the AH register | |
| bl - Value of the BL register | |
| bh - Value of the BH register | |
| cl - Value of the CL register | |
| ch - Value of the CH register | |
| dl - Value of the DL register | |
| dh - Value of the DH register | |
| ****************************************************************************/ | |
| #ifdef __BIG_ENDIAN__ | |
| typedef struct { | |
| u16 ax_hi; | |
| u8 ah, al; | |
| u16 bx_hi; | |
| u8 bh, bl; | |
| u16 cx_hi; | |
| u8 ch, cl; | |
| u16 dx_hi; | |
| u8 dh, dl; | |
| } RMBYTEREGS; | |
| #else | |
| typedef struct { | |
| u8 al; | |
| u8 ah; | |
| u16 ax_hi; | |
| u8 bl; | |
| u8 bh; | |
| u16 bx_hi; | |
| u8 cl; | |
| u8 ch; | |
| u16 cx_hi; | |
| u8 dl; | |
| u8 dh; | |
| u16 dx_hi; | |
| } RMBYTEREGS; | |
| #endif | |
| /**************************************************************************** | |
| REMARKS: | |
| Structure describing all the x86 CPU registers | |
| HEADER: | |
| pmapi.h | |
| MEMBERS: | |
| e - Member to access registers as 32-bit values | |
| x - Member to access registers as 16-bit values | |
| h - Member to access registers as 8-bit values | |
| ****************************************************************************/ | |
| typedef union { | |
| RMDWORDREGS e; | |
| RMWORDREGS x; | |
| RMBYTEREGS h; | |
| } RMREGS; | |
| /**************************************************************************** | |
| REMARKS: | |
| Structure describing all the x86 segment registers | |
| HEADER: | |
| pmapi.h | |
| MEMBERS: | |
| es - ES segment register | |
| cs - CS segment register | |
| ss - SS segment register | |
| ds - DS segment register | |
| fs - FS segment register | |
| gs - GS segment register | |
| ****************************************************************************/ | |
| typedef struct { | |
| u16 es; | |
| u16 cs; | |
| u16 ss; | |
| u16 ds; | |
| u16 fs; | |
| u16 gs; | |
| } RMSREGS; | |
| #endif /* __KERNEL__ */ | |
| #ifndef __KERNEL__ | |
| /**************************************************************************** | |
| REMARKS: | |
| Structure defining all the BIOS Emulator API functions as exported from | |
| the Binary Portable DLL. | |
| {secret} | |
| ****************************************************************************/ | |
| typedef struct { | |
| ulong dwSize; | |
| ibool(PMAPIP BE_init) (u32 debugFlags, int memSize, BE_VGAInfo * info); | |
| void (PMAPIP BE_setVGA) (BE_VGAInfo * info); | |
| void (PMAPIP BE_getVGA) (BE_VGAInfo * info); | |
| void *(PMAPIP BE_mapRealPointer) (uint r_seg, uint r_off); | |
| void *(PMAPIP BE_getVESABuf) (uint * len, uint * rseg, uint * roff); | |
| void (PMAPIP BE_callRealMode) (uint seg, uint off, RMREGS * regs, | |
| RMSREGS * sregs); | |
| int (PMAPIP BE_int86) (int intno, RMREGS * in, RMREGS * out); | |
| int (PMAPIP BE_int86x) (int intno, RMREGS * in, RMREGS * out, | |
| RMSREGS * sregs); | |
| void *reserved1; | |
| void (PMAPIP BE_exit) (void); | |
| } BE_exports; | |
| /**************************************************************************** | |
| REMARKS: | |
| Function pointer type for the Binary Portable DLL initialisation entry point. | |
| {secret} | |
| ****************************************************************************/ | |
| typedef BE_exports *(PMAPIP BE_initLibrary_t) (PM_imports * PMImp); | |
| #endif | |
| #pragma pack() | |
| /*---------------------------- Global variables ---------------------------*/ | |
| #ifdef __cplusplus | |
| extern "C" { /* Use "C" linkage when in C++ mode */ | |
| #endif | |
| /* {secret} Global BIOS emulator system environment */ | |
| extern BE_sysEnv _BE_env; | |
| /*-------------------------- Function Prototypes --------------------------*/ | |
| /* BIOS emulator library entry points */ | |
| int X86API BE_init(u32 debugFlags, int memSize, BE_VGAInfo * info, | |
| int shared); | |
| void X86API BE_setVGA(BE_VGAInfo * info); | |
| void X86API BE_getVGA(BE_VGAInfo * info); | |
| void X86API BE_setDebugFlags(u32 debugFlags); | |
| void *X86API BE_mapRealPointer(uint r_seg, uint r_off); | |
| void *X86API BE_getVESABuf(uint * len, uint * rseg, uint * roff); | |
| void X86API BE_callRealMode(uint seg, uint off, RMREGS * regs, | |
| RMSREGS * sregs); | |
| int X86API BE_int86(int intno, RMREGS * in, RMREGS * out); | |
| int X86API BE_int86x(int intno, RMREGS * in, RMREGS * out, | |
| RMSREGS * sregs); | |
| void X86API BE_exit(void); | |
| #ifdef __cplusplus | |
| } /* End of "C" linkage for C++ */ | |
| #endif | |
| #endif /* __BIOSEMU_H */ |