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

[Xen-changelog] [xen-4.0-testing] hvmloader: fix off-by-one-bit error when initialising PCI devices



# HG changeset patch
# User Keir Fraser <keir@xxxxxxx>
# Date 1289398605 0
# Node ID ec0c3f773c3e2e3f125bc99582c5db1032be3ae7
# Parent  750c0c1e4606c91cd800701ca02e9e180e21c4c5
hvmloader: fix off-by-one-bit error when initialising PCI devices

hvmloader is responsible for - amoungst other things - initialising
the PCI device BARs prior to loading the guest BIOS.  The previous
code only probed for devfn up to 128.  The lower 3 bits are function
IDs so this meant that only devices in slots 0-15 were actually being
initialized.

Signed-off-by: Alex Zeffertt <alex.zeffertt@xxxxxxxxxxxxx>
Acked-by: Gianni Tedesco <gianni.tedesco@xxxxxxxxxx>
xen-unstable changeset:   22383:cba667fb80cf
xen-unstable date:        Wed Nov 10 13:58:16 2010 +0000

hvmloader: Fix 22383:cba667fb80cf iterating over defns 0..255

We need to declare devfn as wider than 8 bits for a loop 0<devfn<256
to terminate.

Signed-off-by: Keir Fraser <keir@xxxxxxx>
xen-unstable changeset:   22384:c19e3371f31b
xen-unstable date:        Wed Nov 10 14:15:23 2010 +0000
---
 tools/firmware/hvmloader/hvmloader.c |   14 ++++++--------
 1 files changed, 6 insertions(+), 8 deletions(-)

diff -r 750c0c1e4606 -r ec0c3f773c3e tools/firmware/hvmloader/hvmloader.c
--- a/tools/firmware/hvmloader/hvmloader.c      Tue Nov 09 20:42:20 2010 +0000
+++ b/tools/firmware/hvmloader/hvmloader.c      Wed Nov 10 14:16:45 2010 +0000
@@ -196,7 +196,7 @@ static void pci_setup(void)
     outb(0x4d1, (uint8_t)(PCI_ISA_IRQ_MASK >> 8));
 
     /* Scan the PCI bus and map resources. */
-    for ( devfn = 0; devfn < 128; devfn++ )
+    for ( devfn = 0; devfn < 256; devfn++ )
     {
         class     = pci_readw(devfn, PCI_CLASS_DEVICE);
         vendor_id = pci_readw(devfn, PCI_VENDOR_ID);
@@ -466,11 +466,10 @@ static int scan_option_rom(
  */
 static int scan_etherboot_nic(uint32_t copy_rom_dest)
 {
-    uint8_t devfn;
-    uint16_t class, vendor_id, device_id;
+    uint16_t class, vendor_id, device_id, devfn;
     int rom_size = 0;
 
-    for ( devfn = 0; (devfn < 128) && !rom_size; devfn++ )
+    for ( devfn = 0; (devfn < 256) && !rom_size; devfn++ )
     {
         class     = pci_readw(devfn, PCI_CLASS_DEVICE);
         vendor_id = pci_readw(devfn, PCI_VENDOR_ID);
@@ -494,10 +493,9 @@ static int pci_load_option_roms(uint32_t
 static int pci_load_option_roms(uint32_t rom_base_addr)
 {
     uint32_t option_rom_addr, rom_phys_addr = rom_base_addr;
-    uint16_t vendor_id, device_id;
-    uint8_t devfn, class;
-
-    for ( devfn = 0; devfn < 128; devfn++ )
+    uint16_t vendor_id, device_id, devfn, class;
+
+    for ( devfn = 0; devfn < 256; devfn++ )
     {
         class     = pci_readb(devfn, PCI_CLASS_DEVICE + 1);
         vendor_id = pci_readw(devfn, PCI_VENDOR_ID);

_______________________________________________
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®.