From: Ian Jackson Date: Fri, 18 Jul 2008 14:34:32 +0000 (+0100) Subject: ioemu-remote: pt_init must take a const direct_pci. X-Git-Tag: xen-3.3.0-rc1~22 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=ad5c72add5afaf76e254ab7c3fada914d44c8f23;p=qemu-xen-4.0-testing.git ioemu-remote: pt_init must take a const direct_pci. [ Also copes with direct_pci==0 on entry, which was the remaining portion of b7eec990223bb8c4b145597af37592103c412542 -iwj ] Signed-off-by: Jean Guyader --- diff --git a/hw/pass-through.c b/hw/pass-through.c index 21576a47..bacf7ced 100644 --- a/hw/pass-through.c +++ b/hw/pass-through.c @@ -689,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(); @@ -711,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, @@ -729,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; } @@ -749,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 183ae099..522a295d 100644 --- a/hw/pass-through.h +++ b/hw/pass-through.h @@ -113,7 +113,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 250c8ab0..7ee630da 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