[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] [qemu] Fix PCI config header space writes and set Subsystem-Vendor ID fields.



# HG changeset patch
# User Christian Limpach <Christian.Limpach@xxxxxxxxxxxxx>
# Node ID a1cff03ac7d7e416c002e82736eacc7752ca0b8d
# Parent  7210b62802be9d2785b7df65d11798f68019ee49
[qemu] Fix PCI config header space writes and set Subsystem-Vendor ID fields.
Fix failure in Windows HCT's PCI-Compliance-Test by invalidating the
writing to read-only/reserved fields in PCI configuration space header
and giving Subsystem-Vendor-ID field a valid value via copying Vendor-ID
field into it.

Signed-off-by: Dexuan Cui <dexuan.cui@xxxxxxxxx>
---
 tools/ioemu/hw/pci.c      |   13 +++++++++++++
 tools/ioemu/hw/rtl8139.c  |    2 ++
 tools/ioemu/hw/usb-uhci.c |    2 ++
 3 files changed, 17 insertions(+)

diff -r 7210b62802be -r a1cff03ac7d7 tools/ioemu/hw/pci.c
--- a/tools/ioemu/hw/pci.c      Mon Aug 28 21:57:34 2006 +0100
+++ b/tools/ioemu/hw/pci.c      Mon Aug 28 22:43:09 2006 +0100
@@ -286,6 +286,7 @@ void pci_default_write_config(PCIDevice 
             case 0x0b:
             case 0x0e:
             case 0x10 ... 0x27: /* base */
+            case 0x2c ... 0x2f: /* subsystem vendor id, subsystem id */
             case 0x30 ... 0x33: /* rom */
             case 0x3d:
                 can_write = 0;
@@ -318,6 +319,18 @@ void pci_default_write_config(PCIDevice 
             break;
         }
         if (can_write) {
+            if( addr == 0x05 ) {
+                /* In Command Register, bits 15:11 are reserved */
+                val &= 0x07; 
+            } else if ( addr == 0x06 ) {
+                /* In Status Register, bits 6, 2:0 are reserved, */
+                /* and bits 7,5,4,3 are read only */
+                val = d->config[addr];
+            } else if ( addr == 0x07 ) {
+                /* In Status Register, bits 10,9 are reserved, */
+                val = (val & ~0x06) | (d->config[addr] & 0x06);
+            }
+
             d->config[addr] = val;
         }
         addr++;
diff -r 7210b62802be -r a1cff03ac7d7 tools/ioemu/hw/rtl8139.c
--- a/tools/ioemu/hw/rtl8139.c  Mon Aug 28 21:57:34 2006 +0100
+++ b/tools/ioemu/hw/rtl8139.c  Mon Aug 28 22:43:09 2006 +0100
@@ -3423,6 +3423,8 @@ void pci_rtl8139_init(PCIBus *bus, NICIn
     pci_conf[0x0e] = 0x00; /* header_type */
     pci_conf[0x3d] = 1;    /* interrupt pin 0 */
     pci_conf[0x34] = 0xdc;
+    pci_conf[0x2c] = pci_conf[0x00]; // same as Vendor ID
+    pci_conf[0x2d] = pci_conf[0x01];
 
     s = &d->rtl8139;
 
diff -r 7210b62802be -r a1cff03ac7d7 tools/ioemu/hw/usb-uhci.c
--- a/tools/ioemu/hw/usb-uhci.c Mon Aug 28 21:57:34 2006 +0100
+++ b/tools/ioemu/hw/usb-uhci.c Mon Aug 28 22:43:09 2006 +0100
@@ -659,6 +659,8 @@ void usb_uhci_init(PCIBus *bus, int devf
     pci_conf[0x0e] = 0x00; // header_type
     pci_conf[0x3d] = 4; // interrupt pin 3
     pci_conf[0x60] = 0x10; // release number
+    pci_conf[0x2c] = pci_conf[0x00]; // same as Vendor ID
+    pci_conf[0x2d] = pci_conf[0x01];
     
     for(i = 0; i < NB_PORTS; i++) {
         qemu_register_usb_port(&s->ports[i].port, s, i, uhci_attach);

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.