1706f2543Smrg 2706f2543Smrg/* 3706f2543Smrg * XFree86 int10 module 4706f2543Smrg * execute BIOS int 10h calls in x86 real mode environment 5706f2543Smrg * Copyright 1999 Egbert Eich 6706f2543Smrg */ 7706f2543Smrg 8706f2543Smrg#ifndef _XF86INT10_H 9706f2543Smrg#define _XF86INT10_H 10706f2543Smrg 11706f2543Smrg#include <X11/Xmd.h> 12706f2543Smrg#include <X11/Xdefs.h> 13706f2543Smrg#include "xf86Pci.h" 14706f2543Smrg 15706f2543Smrg#define SEG_ADDR(x) (((x) >> 4) & 0x00F000) 16706f2543Smrg#define SEG_OFF(x) ((x) & 0x0FFFF) 17706f2543Smrg 18706f2543Smrg#define SET_BIOS_SCRATCH 0x1 19706f2543Smrg#define RESTORE_BIOS_SCRATCH 0x2 20706f2543Smrg 21706f2543Smrg/* int10 info structure */ 22706f2543Smrgtypedef struct { 23706f2543Smrg int entityIndex; 24706f2543Smrg int scrnIndex; 25706f2543Smrg pointer cpuRegs; 26706f2543Smrg CARD16 BIOSseg; 27706f2543Smrg CARD16 inb40time; 28706f2543Smrg char * BIOSScratch; 29706f2543Smrg int Flags; 30706f2543Smrg pointer private; 31706f2543Smrg struct _int10Mem* mem; 32706f2543Smrg int num; 33706f2543Smrg int ax; 34706f2543Smrg int bx; 35706f2543Smrg int cx; 36706f2543Smrg int dx; 37706f2543Smrg int si; 38706f2543Smrg int di; 39706f2543Smrg int es; 40706f2543Smrg int bp; 41706f2543Smrg int flags; 42706f2543Smrg int stackseg; 43706f2543Smrg struct pci_device *dev; 44706f2543Smrg IOADDRESS ioBase; 45706f2543Smrg} xf86Int10InfoRec, *xf86Int10InfoPtr; 46706f2543Smrg 47706f2543Smrgtypedef struct _int10Mem { 48706f2543Smrg CARD8(*rb)(xf86Int10InfoPtr, int); 49706f2543Smrg CARD16(*rw)(xf86Int10InfoPtr, int); 50706f2543Smrg CARD32(*rl)(xf86Int10InfoPtr, int); 51706f2543Smrg void(*wb)(xf86Int10InfoPtr, int, CARD8); 52706f2543Smrg void(*ww)(xf86Int10InfoPtr, int, CARD16); 53706f2543Smrg void(*wl)(xf86Int10InfoPtr, int, CARD32); 54706f2543Smrg} int10MemRec, *int10MemPtr; 55706f2543Smrg 56706f2543Smrgtypedef struct { 57706f2543Smrg CARD8 save_msr; 58706f2543Smrg CARD8 save_pos102; 59706f2543Smrg CARD8 save_vse; 60706f2543Smrg CARD8 save_46e8; 61706f2543Smrg} legacyVGARec, *legacyVGAPtr; 62706f2543Smrg 63706f2543Smrg/* OS dependent functions */ 64706f2543Smrgextern _X_EXPORT xf86Int10InfoPtr xf86InitInt10(int entityIndex); 65706f2543Smrgextern _X_EXPORT xf86Int10InfoPtr xf86ExtendedInitInt10(int entityIndex, 66706f2543Smrg int Flags); 67706f2543Smrgextern _X_EXPORT void xf86FreeInt10(xf86Int10InfoPtr pInt); 68706f2543Smrgextern _X_EXPORT void *xf86Int10AllocPages(xf86Int10InfoPtr pInt, int num, 69706f2543Smrg int *off); 70706f2543Smrgextern _X_EXPORT void xf86Int10FreePages(xf86Int10InfoPtr pInt, void *pbase, 71706f2543Smrg int num); 72706f2543Smrgextern _X_EXPORT pointer xf86int10Addr(xf86Int10InfoPtr pInt, CARD32 addr); 73706f2543Smrg 74706f2543Smrg/* x86 executor related functions */ 75706f2543Smrgextern _X_EXPORT void xf86ExecX86int10(xf86Int10InfoPtr pInt); 76706f2543Smrg 77706f2543Smrg#ifdef _INT10_PRIVATE 78706f2543Smrg 79706f2543Smrg#define I_S_DEFAULT_INT_VECT 0xFF065 80706f2543Smrg#define SYS_SIZE 0x100000 81706f2543Smrg#define SYS_BIOS 0xF0000 82706f2543Smrg#if 1 83706f2543Smrg#define BIOS_SIZE 0x10000 84706f2543Smrg#else /* a bug in DGUX requires this - let's try it */ 85706f2543Smrg#define BIOS_SIZE (0x10000 - 1) 86706f2543Smrg#endif 87706f2543Smrg#define LOW_PAGE_SIZE 0x600 88706f2543Smrg#define V_RAM 0xA0000 89706f2543Smrg#define VRAM_SIZE 0x20000 90706f2543Smrg#define V_BIOS_SIZE 0x10000 91706f2543Smrg#define V_BIOS 0xC0000 92706f2543Smrg#define BIOS_SCRATCH_OFF 0x449 93706f2543Smrg#define BIOS_SCRATCH_END 0x466 94706f2543Smrg#define BIOS_SCRATCH_LEN (BIOS_SCRATCH_END - BIOS_SCRATCH_OFF + 1) 95706f2543Smrg#define HIGH_MEM V_BIOS 96706f2543Smrg#define HIGH_MEM_SIZE (SYS_BIOS - HIGH_MEM) 97706f2543Smrg#define SEG_ADR(type, seg, reg) type((seg << 4) + (X86_##reg)) 98706f2543Smrg#define SEG_EADR(type, seg, reg) type((seg << 4) + (X86_E##reg)) 99706f2543Smrg 100706f2543Smrg#define X86_TF_MASK 0x00000100 101706f2543Smrg#define X86_IF_MASK 0x00000200 102706f2543Smrg#define X86_IOPL_MASK 0x00003000 103706f2543Smrg#define X86_NT_MASK 0x00004000 104706f2543Smrg#define X86_VM_MASK 0x00020000 105706f2543Smrg#define X86_AC_MASK 0x00040000 106706f2543Smrg#define X86_VIF_MASK 0x00080000 /* virtual interrupt flag */ 107706f2543Smrg#define X86_VIP_MASK 0x00100000 /* virtual interrupt pending */ 108706f2543Smrg#define X86_ID_MASK 0x00200000 109706f2543Smrg 110706f2543Smrg#define MEM_RB(name, addr) (*name->mem->rb)(name, addr) 111706f2543Smrg#define MEM_RW(name, addr) (*name->mem->rw)(name, addr) 112706f2543Smrg#define MEM_RL(name, addr) (*name->mem->rl)(name, addr) 113706f2543Smrg#define MEM_WB(name, addr, val) (*name->mem->wb)(name, addr, val) 114706f2543Smrg#define MEM_WW(name, addr, val) (*name->mem->ww)(name, addr, val) 115706f2543Smrg#define MEM_WL(name, addr, val) (*name->mem->wl)(name, addr, val) 116706f2543Smrg 117706f2543Smrg/* OS dependent functions */ 118706f2543Smrgextern _X_EXPORT Bool MapCurrentInt10(xf86Int10InfoPtr pInt); 119706f2543Smrg/* x86 executor related functions */ 120706f2543Smrgextern _X_EXPORT Bool xf86Int10ExecSetup(xf86Int10InfoPtr pInt); 121706f2543Smrg 122706f2543Smrg/* int.c */ 123706f2543Smrgextern _X_EXPORT xf86Int10InfoPtr Int10Current; 124706f2543Smrgint int_handler(xf86Int10InfoPtr pInt); 125706f2543Smrg 126706f2543Smrg/* helper_exec.c */ 127706f2543Smrgint setup_int(xf86Int10InfoPtr pInt); 128706f2543Smrgvoid finish_int(xf86Int10InfoPtr, int sig); 129706f2543SmrgCARD32 getIntVect(xf86Int10InfoPtr pInt, int num); 130706f2543Smrgvoid pushw(xf86Int10InfoPtr pInt, CARD16 val); 131706f2543Smrgint run_bios_int(int num, xf86Int10InfoPtr pInt); 132706f2543Smrgvoid dump_code(xf86Int10InfoPtr pInt); 133706f2543Smrgvoid dump_registers(xf86Int10InfoPtr pInt); 134706f2543Smrgvoid stack_trace(xf86Int10InfoPtr pInt); 135706f2543SmrgCARD8 bios_checksum(const CARD8 *start, int size); 136706f2543Smrgvoid LockLegacyVGA(xf86Int10InfoPtr pInt, legacyVGAPtr vga); 137706f2543Smrgvoid UnlockLegacyVGA(xf86Int10InfoPtr pInt, legacyVGAPtr vga); 138706f2543Smrg#if defined (_PC) 139706f2543Smrgextern _X_EXPORT void xf86Int10SaveRestoreBIOSVars(xf86Int10InfoPtr pInt, Bool save); 140706f2543Smrg#endif 141706f2543Smrgint port_rep_inb(xf86Int10InfoPtr pInt, 142706f2543Smrg CARD16 port, CARD32 base, int d_f, CARD32 count); 143706f2543Smrgint port_rep_inw(xf86Int10InfoPtr pInt, 144706f2543Smrg CARD16 port, CARD32 base, int d_f, CARD32 count); 145706f2543Smrgint port_rep_inl(xf86Int10InfoPtr pInt, 146706f2543Smrg CARD16 port, CARD32 base, int d_f, CARD32 count); 147706f2543Smrgint port_rep_outb(xf86Int10InfoPtr pInt, 148706f2543Smrg CARD16 port, CARD32 base, int d_f, CARD32 count); 149706f2543Smrgint port_rep_outw(xf86Int10InfoPtr pInt, 150706f2543Smrg CARD16 port, CARD32 base, int d_f, CARD32 count); 151706f2543Smrgint port_rep_outl(xf86Int10InfoPtr pInt, 152706f2543Smrg CARD16 port, CARD32 base, int d_f, CARD32 count); 153706f2543Smrg 154706f2543SmrgCARD8 x_inb(CARD16 port); 155706f2543SmrgCARD16 x_inw(CARD16 port); 156706f2543Smrgvoid x_outb(CARD16 port, CARD8 val); 157706f2543Smrgvoid x_outw(CARD16 port, CARD16 val); 158706f2543SmrgCARD32 x_inl(CARD16 port); 159706f2543Smrgvoid x_outl(CARD16 port, CARD32 val); 160706f2543Smrg 161706f2543SmrgCARD8 Mem_rb(CARD32 addr); 162706f2543SmrgCARD16 Mem_rw(CARD32 addr); 163706f2543SmrgCARD32 Mem_rl(CARD32 addr); 164706f2543Smrgvoid Mem_wb(CARD32 addr, CARD8 val); 165706f2543Smrgvoid Mem_ww(CARD32 addr, CARD16 val); 166706f2543Smrgvoid Mem_wl(CARD32 addr, CARD32 val); 167706f2543Smrg 168706f2543Smrg/* helper_mem.c */ 169706f2543Smrgvoid setup_int_vect(xf86Int10InfoPtr pInt); 170706f2543Smrgint setup_system_bios(void *base_addr); 171706f2543Smrgvoid reset_int_vect(xf86Int10InfoPtr pInt); 172706f2543Smrgvoid set_return_trap(xf86Int10InfoPtr pInt); 173706f2543Smrgextern _X_EXPORT void * xf86HandleInt10Options(ScrnInfoPtr pScrn, int entityIndex); 174706f2543SmrgBool int10skip(const void* options); 175706f2543SmrgBool int10_check_bios(int scrnIndex, int codeSeg, 176706f2543Smrg const unsigned char* vbiosMem); 177706f2543SmrgBool initPrimary(const void* options); 178706f2543Smrgextern _X_EXPORT BusType xf86int10GetBiosLocationType(const xf86Int10InfoPtr pInt); 179706f2543Smrgextern _X_EXPORT Bool xf86int10GetBiosSegment(xf86Int10InfoPtr pInt, void *base); 180706f2543Smrg#ifdef DEBUG 181706f2543Smrgvoid dprint(unsigned long start, unsigned long size); 182706f2543Smrg#endif 183706f2543Smrg 184706f2543Smrg#endif /* _INT10_PRIVATE */ 185706f2543Smrg#endif /* _XF86INT10_H */ 186