int vzCheckUnsupportedControllers(virDomainDefPtr def, vzCapabilitiesPtr vzCaps) { size_t i, j; virDomainControllerDefPtr controller; for (i = 0; i < def->ncontrollers; i++) { controller = def->controllers[i]; for (j = 0; vzCaps->controllerTypes[j] != VIR_DOMAIN_CONTROLLER_TYPE_LAST; j++) { if (controller->type == vzCaps->controllerTypes[j]) break; } if (vzCaps->controllerTypes[j] == VIR_DOMAIN_CONTROLLER_TYPE_LAST) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported controller type %s"), virDomainControllerTypeToString(controller->type)); return -1; } if (controller->type == VIR_DOMAIN_CONTROLLER_TYPE_SCSI && controller->model != -1 && controller->model != VIR_DOMAIN_CONTROLLER_MODEL_SCSI_AUTO && controller->model != vzCaps->scsiControllerModel) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported SCSI controller model %s"), virDomainControllerModelSCSITypeToString(controller->model)); return -1; } } return 0; }
int qemuAssignDeviceControllerAlias(virDomainDefPtr domainDef, virQEMUCapsPtr qemuCaps, virDomainControllerDefPtr controller) { const char *prefix = virDomainControllerTypeToString(controller->type); if (controller->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) { if (!virQEMUCapsHasPCIMultiBus(qemuCaps, domainDef)) { /* qemus that don't support multiple PCI buses have * hardcoded the name of their single PCI controller as * "pci". */ return VIR_STRDUP(controller->info.alias, "pci"); } else if (controller->model == VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT) { /* The pcie-root controller on Q35 machinetypes uses a * different naming convention ("pcie.0"), because it is * hardcoded that way in qemu. */ return virAsprintf(&controller->info.alias, "pcie.%d", controller->idx); } /* All other PCI controllers use the consistent "pci.%u" * (including the hardcoded pci-root controller on * multibus-capable qemus). */ return virAsprintf(&controller->info.alias, "pci.%d", controller->idx); } else if (controller->type == VIR_DOMAIN_CONTROLLER_TYPE_IDE) { /* for any machine based on e.g. I440FX or G3Beige, the * first (and currently only) IDE controller is an integrated * controller hardcoded with id "ide" */ if (qemuDomainMachineHasBuiltinIDE(domainDef) && controller->idx == 0) return VIR_STRDUP(controller->info.alias, "ide"); } else if (controller->type == VIR_DOMAIN_CONTROLLER_TYPE_SATA) { /* for any Q35 machine, the first SATA controller is the * integrated one, and it too is hardcoded with id "ide" */ if (qemuDomainMachineIsQ35(domainDef) && controller->idx == 0) return VIR_STRDUP(controller->info.alias, "ide"); } else if (controller->type == VIR_DOMAIN_CONTROLLER_TYPE_USB) { /* first USB device is "usb", others are normal "usb%d" */ if (controller->idx == 0) return VIR_STRDUP(controller->info.alias, "usb"); } /* all other controllers use the default ${type}${index} naming * scheme for alias/id. */ return virAsprintf(&controller->info.alias, "%s%d", prefix, controller->idx); }