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