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#ifdef __KERNEL__ 47#include "x86emu.h" 48#else 49#include "x86emu.h" 50#include "pmapi.h" 51#include "pcilib.h" 52#endif 53 54/*---------------------- Macros and type definitions ----------------------*/ 55 56#pragma pack(1) 57 58#ifndef __KERNEL__ 59/**************************************************************************** 60REMARKS: 61Data structure used to describe the details specific to a particular VGA 62controller. This information is used to allow the VGA controller to be 63swapped on the fly within the BIOS emulator. 64 65HEADER: 66biosemu.h 67 68MEMBERS: 69pciInfo - PCI device information block for the controller 70BIOSImage - Pointer to a read/write copy of the BIOS image 71BIOSImageLen - Length of the BIOS image 72LowMem - Copy of key low memory areas 73****************************************************************************/ 74typedef struct { 75 PCIDeviceInfo *pciInfo; 76 void *BIOSImage; 77 ulong BIOSImageLen; 78 uchar LowMem[1536]; 79} BE_VGAInfo; 80#else 81/**************************************************************************** 82REMARKS: 83Data structure used to describe the details for the BIOS emulator system 84environment as used by the X86 emulator library. 85 86HEADER: 87biosemu.h 88 89MEMBERS: 90vgaInfo - VGA BIOS information structure 91biosmem_base - Base of the BIOS image 92biosmem_limit - Limit of the BIOS image 93busmem_base - Base of the VGA bus memory 94****************************************************************************/ 95typedef struct { 96 int function; 97 int device; 98 int bus; 99 u32 VendorID; 100 u32 DeviceID; 101 pci_dev_t pcidev; 102 void *BIOSImage; 103 u32 BIOSImageLen; 104 u8 LowMem[1536]; 105} BE_VGAInfo; 106 107#endif /* __KERNEL__ */ 108 109#define CRT_C 24 /* 24 CRT Controller Registers */ 110#define ATT_C 21 /* 21 Attribute Controller Registers */ 111#define GRA_C 9 /* 9 Graphics Controller Registers */ 112#define SEQ_C 5 /* 5 Sequencer Registers */ 113#define PAL_C 768 /* 768 Palette Registers */ 114 115/**************************************************************************** 116REMARKS: 117Data structure used to describe the details for the BIOS emulator system 118environment as used by the X86 emulator library. 119 120HEADER: 121biosemu.h 122 123MEMBERS: 124vgaInfo - VGA BIOS information structure 125biosmem_base - Base of the BIOS image 126biosmem_limit - Limit of the BIOS image 127busmem_base - Base of the VGA bus memory 128timer - Timer used to emulate PC timer ports 129timer0 - Latched value for timer 0 130timer0Latched - true if timer 0 value was just latched 131timer2 - Current value for timer 2 132emulateVGA - true to emulate VGA I/O and memory accesses 133****************************************************************************/ 134 135typedef struct { 136 BE_VGAInfo vgaInfo; 137 ulong biosmem_base; 138 ulong biosmem_limit; 139 ulong busmem_base; 140 141 u32 timer0; 142 int timer0Latched; 143 u32 timer1; 144 int timer1Latched; 145 u32 timer2; 146 int timer2Latched; 147 148 int emulateVGA; 149 u8 emu61; 150 u8 emu70; 151 int flipFlop3C0; 152 u32 configAddress; 153 u8 emu3C0; 154 u8 emu3C1[ATT_C]; 155 u8 emu3C2; 156 u8 emu3C4; 157 u8 emu3C5[SEQ_C]; 158 u8 emu3C6; 159 uint emu3C7; 160 uint emu3C8; 161 u8 emu3C9[PAL_C]; 162 u8 emu3CE; 163 u8 emu3CF[GRA_C]; 164 u8 emu3D4; 165 u8 emu3D5[CRT_C]; 166 u8 emu3DA; 167 168} BE_sysEnv; 169 170#ifdef __KERNEL__ 171 172/* Define some types when compiling for the Linux kernel that normally 173 * come from the SciTech PM library. 174 */ 175 176/**************************************************************************** 177REMARKS: 178Structure describing the 32-bit extended x86 CPU registers 179 180HEADER: 181pmapi.h 182 183MEMBERS: 184eax - Value of the EAX register 185ebx - Value of the EBX register 186ecx - Value of the ECX register 187edx - Value of the EDX register 188esi - Value of the ESI register 189edi - Value of the EDI register 190cflag - Value of the carry flag 191****************************************************************************/ 192typedef struct { 193 u32 eax; 194 u32 ebx; 195 u32 ecx; 196 u32 edx; 197 u32 esi; 198 u32 edi; 199 u32 cflag; 200} RMDWORDREGS; 201 202/**************************************************************************** 203REMARKS: 204Structure describing the 16-bit x86 CPU registers 205 206HEADER: 207pmapi.h 208 209MEMBERS: 210ax - Value of the AX register 211bx - Value of the BX register 212cx - Value of the CX register 213dx - Value of the DX register 214si - Value of the SI register 215di - Value of the DI register 216cflag - Value of the carry flag 217****************************************************************************/ 218#ifdef __BIG_ENDIAN__ 219typedef struct { 220 u16 ax_hi, ax; 221 u16 bx_hi, bx; 222 u16 cx_hi, cx; 223 u16 dx_hi, dx; 224 u16 si_hi, si; 225 u16 di_hi, di; 226 u16 cflag_hi, cflag; 227} RMWORDREGS; 228#else 229typedef struct { 230 u16 ax, ax_hi; 231 u16 bx, bx_hi; 232 u16 cx, cx_hi; 233 u16 dx, dx_hi; 234 u16 si, si_hi; 235 u16 di, di_hi; 236 u16 cflag, cflag_hi; 237} RMWORDREGS; 238#endif 239 240/**************************************************************************** 241REMARKS: 242Structure describing the 8-bit x86 CPU registers 243 244HEADER: 245pmapi.h 246 247MEMBERS: 248al - Value of the AL register 249ah - Value of the AH register 250bl - Value of the BL register 251bh - Value of the BH register 252cl - Value of the CL register 253ch - Value of the CH register 254dl - Value of the DL register 255dh - Value of the DH register 256****************************************************************************/ 257#ifdef __BIG_ENDIAN__ 258typedef struct { 259 u16 ax_hi; 260 u8 ah, al; 261 u16 bx_hi; 262 u8 bh, bl; 263 u16 cx_hi; 264 u8 ch, cl; 265 u16 dx_hi; 266 u8 dh, dl; 267} RMBYTEREGS; 268#else 269typedef struct { 270 u8 al; 271 u8 ah; 272 u16 ax_hi; 273 u8 bl; 274 u8 bh; 275 u16 bx_hi; 276 u8 cl; 277 u8 ch; 278 u16 cx_hi; 279 u8 dl; 280 u8 dh; 281 u16 dx_hi; 282} RMBYTEREGS; 283#endif 284 285/**************************************************************************** 286REMARKS: 287Structure describing all the x86 CPU registers 288 289HEADER: 290pmapi.h 291 292MEMBERS: 293e - Member to access registers as 32-bit values 294x - Member to access registers as 16-bit values 295h - Member to access registers as 8-bit values 296****************************************************************************/ 297typedef union { 298 RMDWORDREGS e; 299 RMWORDREGS x; 300 RMBYTEREGS h; 301} RMREGS; 302 303/**************************************************************************** 304REMARKS: 305Structure describing all the x86 segment registers 306 307HEADER: 308pmapi.h 309 310MEMBERS: 311es - ES segment register 312cs - CS segment register 313ss - SS segment register 314ds - DS segment register 315fs - FS segment register 316gs - GS segment register 317****************************************************************************/ 318typedef struct { 319 u16 es; 320 u16 cs; 321 u16 ss; 322 u16 ds; 323 u16 fs; 324 u16 gs; 325} RMSREGS; 326 327#endif /* __KERNEL__ */ 328 329#ifndef __KERNEL__ 330 331/**************************************************************************** 332REMARKS: 333Structure defining all the BIOS Emulator API functions as exported from 334the Binary Portable DLL. 335{secret} 336****************************************************************************/ 337typedef struct { 338 ulong dwSize; 339 ibool(PMAPIP BE_init) (u32 debugFlags, int memSize, BE_VGAInfo * info); 340 void (PMAPIP BE_setVGA) (BE_VGAInfo * info); 341 void (PMAPIP BE_getVGA) (BE_VGAInfo * info); 342 void *(PMAPIP BE_mapRealPointer) (uint r_seg, uint r_off); 343 void *(PMAPIP BE_getVESABuf) (uint * len, uint * rseg, uint * roff); 344 void (PMAPIP BE_callRealMode) (uint seg, uint off, RMREGS * regs, 345 RMSREGS * sregs); 346 int (PMAPIP BE_int86) (int intno, RMREGS * in, RMREGS * out); 347 int (PMAPIP BE_int86x) (int intno, RMREGS * in, RMREGS * out, 348 RMSREGS * sregs); 349 void *reserved1; 350 void (PMAPIP BE_exit) (void); 351} BE_exports; 352 353/**************************************************************************** 354REMARKS: 355Function pointer type for the Binary Portable DLL initialisation entry point. 356{secret} 357****************************************************************************/ 358typedef BE_exports *(PMAPIP BE_initLibrary_t) (PM_imports * PMImp); 359#endif 360 361#pragma pack() 362 363/*---------------------------- Global variables ---------------------------*/ 364 365#ifdef __cplusplus 366extern "C" { /* Use "C" linkage when in C++ mode */ 367#endif 368 369/* {secret} Global BIOS emulator system environment */ 370 extern BE_sysEnv _BE_env; 371 372/*-------------------------- Function Prototypes --------------------------*/ 373 374/* BIOS emulator library entry points */ 375 int X86API BE_init(u32 debugFlags, int memSize, BE_VGAInfo * info, 376 int shared); 377 void X86API BE_setVGA(BE_VGAInfo * info); 378 void X86API BE_getVGA(BE_VGAInfo * info); 379 void X86API BE_setDebugFlags(u32 debugFlags); 380 void *X86API BE_mapRealPointer(uint r_seg, uint r_off); 381 void *X86API BE_getVESABuf(uint * len, uint * rseg, uint * roff); 382 void X86API BE_callRealMode(uint seg, uint off, RMREGS * regs, 383 RMSREGS * sregs); 384 int X86API BE_int86(int intno, RMREGS * in, RMREGS * out); 385 int X86API BE_int86x(int intno, RMREGS * in, RMREGS * out, 386 RMSREGS * sregs); 387 void X86API BE_exit(void); 388 389#ifdef __cplusplus 390} /* End of "C" linkage for C++ */ 391#endif 392#endif /* __BIOSEMU_H */ 393