xf86int10.h revision 05b261ec
1 2/* 3 * XFree86 int10 module 4 * execute BIOS int 10h calls in x86 real mode environment 5 * Copyright 1999 Egbert Eich 6 */ 7 8#ifndef _XF86INT10_H 9#define _XF86INT10_H 10 11#include <X11/Xmd.h> 12#include <X11/Xdefs.h> 13#include "xf86Pci.h" 14 15#define SEG_ADDR(x) (((x) >> 4) & 0x00F000) 16#define SEG_OFF(x) ((x) & 0x0FFFF) 17 18#define SET_BIOS_SCRATCH 0x1 19#define RESTORE_BIOS_SCRATCH 0x2 20 21/* int10 info structure */ 22typedef struct { 23 int entityIndex; 24 int scrnIndex; 25 pointer cpuRegs; 26 CARD16 BIOSseg; 27 CARD16 inb40time; 28 char * BIOSScratch; 29 int Flags; 30 pointer private; 31 struct _int10Mem* mem; 32 int num; 33 int ax; 34 int bx; 35 int cx; 36 int dx; 37 int si; 38 int di; 39 int es; 40 int bp; 41 int flags; 42 int stackseg; 43 PCITAG Tag; 44 IOADDRESS ioBase; 45} xf86Int10InfoRec, *xf86Int10InfoPtr; 46 47typedef struct _int10Mem { 48 CARD8(*rb)(xf86Int10InfoPtr, int); 49 CARD16(*rw)(xf86Int10InfoPtr, int); 50 CARD32(*rl)(xf86Int10InfoPtr, int); 51 void(*wb)(xf86Int10InfoPtr, int, CARD8); 52 void(*ww)(xf86Int10InfoPtr, int, CARD16); 53 void(*wl)(xf86Int10InfoPtr, int, CARD32); 54} int10MemRec, *int10MemPtr; 55 56typedef struct { 57 CARD8 save_msr; 58 CARD8 save_pos102; 59 CARD8 save_vse; 60 CARD8 save_46e8; 61} legacyVGARec, *legacyVGAPtr; 62 63/* OS dependent functions */ 64xf86Int10InfoPtr xf86InitInt10(int entityIndex); 65xf86Int10InfoPtr xf86ExtendedInitInt10(int entityIndex, int Flags); 66void xf86FreeInt10(xf86Int10InfoPtr pInt); 67void *xf86Int10AllocPages(xf86Int10InfoPtr pInt, int num, int *off); 68void xf86Int10FreePages(xf86Int10InfoPtr pInt, void *pbase, int num); 69pointer xf86int10Addr(xf86Int10InfoPtr pInt, CARD32 addr); 70 71/* x86 executor related functions */ 72void xf86ExecX86int10(xf86Int10InfoPtr pInt); 73 74#ifdef _INT10_PRIVATE 75 76#define I_S_DEFAULT_INT_VECT 0xFF065 77#define SYS_SIZE 0x100000 78#define SYS_BIOS 0xF0000 79#if 1 80#define BIOS_SIZE 0x10000 81#else /* a bug in DGUX requires this - let's try it */ 82#define BIOS_SIZE (0x10000 - 1) 83#endif 84#define LOW_PAGE_SIZE 0x600 85#define V_RAM 0xA0000 86#define VRAM_SIZE 0x20000 87#define V_BIOS_SIZE 0x10000 88#define V_BIOS 0xC0000 89#define BIOS_SCRATCH_OFF 0x449 90#define BIOS_SCRATCH_END 0x466 91#define BIOS_SCRATCH_LEN (BIOS_SCRATCH_END - BIOS_SCRATCH_OFF + 1) 92#define HIGH_MEM V_BIOS 93#define HIGH_MEM_SIZE (SYS_BIOS - HIGH_MEM) 94#define SEG_ADR(type, seg, reg) type((seg << 4) + (X86_##reg)) 95#define SEG_EADR(type, seg, reg) type((seg << 4) + (X86_E##reg)) 96 97#define X86_TF_MASK 0x00000100 98#define X86_IF_MASK 0x00000200 99#define X86_IOPL_MASK 0x00003000 100#define X86_NT_MASK 0x00004000 101#define X86_VM_MASK 0x00020000 102#define X86_AC_MASK 0x00040000 103#define X86_VIF_MASK 0x00080000 /* virtual interrupt flag */ 104#define X86_VIP_MASK 0x00100000 /* virtual interrupt pending */ 105#define X86_ID_MASK 0x00200000 106 107#define MEM_RB(name, addr) (*name->mem->rb)(name, addr) 108#define MEM_RW(name, addr) (*name->mem->rw)(name, addr) 109#define MEM_RL(name, addr) (*name->mem->rl)(name, addr) 110#define MEM_WB(name, addr, val) (*name->mem->wb)(name, addr, val) 111#define MEM_WW(name, addr, val) (*name->mem->ww)(name, addr, val) 112#define MEM_WL(name, addr, val) (*name->mem->wl)(name, addr, val) 113 114/* OS dependent functions */ 115Bool MapCurrentInt10(xf86Int10InfoPtr pInt); 116/* x86 executor related functions */ 117Bool xf86Int10ExecSetup(xf86Int10InfoPtr pInt); 118 119/* int.c */ 120extern xf86Int10InfoPtr Int10Current; 121int int_handler(xf86Int10InfoPtr pInt); 122 123/* helper_exec.c */ 124int setup_int(xf86Int10InfoPtr pInt); 125void finish_int(xf86Int10InfoPtr, int sig); 126CARD32 getIntVect(xf86Int10InfoPtr pInt, int num); 127void pushw(xf86Int10InfoPtr pInt, CARD16 val); 128int run_bios_int(int num, xf86Int10InfoPtr pInt); 129void dump_code(xf86Int10InfoPtr pInt); 130void dump_registers(xf86Int10InfoPtr pInt); 131void stack_trace(xf86Int10InfoPtr pInt); 132xf86Int10InfoPtr getInt10Rec(int entityIndex); 133CARD8 bios_checksum(const CARD8 *start, int size); 134void LockLegacyVGA(xf86Int10InfoPtr pInt, legacyVGAPtr vga); 135void UnlockLegacyVGA(xf86Int10InfoPtr pInt, legacyVGAPtr vga); 136#if defined (_PC) 137void xf86Int10SaveRestoreBIOSVars(xf86Int10InfoPtr pInt, Bool save); 138#endif 139int port_rep_inb(xf86Int10InfoPtr pInt, 140 CARD16 port, CARD32 base, int d_f, CARD32 count); 141int port_rep_inw(xf86Int10InfoPtr pInt, 142 CARD16 port, CARD32 base, int d_f, CARD32 count); 143int port_rep_inl(xf86Int10InfoPtr pInt, 144 CARD16 port, CARD32 base, int d_f, CARD32 count); 145int port_rep_outb(xf86Int10InfoPtr pInt, 146 CARD16 port, CARD32 base, int d_f, CARD32 count); 147int port_rep_outw(xf86Int10InfoPtr pInt, 148 CARD16 port, CARD32 base, int d_f, CARD32 count); 149int port_rep_outl(xf86Int10InfoPtr pInt, 150 CARD16 port, CARD32 base, int d_f, CARD32 count); 151 152CARD8 x_inb(CARD16 port); 153CARD16 x_inw(CARD16 port); 154void x_outb(CARD16 port, CARD8 val); 155void x_outw(CARD16 port, CARD16 val); 156CARD32 x_inl(CARD16 port); 157void x_outl(CARD16 port, CARD32 val); 158 159CARD8 Mem_rb(CARD32 addr); 160CARD16 Mem_rw(CARD32 addr); 161CARD32 Mem_rl(CARD32 addr); 162void Mem_wb(CARD32 addr, CARD8 val); 163void Mem_ww(CARD32 addr, CARD16 val); 164void Mem_wl(CARD32 addr, CARD32 val); 165 166/* helper_mem.c */ 167void setup_int_vect(xf86Int10InfoPtr pInt); 168int setup_system_bios(void *base_addr); 169void reset_int_vect(xf86Int10InfoPtr pInt); 170void set_return_trap(xf86Int10InfoPtr pInt); 171void * xf86HandleInt10Options(ScrnInfoPtr pScrn, int entityIndex); 172Bool int10skip(const void* options); 173Bool int10_check_bios(int scrnIndex, int codeSeg, 174 const unsigned char* vbiosMem); 175Bool initPrimary(const void* options); 176BusType xf86int10GetBiosLocationType(const xf86Int10InfoPtr pInt); 177Bool xf86int10GetBiosSegment(xf86Int10InfoPtr pInt, void *base); 178#ifdef DEBUG 179void dprint(unsigned long start, unsigned long size); 180#endif 181 182/* pci.c */ 183int mapPciRom(int pciEntity, unsigned char *address); 184 185#endif /* _INT10_PRIVATE */ 186#endif /* _XF86INT10_H */ 187