diff options
Diffstat (limited to 'x86emu/include/xf86int10.h')
-rw-r--r-- | x86emu/include/xf86int10.h | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/x86emu/include/xf86int10.h b/x86emu/include/xf86int10.h new file mode 100644 index 0000000..d869fc1 --- /dev/null +++ b/x86emu/include/xf86int10.h @@ -0,0 +1,212 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/int10/xf86int10.h,v 1.23 2002/04/04 14:05:51 eich Exp $ */ +/* + * XFree86 int10 module + * execute BIOS int 10h calls in x86 real mode environment + * Copyright 1999 Egbert Eich + */ +#ifndef _XF86INT10_H +#define _XF86INT10_H + +#include "types.h" + +#define SEG_ADDR(x) (((x) >> 4) & 0x00F000) +#define SEG_OFF(x) ((x) & 0x0FFFF) + +#define SET_BIOS_SCRATCH 0x1 +#define RESTORE_BIOS_SCRATCH 0x2 + +#define pointer void * +#define IOADDRESS void * +#define Bool int +#ifndef X86EMU_pioAddr +#define X86EMU_pioAddr int +#endif + +#define X86_TF_MASK 0x00000100 +#define X86_IF_MASK 0x00000200 +#define X86_IOPL_MASK 0x00003000 +#define X86_NT_MASK 0x00004000 +#define X86_VM_MASK 0x00020000 +#define X86_AC_MASK 0x00040000 +#define X86_VIF_MASK 0x00080000 /* virtual interrupt flag */ +#define X86_VIP_MASK 0x00100000 /* virtual interrupt pending */ +#define X86_ID_MASK 0x00200000 + +/* int10 info structure */ +typedef struct { + int entityIndex; + int scrnIndex; + pointer cpuRegs; + u16 BIOSseg; + u16 inb40time; + char * BIOSScratch; + int Flags; + pointer private; + struct _int10Mem* mem; + int num; + int ax; + int bx; + int cx; + int dx; + int si; + int di; + int es; + int bp; + int flags; + int stackseg; +#if 0 + PCITAG Tag; +#endif + IOADDRESS ioBase; +} xf86Int10InfoRec, *xf86Int10InfoPtr; + +typedef struct _int10Mem { + u8(*rb)(xf86Int10InfoPtr, int); + u16(*rw)(xf86Int10InfoPtr, int); + u32(*rl)(xf86Int10InfoPtr, int); + void(*wb)(xf86Int10InfoPtr, int, u8); + void(*ww)(xf86Int10InfoPtr, int, u16); + void(*wl)(xf86Int10InfoPtr, int, u32); +} int10MemRec, *int10MemPtr; + +typedef struct { + u8 save_msr; + u8 save_pos102; + u8 save_vse; + u8 save_46e8; +} legacyVGARec, *legacyVGAPtr; + +#if 0 +typedef struct { + BusType bus; + union { + struct { + int bus; + int dev; + int func; + } pci; + int legacy; + } location; +} xf86int10BiosLocation, *xf86int10BiosLocationPtr; +#endif + +/* OS dependent functions */ +xf86Int10InfoPtr xf86InitInt10(int entityIndex); +xf86Int10InfoPtr xf86ExtendedInitInt10(int entityIndex, int Flags); +void xf86FreeInt10(xf86Int10InfoPtr pInt); +void *xf86Int10AllocPages(xf86Int10InfoPtr pInt, int num, int *off); +void xf86Int10FreePages(xf86Int10InfoPtr pInt, void *pbase, int num); +pointer xf86int10Addr(xf86Int10InfoPtr pInt, u32 addr); + +/* x86 executor related functions */ +void xf86ExecX86int10(xf86Int10InfoPtr pInt); + +#ifdef _INT10_PRIVATE + +#define I_S_DEFAULT_INT_VECT 0xFF065 +#define SYS_SIZE 0x100000 +#define SYS_BIOS 0xF0000 +#if 1 +#define BIOS_SIZE 0x10000 +#else /* a bug in DGUX requires this - let's try it */ +#define BIOS_SIZE (0x10000 - 1) +#endif +#define LOW_PAGE_SIZE 0x600 +#define V_RAM 0xA0000 +#define VRAM_SIZE 0x20000 +#define V_BIOS_SIZE 0x10000 +#define V_BIOS 0xC0000 +#define BIOS_SCRATCH_OFF 0x449 +#define BIOS_SCRATCH_END 0x466 +#define BIOS_SCRATCH_LEN (BIOS_SCRATCH_END - BIOS_SCRATCH_OFF + 1) +#define HIGH_MEM V_BIOS +#define HIGH_MEM_SIZE (SYS_BIOS - HIGH_MEM) +#define SEG_ADR(type, seg, reg) type((seg << 4) + (X86_##reg)) +#define SEG_EADR(type, seg, reg) type((seg << 4) + (X86_E##reg)) + +#define X86_TF_MASK 0x00000100 +#define X86_IF_MASK 0x00000200 +#define X86_IOPL_MASK 0x00003000 +#define X86_NT_MASK 0x00004000 +#define X86_VM_MASK 0x00020000 +#define X86_AC_MASK 0x00040000 +#define X86_VIF_MASK 0x00080000 /* virtual interrupt flag */ +#define X86_VIP_MASK 0x00100000 /* virtual interrupt pending */ +#define X86_ID_MASK 0x00200000 + +#define MEM_RB(name, addr) (*name->mem->rb)(name, addr) +#define MEM_RW(name, addr) (*name->mem->rw)(name, addr) +#define MEM_RL(name, addr) (*name->mem->rl)(name, addr) +#define MEM_WB(name, addr, val) (*name->mem->wb)(name, addr, val) +#define MEM_WW(addr, val) wrw(addr, val) +#define MEM_WL(name, addr, val) (*name->mem->wl)(name, addr, val) + +/* OS dependent functions */ +Bool MapCurrentInt10(xf86Int10InfoPtr pInt); +/* x86 executor related functions */ +Bool xf86Int10ExecSetup(xf86Int10InfoPtr pInt); + +/* int.c */ +extern xf86Int10InfoPtr Int10Current; +int int_handler(xf86Int10InfoPtr pInt); + +/* helper_exec.c */ +int setup_int(xf86Int10InfoPtr pInt); +void finish_int(xf86Int10InfoPtr, int sig); +u32 getIntVect(xf86Int10InfoPtr pInt, int num); +void pushw(u16 val); +int run_bios_int(int num, xf86Int10InfoPtr pInt); +void dump_code(xf86Int10InfoPtr pInt); +void dump_registers(xf86Int10InfoPtr pInt); +void stack_trace(xf86Int10InfoPtr pInt); +xf86Int10InfoPtr getInt10Rec(int entityIndex); +u8 bios_checksum(u8 *start, int size); +void LockLegacyVGA(xf86Int10InfoPtr pInt, legacyVGAPtr vga); +void UnlockLegacyVGA(xf86Int10InfoPtr pInt, legacyVGAPtr vga); +#if defined (_PC) +void xf86Int10SaveRestoreBIOSVars(xf86Int10InfoPtr pInt, Bool save); +#endif +int port_rep_inb(xf86Int10InfoPtr pInt, u16 port, u32 base, int d_f, u32 count); +int port_rep_inw(xf86Int10InfoPtr pInt, u16 port, u32 base, int d_f, u32 count); +int port_rep_inl(xf86Int10InfoPtr pInt, u16 port, u32 base, int d_f, u32 count); +int port_rep_outb(xf86Int10InfoPtr pInt, u16 port, u32 base, int d_f, u32 count); +int port_rep_outw(xf86Int10InfoPtr pInt, u16 port, u32 base, int d_f, u32 count); +int port_rep_outl(xf86Int10InfoPtr pInt, u16 port, u32 base, int d_f, u32 count); + +u8 x_inb(X86EMU_pioAddr port); +u16 x_inw(X86EMU_pioAddr port); +void x_outb(X86EMU_pioAddr port, u8 val); +void x_outw(X86EMU_pioAddr port, u16 val); +u32 x_inl(X86EMU_pioAddr port); +void x_outl(X86EMU_pioAddr port, u32 val); + +u8 Mem_rb(u32 addr); +u16 Mem_rw(u32 addr); +u32 Mem_rl(u32 addr); +void Mem_wb(u32 addr, u8 val); +void Mem_ww(u32 addr, u16 val); +void Mem_wl(u32 addr, u32 val); + +/* helper_mem.c */ +void setup_int_vect(xf86Int10InfoPtr pInt); +int setup_system_bios(void *base_addr); +void reset_int_vect(xf86Int10InfoPtr pInt); +void set_return_trap(xf86Int10InfoPtr pInt); +#if 0 +void *xf86HandleInt10Options(ScrnInfoPtr pScrn, int entityIndex); +#endif +Bool int10skip(void* options); +Bool int10_check_bios(int scrnIndex, int codeSeg, unsigned char* vbiosMem); +Bool initPrimary(void* options); +#if 0 +void xf86int10ParseBiosLocation(void* options,xf86int10BiosLocationPtr bios); +#endif +#ifdef DEBUG +void dprint(unsigned long start, unsigned long size); +#endif + +/* pci.c */ +int mapPciRom(char *filename, unsigned char *address); + +#endif /* _INT10_PRIVATE */ +#endif /* _XF86INT10_H */ |