2008-03-11 23:36:33 +00:00
|
|
|
From 332b9c7d0f499360f7750e6e85cc905703b6ad4a Mon Sep 17 00:00:00 2001
|
2008-03-11 01:18:22 +00:00
|
|
|
From: Adam Jackson <ajax@redhat.com>
|
|
|
|
Date: Mon, 10 Mar 2008 19:39:21 -0400
|
|
|
|
Subject: [PATCH] test x86emu fix
|
|
|
|
|
|
|
|
---
|
2008-03-11 23:36:33 +00:00
|
|
|
hw/xfree86/int10/helper_exec.c | 57 +++++++++++++++++++++++++++++++++++-----
|
|
|
|
1 files changed, 50 insertions(+), 7 deletions(-)
|
2008-03-11 01:18:22 +00:00
|
|
|
|
|
|
|
diff --git a/hw/xfree86/int10/helper_exec.c b/hw/xfree86/int10/helper_exec.c
|
2008-03-11 23:36:33 +00:00
|
|
|
index de6fde5..9daff22 100644
|
2008-03-11 01:18:22 +00:00
|
|
|
--- a/hw/xfree86/int10/helper_exec.c
|
|
|
|
+++ b/hw/xfree86/int10/helper_exec.c
|
2008-03-11 23:36:33 +00:00
|
|
|
@@ -33,6 +33,7 @@
|
|
|
|
#ifdef _X86EMU
|
|
|
|
#include "x86emu/x86emui.h"
|
|
|
|
#endif
|
|
|
|
+#include <pciaccess.h>
|
|
|
|
|
|
|
|
static int pciCfg1in(CARD16 addr, CARD32 *val);
|
|
|
|
static int pciCfg1out(CARD16 addr, CARD32 val);
|
|
|
|
@@ -459,7 +460,43 @@ Mem_wl(CARD32 addr, CARD32 val)
|
2008-03-11 01:18:22 +00:00
|
|
|
|
|
|
|
static CARD32 PciCfg1Addr = 0;
|
|
|
|
|
|
|
|
-#define OFFSET(Cfg1Addr) (Cfg1Addr & 0xff)
|
|
|
|
+#define PCI_OFFSET(x) ((x) & 0x000000ff)
|
|
|
|
+#define PCI_TAG(x) ((x) & 0xffffff00)
|
|
|
|
+
|
2008-03-11 23:36:33 +00:00
|
|
|
+static struct pci_device*
|
2008-03-11 01:18:22 +00:00
|
|
|
+pci_device_for_cfg_address (CARD32 addr)
|
|
|
|
+{
|
|
|
|
+ struct pci_device *dev = NULL;
|
|
|
|
+ PCITAG tag = PCI_TAG(addr);
|
|
|
|
+ struct pci_slot_match slot_match = {
|
|
|
|
+ .domain = PCI_DOM_FROM_TAG(tag),
|
|
|
|
+ .bus = PCI_BUS_NO_DOMAIN(PCI_BUS_FROM_TAG(tag)),
|
|
|
|
+ .dev = PCI_DEV_FROM_TAG(tag),
|
|
|
|
+ .func = PCI_FUNC_FROM_TAG(tag),
|
|
|
|
+ .match_data = 0
|
|
|
|
+ };
|
|
|
|
+
|
2008-03-11 23:36:33 +00:00
|
|
|
+ struct pci_device_iterator *iter =
|
|
|
|
+ pci_slot_match_iterator_create (&slot_match);
|
2008-03-11 01:18:22 +00:00
|
|
|
+ if (iter)
|
|
|
|
+ dev = pci_device_next(iter);
|
|
|
|
+ if (!dev) {
|
|
|
|
+ char buf[128]; /* enough to store "%u@%u" */
|
|
|
|
+ xf86FormatPciBusNumber(tag >> 16, buf);
|
|
|
|
+ ErrorF("Failed to find device matching %s:%u:%u\n",
|
|
|
|
+ buf, slot_match.dev, slot_match.func);
|
|
|
|
+ return NULL;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (pci_device_next(iter)) {
|
|
|
|
+ char buf[128]; /* enough to store "%u@%u" */
|
|
|
|
+ xf86FormatPciBusNumber(tag >> 16, buf);
|
|
|
|
+ ErrorF("Multiple devices matching %s:%u:%u\n",
|
|
|
|
+ buf, slot_match.dev, slot_match.func);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return dev;
|
|
|
|
+}
|
|
|
|
|
|
|
|
static int
|
|
|
|
pciCfg1in(CARD16 addr, CARD32 *val)
|
2008-03-11 23:36:33 +00:00
|
|
|
@@ -469,7 +506,8 @@ pciCfg1in(CARD16 addr, CARD32 *val)
|
2008-03-11 01:18:22 +00:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
if (addr == 0xCFC) {
|
|
|
|
- pci_device_cfg_read_u32(Int10Current->dev, val, OFFSET(PciCfg1Addr));
|
|
|
|
+ pci_device_cfg_read_u32(pci_device_for_cfg_address(PciCfg1Addr),
|
|
|
|
+ val, PCI_OFFSET(PciCfg1Addr));
|
|
|
|
if (PRINT_PORT && DEBUG_IO_TRACE())
|
|
|
|
ErrorF(" cfg_inl(%#x) = %8.8x\n", PciCfg1Addr, *val);
|
|
|
|
return 1;
|
2008-03-11 23:36:33 +00:00
|
|
|
@@ -487,7 +525,8 @@ pciCfg1out(CARD16 addr, CARD32 val)
|
2008-03-11 01:18:22 +00:00
|
|
|
if (addr == 0xCFC) {
|
|
|
|
if (PRINT_PORT && DEBUG_IO_TRACE())
|
|
|
|
ErrorF(" cfg_outl(%#x, %8.8x)\n", PciCfg1Addr, val);
|
|
|
|
- pci_device_cfg_write_u32(Int10Current->dev, val, OFFSET(PciCfg1Addr));
|
|
|
|
+ pci_device_cfg_write_u32(pci_device_for_cfg_address(PciCfg1Addr),
|
|
|
|
+ val, PCI_OFFSET(PciCfg1Addr));
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
return 0;
|
2008-03-11 23:36:33 +00:00
|
|
|
@@ -506,7 +545,8 @@ pciCfg1inw(CARD16 addr, CARD16 *val)
|
2008-03-11 01:18:22 +00:00
|
|
|
if ((addr >= 0xCFC) && (addr <= 0xCFF)) {
|
|
|
|
const unsigned offset = addr - 0xCFC;
|
|
|
|
|
|
|
|
- pci_device_cfg_read_u16(Int10Current->dev, val, OFFSET(PciCfg1Addr) + offset);
|
|
|
|
+ pci_device_cfg_read_u16(pci_device_for_cfg_address(PciCfg1Addr),
|
|
|
|
+ val, PCI_OFFSET(PciCfg1Addr) + offset);
|
|
|
|
if (PRINT_PORT && DEBUG_IO_TRACE())
|
|
|
|
ErrorF(" cfg_inw(%#x) = %4.4x\n", PciCfg1Addr + offset, *val);
|
|
|
|
return 1;
|
2008-03-11 23:36:33 +00:00
|
|
|
@@ -530,7 +570,8 @@ pciCfg1outw(CARD16 addr, CARD16 val)
|
2008-03-11 01:18:22 +00:00
|
|
|
|
|
|
|
if (PRINT_PORT && DEBUG_IO_TRACE())
|
|
|
|
ErrorF(" cfg_outw(%#x, %4.4x)\n", PciCfg1Addr + offset, val);
|
|
|
|
- pci_device_cfg_write_u16(Int10Current->dev, val, OFFSET(PciCfg1Addr) + offset);
|
|
|
|
+ pci_device_cfg_write_u16(pci_device_for_cfg_address(PciCfg1Addr),
|
|
|
|
+ val, PCI_OFFSET(PciCfg1Addr) + offset);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
return 0;
|
2008-03-11 23:36:33 +00:00
|
|
|
@@ -549,7 +590,8 @@ pciCfg1inb(CARD16 addr, CARD8 *val)
|
2008-03-11 01:18:22 +00:00
|
|
|
if ((addr >= 0xCFC) && (addr <= 0xCFF)) {
|
|
|
|
const unsigned offset = addr - 0xCFC;
|
|
|
|
|
|
|
|
- pci_device_cfg_read_u8(Int10Current->dev, val, OFFSET(PciCfg1Addr) + offset);
|
|
|
|
+ pci_device_cfg_read_u8(pci_device_for_cfg_address(PciCfg1Addr),
|
|
|
|
+ val, PCI_OFFSET(PciCfg1Addr) + offset);
|
|
|
|
if (PRINT_PORT && DEBUG_IO_TRACE())
|
|
|
|
ErrorF(" cfg_inb(%#x) = %2.2x\n", PciCfg1Addr + offset, *val);
|
|
|
|
return 1;
|
2008-03-11 23:36:33 +00:00
|
|
|
@@ -573,7 +615,8 @@ pciCfg1outb(CARD16 addr, CARD8 val)
|
2008-03-11 01:18:22 +00:00
|
|
|
|
|
|
|
if (PRINT_PORT && DEBUG_IO_TRACE())
|
|
|
|
ErrorF(" cfg_outb(%#x, %2.2x)\n", PciCfg1Addr + offset, val);
|
|
|
|
- pci_device_cfg_write_u8(Int10Current->dev, val, OFFSET(PciCfg1Addr) + offset);
|
|
|
|
+ pci_device_cfg_write_u8(pci_device_for_cfg_address(PciCfg1Addr),
|
|
|
|
+ val, PCI_OFFSET(PciCfg1Addr) + offset);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
--
|
2008-03-11 23:36:33 +00:00
|
|
|
1.5.4.3
|
2008-03-11 01:18:22 +00:00
|
|
|
|