int bhyveDomainAssignPCIAddresses(virDomainDefPtr def, virDomainObjPtr obj) { virDomainPCIAddressSetPtr addrs = NULL; bhyveDomainObjPrivatePtr priv = NULL; int ret = -1; if (!(addrs = bhyveDomainPCIAddressSetCreate(def, 1))) goto cleanup; if (bhyveAssignDevicePCISlots(def, addrs) < 0) goto cleanup; if (obj && obj->privateData) { priv = obj->privateData; if (addrs) { virDomainPCIAddressSetFree(priv->pciaddrs); priv->persistentAddrs = 1; priv->pciaddrs = addrs; } else { priv->persistentAddrs = 0; } } ret = 0; cleanup: return ret; }
virDomainPCIAddressSetPtr virDomainPCIAddressSetAlloc(unsigned int nbuses) { virDomainPCIAddressSetPtr addrs; if (VIR_ALLOC(addrs) < 0) goto error; if (VIR_ALLOC_N(addrs->buses, nbuses) < 0) goto error; addrs->nbuses = nbuses; return addrs; error: virDomainPCIAddressSetFree(addrs); return NULL; }
virDomainPCIAddressSetPtr bhyveDomainPCIAddressSetCreate(virDomainDefPtr def, unsigned int nbuses) { virDomainPCIAddressSetPtr addrs; if ((addrs = virDomainPCIAddressSetAlloc(nbuses)) == NULL) return NULL; if (virDomainPCIAddressBusSetModel(&addrs->buses[0], VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT) < 0) goto error; if (virDomainDeviceInfoIterate(def, bhyveCollectPCIAddress, addrs) < 0) goto error; return addrs; error: virDomainPCIAddressSetFree(addrs); return NULL; }