diff options
Diffstat (limited to 'hw/xfree86/int10')
-rw-r--r-- | hw/xfree86/int10/Makefile.am | 20 | ||||
-rw-r--r-- | hw/xfree86/int10/generic.c | 108 | ||||
-rw-r--r-- | hw/xfree86/int10/helper_exec.c | 8 | ||||
-rw-r--r-- | hw/xfree86/int10/helper_mem.c | 147 | ||||
-rw-r--r-- | hw/xfree86/int10/xf86int10.h | 15 |
5 files changed, 167 insertions, 131 deletions
diff --git a/hw/xfree86/int10/Makefile.am b/hw/xfree86/int10/Makefile.am index 130e0853c..c059070ec 100644 --- a/hw/xfree86/int10/Makefile.am +++ b/hw/xfree86/int10/Makefile.am @@ -6,15 +6,18 @@ EXTRA_CFLAGS = libint10_la_LDFLAGS = -avoid-version -if INT10_VM86 -AM_CFLAGS = -D_PC -D_VM86_LINUX $(XORG_CFLAGS) $(EXTRA_CFLAGS) -INCLUDES = $(XORG_INCS) -libint10_la_SOURCES = \ +COMMON_SOURCES = \ helper_exec.c \ helper_mem.c \ pci.c \ xf86int10.c \ - xf86int10module.c \ + xf86int10module.c + +if INT10_VM86 +AM_CFLAGS = -D_PC -D_VM86_LINUX $(XORG_CFLAGS) $(EXTRA_CFLAGS) +INCLUDES = $(XORG_INCS) +libint10_la_SOURCES = \ + $(COMMON_SOURCES) \ $(srcdir)/../os-support/linux/int10/vm86/linux_vm86.c \ $(srcdir)/../os-support/linux/int10/linux.c endif @@ -22,8 +25,11 @@ endif if INT10_X86EMU AM_CFLAGS = -D_X86EMU -DNO_SYS_HEADERS -D_PC $(XORG_CFLAGS) $(EXTRA_CFLAGS) INCLUDES = $(XORG_INCS) -I$(srcdir)/../x86emu -libint10_la_SOURCES = pci.c xf86int10module.c helper_exec.c helper_mem.c \ - xf86int10.c xf86x86emu.c generic.c x86emu.c +libint10_la_SOURCES = \ + $(COMMON_SOURCES) \ + xf86x86emu.c \ + generic.c \ + x86emu.c endif if INT10_STUB diff --git a/hw/xfree86/int10/generic.c b/hw/xfree86/int10/generic.c index 69596d48e..1b4475f21 100644 --- a/hw/xfree86/int10/generic.c +++ b/hw/xfree86/int10/generic.c @@ -63,12 +63,6 @@ static void UnmapVRam(xf86Int10InfoPtr pInt); static void *sysMem = NULL; xf86Int10InfoPtr -xf86InitInt10(int entityIndex) -{ - return xf86ExtendedInitInt10(entityIndex, 0); -} - -xf86Int10InfoPtr xf86ExtendedInitInt10(int entityIndex, int Flags) { xf86Int10InfoPtr pInt; @@ -142,59 +136,12 @@ xf86ExtendedInitInt10(int entityIndex, int Flags) if (xf86IsEntityPrimary(entityIndex) && !(initPrimary(options))) { - - if (bios.bus == BUS_ISA && bios.location.legacy) { - xf86DrvMsg(screen, X_CONFIG, - "Overriding BIOS location: 0x%x\n", - bios.location.legacy); - cs = bios.location.legacy >> 4; -#define CHECK_V_SEGMENT_RANGE(x) \ - if (((x) << 4) < V_BIOS) {\ - xf86DrvMsg(screen, X_ERROR, \ - "V_BIOS address 0x%lx out of range\n", \ - (unsigned long)(x) << 4); \ - goto error1; \ - } - CHECK_V_SEGMENT_RANGE(cs); - vbiosMem = (unsigned char *)sysMem - V_BIOS + (cs << 4); - if (!int10_check_bios(screen, cs, vbiosMem)) { - xf86DrvMsg(screen, X_ERROR, - "No V_BIOS at specified address 0x%lx\n", - (unsigned long)cs << 4); - goto error1; - } - } else { - if (bios.bus == BUS_PCI) { - xf86DrvMsg(screen, X_WARNING, - "Option BiosLocation for primary device ignored: " - "It points to PCI.\n"); - xf86DrvMsg(screen, X_WARNING, - "You must set Option InitPrimary also\n"); - } - - cs = MEM_RW(pInt,((0x10<<2)+2)); - CHECK_V_SEGMENT_RANGE(cs); - vbiosMem = (unsigned char *)sysMem - V_BIOS + (cs << 4); - if (!int10_check_bios(screen, cs, vbiosMem)) { - cs = MEM_RW(pInt, (0x42 << 2) + 2); - CHECK_V_SEGMENT_RANGE(cs); - vbiosMem = (unsigned char *)sysMem - V_BIOS + (cs << 4); - if (!int10_check_bios(screen, cs, vbiosMem)) { - cs = V_BIOS >> 4; - vbiosMem = (unsigned char *)sysMem - V_BIOS + (cs << 4); - if (!int10_check_bios(screen, cs, vbiosMem)) { - xf86DrvMsg(screen, X_ERROR, "No V_BIOS found\n"); - goto error1; - } - } - } + if (! xf86int10GetBiosSegment(pInt, &bios, + (unsigned char *)sysMem - V_BIOS)) { + goto error1; } - - xf86DrvMsg(screen, X_INFO, "Primary V_BIOS segment is: 0x%lx\n", - (unsigned long)cs); set_return_trap(pInt); - pInt->BIOSseg = cs; pInt->Flags = Flags & (SET_BIOS_SCRATCH | RESTORE_BIOS_SCRATCH); if (! (pInt->Flags & SET_BIOS_SCRATCH)) @@ -202,54 +149,33 @@ xf86ExtendedInitInt10(int entityIndex, int Flags) xf86Int10SaveRestoreBIOSVars(pInt, TRUE); } else { - BusType location_type; + const BusType location_type = xf86int10GetBiosLocationType(pInt, + &bios); int bios_location = V_BIOS; - int pci_entity; - - EntityInfoPtr pEnt = xf86GetEntityInfo(pInt->entityIndex); + reset_int_vect(pInt); set_return_trap(pInt); - if (bios.bus != BUS_NONE) { - switch (location_type = bios.bus) { - case BUS_PCI: - xf86DrvMsg(screen,X_CONFIG,"Overriding bios location: " - "PCI:%i:%i%i\n",bios.location.pci.bus, - bios.location.pci.dev,bios.location.pci.func); - break; - case BUS_ISA: - bios_location = bios.location.legacy; - if (bios.location.legacy) - xf86DrvMsg(screen,X_CONFIG,"Overriding bios location: " - "Legacy:0x%x\n",bios.location.legacy); - else - xf86DrvMsg(screen,X_CONFIG,"Overriding bios location: " - "Legacy\n"); - break; - default: - break; - } - } else - location_type = pEnt->location.type; - - xfree(pEnt); - switch (location_type) { - case BUS_PCI: + case BUS_PCI: { + const int pci_entity = (bios.bus == BUS_PCI) + ? xf86GetPciEntity(bios.location.pci.bus, + bios.location.pci.dev, + bios.location.pci.func) + : pInt->entityIndex; + vbiosMem = (unsigned char *)base + bios_location; - if (bios.bus == BUS_PCI) - pci_entity = xf86GetPciEntity(bios.location.pci.bus, - bios.location.pci.dev, - bios.location.pci.func); - else - pci_entity = pInt->entityIndex; if (!(size = mapPciRom(pci_entity,(unsigned char *)(vbiosMem)))) { xf86DrvMsg(screen,X_ERROR,"Cannot read V_BIOS (3)\n"); goto error1; } INTPriv(pInt)->highMemory = GET_HIGH_BASE(size); break; + } case BUS_ISA: + if (bios.bus == BUS_ISA) { + bios_location = bios.location.legacy; + } vbiosMem = (unsigned char *)sysMem + bios_location; #if 0 (void)memset(vbiosMem, 0, V_BIOS_SIZE); diff --git a/hw/xfree86/int10/helper_exec.c b/hw/xfree86/int10/helper_exec.c index 1809e2d95..4ffd74b39 100644 --- a/hw/xfree86/int10/helper_exec.c +++ b/hw/xfree86/int10/helper_exec.c @@ -576,7 +576,7 @@ pciCfg1outb(CARD16 addr, CARD8 val) } CARD8 -bios_checksum(CARD8 *start, int size) +bios_checksum(const CARD8 *start, int size) { CARD8 sum = 0; @@ -685,3 +685,9 @@ xf86Int10SaveRestoreBIOSVars(xf86Int10InfoPtr pInt, Bool save) xf86UnMapVidMem(pInt->scrnIndex,base - BIOS_SCRATCH_OFF ,pagesize); } #endif + +xf86Int10InfoPtr +xf86InitInt10(int entityIndex) +{ + return xf86ExtendedInitInt10(entityIndex, 0); +} diff --git a/hw/xfree86/int10/helper_mem.c b/hw/xfree86/int10/helper_mem.c index 65ffe3df5..b84571302 100644 --- a/hw/xfree86/int10/helper_mem.c +++ b/hw/xfree86/int10/helper_mem.c @@ -224,7 +224,7 @@ xf86HandleInt10Options(ScrnInfoPtr pScrn, int entityIndex) } Bool -int10skip(void* options) +int10skip(const void* options) { Bool noint10 = FALSE; @@ -235,7 +235,7 @@ int10skip(void* options) } Bool -int10_check_bios(int scrnIndex, int codeSeg, unsigned char* vbiosMem) +int10_check_bios(int scrnIndex, int codeSeg, const unsigned char* vbiosMem) { int size; @@ -262,7 +262,7 @@ int10_check_bios(int scrnIndex, int codeSeg, unsigned char* vbiosMem) } Bool -initPrimary(void* options) +initPrimary(const void* options) { Bool initPrimary = FALSE; @@ -281,39 +281,33 @@ initPrimary(void* options) * be used with extreme care. */ void -xf86int10ParseBiosLocation(void* options, +xf86int10ParseBiosLocation(const void* options, xf86int10BiosLocationPtr bios) { - char *s; - char *p; - char *str = NULL; - - if (options) - str = xf86GetOptValString(options,OPT_BIOS_LOCATION); + const char *p; + const char *str; bios->bus = BUS_NONE; - if (!str) + + if ((options == NULL) + || ((str = xf86GetOptValString(options, OPT_BIOS_LOCATION)) == NULL)) { return; - - s = xstrdup(str); - p = strtok(s,":"); - if (xf86NameCmp(p,"pci") == 0) bios->bus = BUS_PCI; - else - if (xf86NameCmp(p,"primary") == 0) bios->bus = BUS_ISA; + } - xfree(s); - - if (bios->bus == BUS_NONE) return; + if (strncasecmp(str, "pci", 3) == 0) { + bios->bus = BUS_PCI; + } else if (strncasecmp(str, "primary", 7) == 0) { + bios->bus = BUS_ISA; + } + else { + return; + } - s = xstrdup(str); - p = strchr(s, ':'); + p = strchr(str, ':'); switch (bios->bus) { case BUS_ISA: - if (p) - bios->location.legacy = atoi(++p); - else - bios->location.legacy = 0; + bios->location.legacy = (p != NULL) ? atoi(++p) : 0; break; case BUS_PCI: if (p) { @@ -332,8 +326,107 @@ xf86int10ParseBiosLocation(void* options, default: break; } - xfree(s); } +BusType +xf86int10GetBiosLocationType(const xf86Int10InfoPtr pInt, + const xf86int10BiosLocationPtr bios) +{ + BusType location_type = bios->bus; + + switch (location_type) { + case BUS_PCI: + xf86DrvMsg(pInt->scrnIndex,X_CONFIG,"Overriding bios location: " + "PCI:%i:%i%i\n",bios->location.pci.bus, + bios->location.pci.dev,bios->location.pci.func); + break; + case BUS_ISA: + if (bios->location.legacy) + xf86DrvMsg(pInt->scrnIndex,X_CONFIG,"Overriding bios location: " + "Legacy:0x%x\n",bios->location.legacy); + else + xf86DrvMsg(pInt->scrnIndex,X_CONFIG,"Overriding bios location: " + "Legacy\n"); + break; + case BUS_NONE: { + EntityInfoPtr pEnt = xf86GetEntityInfo(pInt->entityIndex); + location_type = pEnt->location.type; + xfree(pEnt); + break; + } + default: + break; + } + + return location_type; +} + + +#define CHECK_V_SEGMENT_RANGE(x) \ + if (((x) << 4) < V_BIOS) { \ + xf86DrvMsg(pInt->scrnIndex, X_ERROR, \ + "V_BIOS address 0x%lx out of range\n", \ + (unsigned long)(x) << 4); \ + return FALSE; \ + } + +Bool +xf86int10GetBiosSegment(xf86Int10InfoPtr pInt, + const xf86int10BiosLocationPtr bios, void * base) +{ + unsigned i; + int cs = ~0; + int segments[4]; + const char * format; + + + if (bios->bus == BUS_ISA && bios->location.legacy) { + xf86DrvMsg(pInt->scrnIndex, X_CONFIG, + "Overriding BIOS location: 0x%x\n", + bios->location.legacy); + + segments[0] = bios->location.legacy >> 4; + segments[1] = ~0; + + format = "No V_BIOS at specified address 0x%lx\n"; + } else { + if (bios->bus == BUS_PCI) { + xf86DrvMsg(pInt->scrnIndex, X_WARNING, + "Option BiosLocation for primary device ignored: " + "It points to PCI.\n"); + xf86DrvMsg(pInt->scrnIndex, X_WARNING, + "You must set Option InitPrimary also\n"); + } + + segments[0] = MEM_RW(pInt, (0x10 << 2) + 2); + segments[1] = MEM_RW(pInt, (0x42 << 2) + 2); + segments[2] = V_BIOS >> 4; + segments[3] = ~0; + + format = "No V_BIOS found\n"; + } + + for (i = 0; segments[i] != ~0; i++) { + unsigned char * vbiosMem; + + cs = segments[i]; + + CHECK_V_SEGMENT_RANGE(cs); + vbiosMem = (unsigned char *)base + (cs << 4); + if (int10_check_bios(pInt->scrnIndex, cs, vbiosMem)) { + break; + } + } + if (segments[i] == ~0) { + xf86DrvMsg(pInt->scrnIndex, X_ERROR, format, (unsigned long)cs << 4); + return FALSE; + } + + xf86DrvMsg(pInt->scrnIndex, X_INFO, "Primary V_BIOS segment is: 0x%lx\n", + (unsigned long)cs); + + pInt->BIOSseg = cs; + return TRUE; +} diff --git a/hw/xfree86/int10/xf86int10.h b/hw/xfree86/int10/xf86int10.h index 9e137df41..47f965d74 100644 --- a/hw/xfree86/int10/xf86int10.h +++ b/hw/xfree86/int10/xf86int10.h @@ -143,7 +143,7 @@ void dump_code(xf86Int10InfoPtr pInt); void dump_registers(xf86Int10InfoPtr pInt); void stack_trace(xf86Int10InfoPtr pInt); xf86Int10InfoPtr getInt10Rec(int entityIndex); -CARD8 bios_checksum(CARD8 *start, int size); +CARD8 bios_checksum(const CARD8 *start, int size); void LockLegacyVGA(xf86Int10InfoPtr pInt, legacyVGAPtr vga); void UnlockLegacyVGA(xf86Int10InfoPtr pInt, legacyVGAPtr vga); #if defined (_PC) @@ -182,11 +182,16 @@ int setup_system_bios(void *base_addr); void reset_int_vect(xf86Int10InfoPtr pInt); void set_return_trap(xf86Int10InfoPtr pInt); void * xf86HandleInt10Options(ScrnInfoPtr pScrn, int entityIndex); -Bool int10skip(void* options); -Bool int10_check_bios(int scrnIndex, int codeSeg, unsigned char* vbiosMem); -Bool initPrimary(void* options); -void xf86int10ParseBiosLocation(void* options, +Bool int10skip(const void* options); +Bool int10_check_bios(int scrnIndex, int codeSeg, + const unsigned char* vbiosMem); +Bool initPrimary(const void* options); +void xf86int10ParseBiosLocation(const void* options, xf86int10BiosLocationPtr bios); +BusType xf86int10GetBiosLocationType(const xf86Int10InfoPtr pInt, + const xf86int10BiosLocationPtr bios); +Bool xf86int10GetBiosSegment(xf86Int10InfoPtr pInt, + const xf86int10BiosLocationPtr bios, void * base); #ifdef DEBUG void dprint(unsigned long start, unsigned long size); #endif |