Blob Blame History Raw
From 8746d1e3a7844e1030eefc6e160756ec43bce246 Mon Sep 17 00:00:00 2001
From: Bart Trojanowski <bart@symbio-technologies.com>
Date: Fri, 11 Jan 2008 19:59:54 -0500
Subject: [PATCH] X86EMU: when emulating PCI access, use the correct device

When in x86emu, the PCI emulation routines were being given the TAG of
the video device regardless of what the BIOS code that is being emulated
asked for.

This patch uses the bus:dev:fn numbers that were passed to 0xCF8 when
calling the libpciaccess functions after an access to 0xCFC.

Thanks to Symbio Technologies for funding my work, and ThinCan for
providing hardware :)

Signed-off-by: Bart Trojanowski <bart@jukie.net>
---
 hw/xfree86/int10/helper_exec.c |   15 ++++++++-------
 1 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/hw/xfree86/int10/helper_exec.c b/hw/xfree86/int10/helper_exec.c
index babf99c..cc95ef3 100644
--- a/hw/xfree86/int10/helper_exec.c
+++ b/hw/xfree86/int10/helper_exec.c
@@ -549,7 +549,8 @@ Mem_wl(CARD32 addr, CARD32 val)
 
 static CARD32 PciCfg1Addr = 0;
 
-#define OFFSET(Cfg1Addr) (Cfg1Addr & 0xff)
+#define PCI_OFFSET(x) ((x) & 0x000000ff)
+#define PCI_TAG(x)    ((x) & 0x00ffff00)
 
 static int
 pciCfg1in(CARD16 addr, CARD32 *val)
@@ -559,7 +560,7 @@ pciCfg1in(CARD16 addr, CARD32 *val)
 	return 1;
     }
     if (addr == 0xCFC) {
-	*val = pciReadLong(Int10Current->Tag, OFFSET(PciCfg1Addr));
+	*val = pciReadLong(PCI_TAG(PciCfg1Addr), PCI_OFFSET(PciCfg1Addr));
 	return 1;
     }
     return 0;
@@ -573,7 +574,7 @@ pciCfg1out(CARD16 addr, CARD32 val)
 	return 1;
     }
     if (addr == 0xCFC) {
-	pciWriteLong(Int10Current->Tag, OFFSET(PciCfg1Addr), val);
+	pciWriteLong(PCI_TAG(PciCfg1Addr), PCI_OFFSET(PciCfg1Addr), val);
 	return 1;
     }
     return 0;
@@ -591,7 +592,7 @@ pciCfg1inw(CARD16 addr, CARD16 *val)
     }
     if ((addr >= 0xCFC) && (addr <= 0xCFF)) {
 	offset = addr - 0xCFC;
-	*val = pciReadWord(Int10Current->Tag, OFFSET(PciCfg1Addr) + offset);
+	*val = pciReadWord(PCI_TAG(PciCfg1Addr), PCI_OFFSET(PciCfg1Addr) + offset);
 	return 1;
     }
     return 0;
@@ -610,7 +611,7 @@ pciCfg1outw(CARD16 addr, CARD16 val)
     }
     if ((addr >= 0xCFC) && (addr <= 0xCFF)) {
 	offset = addr - 0xCFC;
-	pciWriteWord(Int10Current->Tag, OFFSET(PciCfg1Addr) + offset, val);
+	pciWriteWord(PCI_TAG(PciCfg1Addr), PCI_OFFSET(PciCfg1Addr) + offset, val);
 	return 1;
     }
     return 0;
@@ -628,7 +629,7 @@ pciCfg1inb(CARD16 addr, CARD8 *val)
     }
     if ((addr >= 0xCFC) && (addr <= 0xCFF)) {
 	offset = addr - 0xCFC;
-	*val = pciReadByte(Int10Current->Tag, OFFSET(PciCfg1Addr) + offset);
+	*val = pciReadByte(PCI_TAG(PciCfg1Addr), PCI_OFFSET(PciCfg1Addr) + offset);
 	return 1;
     }
     return 0;
@@ -647,7 +648,7 @@ pciCfg1outb(CARD16 addr, CARD8 val)
     }
     if ((addr >= 0xCFC) && (addr <= 0xCFF)) {
 	offset = addr - 0xCFC;
-	pciWriteByte(Int10Current->Tag, OFFSET(PciCfg1Addr) + offset, val);
+	pciWriteByte(PCI_TAG(PciCfg1Addr), PCI_OFFSET(PciCfg1Addr) + offset, val);
 	return 1;
     }
     return 0;
-- 
1.5.3.7.1150.g149d432