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