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

[Xen-devel] [PATCH] ioemu-remote: fix pt_init




ioemu-remote: pt_init must take a const direct_pci.

Signed-off-by: Jean Guyader <jean.guyader@xxxxxxxxxxxxx>

--
Jean Guyader
diff --git a/hw/pass-through.c b/hw/pass-through.c
index bddc203..abe0376 100644
--- a/hw/pass-through.c
+++ b/hw/pass-through.c
@@ -691,13 +689,15 @@ int power_off_php_slot(int php_slot)
     return unregister_real_device(php_slot);
 }
 
-int pt_init(PCIBus *e_bus, char *direct_pci)
+int pt_init(PCIBus *e_bus, const char *direct_pci)
 {
     int seg, b, d, f, php_slot = 0;
     struct pt_dev *pt_dev;
     struct pci_access *pci_access;
     char *vslots;
     char slot_str[8];
+    char *direct_pci_head = NULL;
+    char *direct_pci_p = NULL;
 
     /* Initialize libpci */
     pci_access = pci_alloc();
@@ -713,17 +713,20 @@ int pt_init(PCIBus *e_bus, char *direct_pci)
     dpci_infos.pci_access = pci_access;
     dpci_infos.e_bus      = e_bus;
 
-    if ( strlen(direct_pci) == 0 ) {
+    if ( !direct_pci || strlen(direct_pci) == 0 ) {
         return 0;
     }
 
+    if ( !(direct_pci_head = direct_pci_p = strdup(direct_pci)) )
+        return 0;
+
     /* the virtual pci slots of all pass-through devs
      * with hex format: xx;xx...;
      */
     vslots = qemu_mallocz ( strlen(direct_pci) / 3 );
 
     /* Assign given devices to guest */
-    while ( next_bdf(&direct_pci, &seg, &b, &d, &f) )
+    while ( next_bdf(&direct_pci_p, &seg, &b, &d, &f) )
     {
         /* Register real device with the emulated bus */
         pt_dev = register_real_device(e_bus, "DIRECT PCI", PT_VIRT_DEVFN_AUTO,
@@ -731,6 +734,7 @@ int pt_init(PCIBus *e_bus, char *direct_pci)
         if ( pt_dev == NULL )
         {
             PT_LOG("Error: Registration failed (%02x:%02x.%x)\n", b, d, f);
+            free(direct_pci_head);
             return -1;
         }
 
@@ -751,6 +755,7 @@ int pt_init(PCIBus *e_bus, char *direct_pci)
     xenstore_write_vslots(vslots);
 
     qemu_free(vslots);
+    free(direct_pci_head);
 
     /* Success */
     return 0;
diff --git a/hw/pass-through.h b/hw/pass-through.h
index ffd87ef..4f5d88a 100644
--- a/hw/pass-through.h
+++ b/hw/pass-through.h
@@ -112,7 +112,5 @@ struct pci_config_cf8 {
     };
 };
 
-int pt_init(PCIBus * e_bus, char * direct_pci);
-
 #endif /* __PASSTHROUGH_H__ */
 
diff --git a/hw/pci.h b/hw/pci.h
index 250c8ab..a855de8 100644
--- a/hw/pci.h
+++ b/hw/pci.h
@@ -164,4 +164,7 @@ PCIBus *pci_prep_init(qemu_irq *pic);
 PCIBus *pci_apb_init(target_phys_addr_t special_base, target_phys_addr_t 
mem_base,
                      qemu_irq *pic);
 
+/* pass-through.c */
+int pt_init(PCIBus *e_bus, const char *direct_pci_opt);
+
 #endif
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

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