ioemu: fix libpci error handling.
authorKeir Fraser <keir.fraser@citrix.com>
Fri, 1 Aug 2008 08:53:05 +0000 (09:53 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Fri, 1 Aug 2008 08:53:05 +0000 (09:53 +0100)
libpci returns ALL F when error occurs. Currently, if libpci returns
ALL F, emulation stops. But it is possible that the field of real register
which is read by guest software is ALL F.

After applying this patch, if libpci returns ALL F, ioemu will log
warning message and continue the emulation.

Signed-off-by: Yuji Shimada <shimada-yxb@necst.nec.co.jp>
tools/ioemu/hw/pass-through.c

index 803885a4e8bd6779e689081ca58bbcc93ae3e759..d1101addfd82980cf8ed0dba5da75a45669a1416 100644 (file)
@@ -1087,15 +1087,14 @@ static void pt_pci_write_config(PCIDevice *d, uint32_t address, uint32_t val,
         break;
     }
 
-    /* check libpci error */
+    /* check libpci result */
     valid_mask = (0xFFFFFFFF >> ((4 - len) << 3));
     if ((read_val & valid_mask) == valid_mask)
     {
-        PT_LOG("libpci read error. No emulation. "
+        PT_LOG("Warning: Return ALL F from libpci read. "
             "[%02x:%02x.%x][Offset:%02xh][Length:%d]\n",
             pci_bus_num(d->bus), ((d->devfn >> 3) & 0x1F), (d->devfn & 0x7),
             address, len);
-        goto exit;
     }
     
     /* pass directly to libpci for passthrough type register group */
@@ -1264,15 +1263,14 @@ static uint32_t pt_pci_read_config(PCIDevice *d, uint32_t address, int len)
         break;
     }
 
-    /* check libpci error */
+    /* check libpci result */
     valid_mask = (0xFFFFFFFF >> ((4 - len) << 3));
     if ((val & valid_mask) == valid_mask)
     {
-        PT_LOG("libpci read error. No emulation. "
+        PT_LOG("Warning: Return ALL F from libpci read. "
             "[%02x:%02x.%x][Offset:%02xh][Length:%d]\n",
             pci_bus_num(d->bus), ((d->devfn >> 3) & 0x1F), (d->devfn & 0x7),
             address, len);
-        goto exit;
     }
 
     /* just return the I/O device register value for