int ret = -1;
char *devStr = NULL;
const char *contAlias = NULL;
+ bool contIsPHB = false;
+ int contTargetIndex = 0;
if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
size_t i;
if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI &&
cont->idx == info->addr.pci.bus) {
contAlias = cont->info.alias;
+ contIsPHB = virDomainControllerIsPCIHostBridge(cont);
+ contTargetIndex = cont->opts.pciopts.targetIndex;
if (!contAlias) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Device alias was not set for PCI "
}
}
- virBufferAsprintf(buf, ",bus=%s", contAlias);
+ if (contIsPHB && contTargetIndex > 0) {
+ /* The PCI bus created by a spapr-pci-host-bridge device with
+ * alias 'x' will be called 'x.0' rather than 'x'; however,
+ * this does not apply to the implicit PHB in a pSeries guest,
+ * which always has the hardcoded name 'pci.0' */
+ virBufferAsprintf(buf, ",bus=%s.0", contAlias);
+ } else {
+ /* For all other controllers, the bus name matches the alias
+ * of the corresponding controller */
+ virBufferAsprintf(buf, ",bus=%s", contAlias);
+ }
if (info->addr.pci.multi == VIR_TRISTATE_SWITCH_ON)
virBufferAddLit(buf, ",multifunction=on");