<e820_host state='on'/>
<passthrough state='on' mode='share_pt'/>
</xen>
- <pci>
- <acpi-bridge-hotplug state="on"/>
- </pci>
<pvspinlock state='on'/>
<gic version='2'/>
<ioapic driver='qemu'/>
passthrough Enable IOMMU mappings allowing PCI passthrough on, off; mode - optional string sync_pt or share_pt :since:`6.3.0`
=========== ============================================== =================================================== ==============
-``pci``
- Various PCI bus related features of the hypervisor.
-
- ==================== ========================================================================================================= ======= ==============
- Feature Description Value Since
- ==================== ========================================================================================================= ======= ==============
- acpi-bridge-hotplug Enable ACPI based hotplug on the cold-plugged PCI bridges (pc) and pcie-root-ports (q35) (also see notes) on, off :since:`7.9.0`
- ==================== ========================================================================================================= ======= ==============
-
- Note: pc machine types (i440fx) have ACPI hotplug enabled by
- default on cold plugged bridges (bridges that were present in the
- VM's domain definition before it was started). Disabling ACPI
- hotplug leaves only SHPC hotplug enabled; many OSes don't
- support SHPC hotplug, so this may have the effect of completely
- disabling hotplug.
-
- On q35 machinetypes earlier than pc-q35-6.1 (regardless of the QEMU
- binary version), ACPI hotplug for cold plugged bridges is disabled
- by default, and native PCIe hotplug is enabled instead. Enabling
- ACPI hotplug will disable native PCIe hotplug.
-
- Starting with the pc-q35-6.1 machinetype, ACPI hotplug is enabled
- on cold plugged bridges by default while native PCIe hotplug is
- disabled. In this case, disabling ACPI hotplug will re-enable PCIe
- native hotplug.
-
``pmu``
Depending on the ``state`` attribute (values ``on``, ``off``, default ``on``)
enable or disable the performance monitoring unit for the guest.
<optional>
<ref name="ioapic"/>
</optional>
- <optional>
- <ref name="pci"/>
- </optional>
<optional>
<ref name="hpt"/>
</optional>
</element>
</define>
- <define name="pci">
- <element name="pci">
- <interleave>
- <optional>
- <element name="acpi-bridge-hotplug">
- <ref name="featurestate"/>
- </element>
- </optional>
- </interleave>
- </element>
- </define>
-
<define name="ioapic">
<element name="ioapic">
<attribute name="driver">
"cfpc",
"sbbc",
"ibs",
- "pci",
);
VIR_ENUM_IMPL(virDomainCapabilitiesPolicy,
"passthrough",
);
-VIR_ENUM_IMPL(virDomainPCI,
- VIR_DOMAIN_PCI_LAST,
- "acpi-bridge-hotplug",
-);
-
VIR_ENUM_IMPL(virDomainXenPassthroughMode,
VIR_DOMAIN_XEN_PASSTHROUGH_MODE_LAST,
"default",
return 0;
}
-static int
-virDomainFeaturesPCIDefParse(virDomainDef *def,
- xmlNodePtr node)
-{
- def->features[VIR_DOMAIN_FEATURE_PCI] = VIR_TRISTATE_SWITCH_ON;
-
- node = xmlFirstElementChild(node);
- while (node) {
- int feature;
- virTristateSwitch value;
-
- feature = virDomainPCITypeFromString((const char *)node->name);
- if (feature < 0) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- _("unsupported PCI feature: %s"),
- node->name);
- return -1;
- }
-
- if (virXMLPropTristateSwitch(node, "state", VIR_XML_PROP_REQUIRED,
- &value) < 0)
- return -1;
-
- def->pci_features[feature] = value;
-
- node = xmlNextElementSibling(node);
- }
-
- return 0;
-}
static int
virDomainFeaturesXENDefParse(virDomainDef *def,
break;
}
- case VIR_DOMAIN_FEATURE_PCI:
- if (virDomainFeaturesPCIDefParse(def, nodes[i]) < 0)
- return -1;
-
case VIR_DOMAIN_FEATURE_LAST:
break;
}
return 0;
}
+
static int
virDomainDefMaybeAddHostdevSCSIcontroller(virDomainDef *def)
{
case VIR_DOMAIN_FEATURE_HTM:
case VIR_DOMAIN_FEATURE_NESTED_HV:
case VIR_DOMAIN_FEATURE_CCF_ASSIST:
- case VIR_DOMAIN_FEATURE_PCI:
if (src->features[i] != dst->features[i]) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("State of feature '%s' differs: "
}
}
- /* pci */
- if (src->features[VIR_DOMAIN_FEATURE_PCI] == VIR_TRISTATE_SWITCH_ON) {
- for (i = 0; i < VIR_DOMAIN_PCI_LAST; i++) {
- switch ((virDomainPCI) i) {
- case VIR_DOMAIN_PCI_ACPI_BRIDGE_HOTPLUG:
- if (src->pci_features[i] != dst->pci_features[i]) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- _("State of PCI feature '%s' differs: "
- "source: '%s', destination: '%s'"),
- virDomainPCITypeToString(i),
- virTristateSwitchTypeToString(src->pci_features[i]),
- virTristateSwitchTypeToString(dst->pci_features[i]));
- return false;
- }
-
- break;
-
- case VIR_DOMAIN_PCI_LAST:
- break;
- }
- }
- }
-
/* smm */
if (src->features[VIR_DOMAIN_FEATURE_SMM] == VIR_TRISTATE_SWITCH_ON) {
if (src->tseg_specified != dst->tseg_specified) {
virDomainIBSTypeToString(def->features[i]));
break;
- case VIR_DOMAIN_FEATURE_PCI:
- if (def->features[i] != VIR_TRISTATE_SWITCH_ON)
- break;
-
- virBufferAddLit(&childBuf, "<pci>\n");
- virBufferAdjustIndent(&childBuf, 2);
- for (j = 0; j < VIR_DOMAIN_PCI_LAST; j++) {
- switch ((virDomainPCI) j) {
- case VIR_DOMAIN_PCI_ACPI_BRIDGE_HOTPLUG:
- if (def->pci_features[j] != VIR_TRISTATE_SWITCH_ABSENT)
- virBufferAsprintf(&childBuf, "<%s state='%s'/>\n",
- virDomainPCITypeToString(j),
- virTristateSwitchTypeToString(
- def->pci_features[j]));
- break;
-
- case VIR_DOMAIN_PCI_LAST:
- break;
- }
- }
- virBufferAdjustIndent(&childBuf, -2);
- virBufferAddLit(&childBuf, "</pci>\n");
- break;
-
case VIR_DOMAIN_FEATURE_LAST:
break;
}
VIR_DOMAIN_FEATURE_CFPC,
VIR_DOMAIN_FEATURE_SBBC,
VIR_DOMAIN_FEATURE_IBS,
- VIR_DOMAIN_FEATURE_PCI,
VIR_DOMAIN_FEATURE_LAST
} virDomainFeature;
VIR_DOMAIN_HYPERV_LAST
} virDomainHyperv;
-typedef enum {
- VIR_DOMAIN_PCI_ACPI_BRIDGE_HOTPLUG = 0,
-
- VIR_DOMAIN_PCI_LAST
-} virDomainPCI;
-
typedef enum {
VIR_DOMAIN_KVM_HIDDEN = 0,
VIR_DOMAIN_KVM_DEDICATED,
int features[VIR_DOMAIN_FEATURE_LAST];
int caps_features[VIR_DOMAIN_PROCES_CAPS_FEATURE_LAST];
int hyperv_features[VIR_DOMAIN_HYPERV_LAST];
- int pci_features[VIR_DOMAIN_PCI_LAST];
int kvm_features[VIR_DOMAIN_KVM_LAST];
int msrs_features[VIR_DOMAIN_MSRS_LAST];
int xen_features[VIR_DOMAIN_XEN_LAST];
VIR_ENUM_DECL(virDomainGraphicsSpiceMouseMode);
VIR_ENUM_DECL(virDomainGraphicsVNCSharePolicy);
VIR_ENUM_DECL(virDomainHyperv);
-VIR_ENUM_DECL(virDomainPCI);
VIR_ENUM_DECL(virDomainKVM);
VIR_ENUM_DECL(virDomainXen);
VIR_ENUM_DECL(virDomainXenPassthroughMode);
return 0;
}
-static int
-qemuValidateDomainDefPCIFeature(const virDomainDef *def,
- virQEMUCaps *qemuCaps,
- int feature)
-{
- size_t i;
- bool q35Dom = qemuDomainIsQ35(def);
- bool q35cap = q35Dom && virQEMUCapsGet(qemuCaps,
- QEMU_CAPS_ICH9_ACPI_HOTPLUG_BRIDGE);
-
- if (def->features[feature] == VIR_TRISTATE_SWITCH_ABSENT)
- return 0;
-
- for (i = 0; i < VIR_DOMAIN_PCI_LAST; i++) {
- if (def->pci_features[i] == VIR_TRISTATE_SWITCH_ABSENT)
- continue;
-
- switch ((virDomainPCI) i) {
- case VIR_DOMAIN_PCI_ACPI_BRIDGE_HOTPLUG:
- if (!ARCH_IS_X86(def->os.arch)) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- _("acpi-bridge-hotplug is not available "
- "for architecture '%s'"),
- virArchToString(def->os.arch));
- return -1;
- }
- if (!q35cap &&
- !virQEMUCapsGet(qemuCaps,
- QEMU_CAPS_PIIX4_ACPI_HOTPLUG_BRIDGE)) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("acpi-bridge-hotplug is not available "
- "with this QEMU binary"));
- return -1;
- }
- break;
-
- case VIR_DOMAIN_PCI_LAST:
- break;
- }
- }
- return 0;
-}
static int
qemuValidateDomainDefFeatures(const virDomainDef *def,
}
break;
- case VIR_DOMAIN_FEATURE_PCI:
- if (qemuValidateDomainDefPCIFeature(def, qemuCaps, i) < 0)
- return -1;
- break;
case VIR_DOMAIN_FEATURE_SMM:
case VIR_DOMAIN_FEATURE_KVM:
case VIR_DOMAIN_FEATURE_XEN:
+++ /dev/null
-<domain type='qemu'>
- <name>i440fx</name>
- <uuid>56f5055c-1b8d-490c-844a-ad646a1caaaa</uuid>
- <memory unit='KiB'>1048576</memory>
- <currentMemory unit='KiB'>1048576</currentMemory>
- <vcpu placement='static'>1</vcpu>
- <os>
- <type arch='aarch64' machine='virt'>hvm</type>
- <boot dev='network'/>
- </os>
- <features>
- <pci>
- <acpi-bridge-hotplug state='off'/>
- </pci>
- </features>
- <clock offset='utc'/>
- <on_poweroff>destroy</on_poweroff>
- <on_reboot>restart</on_reboot>
- <on_crash>destroy</on_crash>
- <devices>
- <emulator>/usr/bin/qemu-system-aarch64</emulator>
- <controller type='usb' index='0'>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
- </controller>
- <controller type='pci' index='0' model='pci-root'/>
- <input type='mouse' bus='ps2'/>
- <input type='keyboard' bus='ps2'/>
- <audio id='1' type='none'/>
- <memballoon model='virtio'>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
- </memballoon>
- </devices>
-</domain>
+++ /dev/null
-<domain type='qemu'>
- <name>i440fx</name>
- <uuid>56f5055c-1b8d-490c-844a-ad646a1caaaa</uuid>
- <memory unit='KiB'>1048576</memory>
- <currentMemory unit='KiB'>1048576</currentMemory>
- <vcpu placement='static'>1</vcpu>
- <os>
- <type arch='x86_64' machine='pc-i440fx-2.5'>hvm</type>
- <boot dev='network'/>
- </os>
- <features>
- <pci>
- <acpi-bridge-hotplug state='off'/>
- </pci>
- </features>
- <clock offset='utc'/>
- <on_poweroff>destroy</on_poweroff>
- <on_reboot>restart</on_reboot>
- <on_crash>destroy</on_crash>
- <devices>
- <emulator>/usr/bin/qemu-system-x86_64</emulator>
- <controller type='usb' index='0'>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
- </controller>
- <controller type='pci' index='0' model='pci-root'/>
- <input type='mouse' bus='ps2'/>
- <input type='keyboard' bus='ps2'/>
- <audio id='1' type='none'/>
- <memballoon model='virtio'>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
- </memballoon>
- </devices>
-</domain>
+++ /dev/null
-<domain type='qemu'>
- <name>i440fx</name>
- <uuid>56f5055c-1b8d-490c-844a-ad646a1caaaa</uuid>
- <memory unit='KiB'>1048576</memory>
- <currentMemory unit='KiB'>1048576</currentMemory>
- <vcpu placement='static'>1</vcpu>
- <os>
- <type arch='x86_64' machine='pc-i440fx-2.5'>hvm</type>
- <boot dev='network'/>
- </os>
- <features>
- <pci>
- <acpi-bridge-hotplug state='on'/>
- </pci>
- </features>
- <clock offset='utc'/>
- <on_poweroff>destroy</on_poweroff>
- <on_reboot>restart</on_reboot>
- <on_crash>destroy</on_crash>
- <devices>
- <emulator>/usr/bin/qemu-system-x86_64</emulator>
- <controller type='usb' index='0'>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
- </controller>
- <controller type='pci' index='0' model='pci-root'/>
- <input type='mouse' bus='ps2'/>
- <input type='keyboard' bus='ps2'/>
- <audio id='1' type='none'/>
- <memballoon model='virtio'>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
- </memballoon>
- </devices>
-</domain>
+++ /dev/null
-<domain type='qemu'>
- <name>q35</name>
- <uuid>56f5055c-1b8d-490c-844a-ad646a1caaaa</uuid>
- <memory unit='KiB'>1048576</memory>
- <currentMemory unit='KiB'>1048576</currentMemory>
- <vcpu placement='static'>1</vcpu>
- <os>
- <type arch='x86_64' machine='pc-q35-2.5'>hvm</type>
- <boot dev='network'/>
- </os>
- <features>
- <pci>
- <acpi-bridge-hotplug state='off'/>
- </pci>
- </features>
- <clock offset='utc'/>
- <on_poweroff>destroy</on_poweroff>
- <on_reboot>restart</on_reboot>
- <on_crash>destroy</on_crash>
- <devices>
- <emulator>/usr/bin/qemu-system-x86_64</emulator>
- <controller type='sata' index='0'>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/>
- </controller>
- <controller type='pci' index='0' model='pcie-root'/>
- <controller type='pci' index='1' model='dmi-to-pci-bridge'>
- <model name='i82801b11-bridge'/>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x1e' function='0x0'/>
- </controller>
- <controller type='pci' index='2' model='pci-bridge'>
- <model name='pci-bridge'/>
- <target chassisNr='2'/>
- <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
- </controller>
- <controller type='pci' index='3' model='pcie-root-port'>
- <model name='ioh3420'/>
- <target chassis='3' port='0x8'/>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
- </controller>
- <input type='mouse' bus='ps2'/>
- <input type='keyboard' bus='ps2'/>
- <audio id='1' type='none'/>
- <memballoon model='virtio'>
- <address type='pci' domain='0x0000' bus='0x02' slot='0x01' function='0x0'/>
- </memballoon>
- </devices>
-</domain>
+++ /dev/null
-<domain type='qemu'>
- <name>q35</name>
- <uuid>56f5055c-1b8d-490c-844a-ad646a1caaaa</uuid>
- <memory unit='KiB'>1048576</memory>
- <currentMemory unit='KiB'>1048576</currentMemory>
- <vcpu placement='static'>1</vcpu>
- <os>
- <type arch='x86_64' machine='pc-q35-2.5'>hvm</type>
- <boot dev='network'/>
- </os>
- <features>
- <pci>
- <acpi-bridge-hotplug state='on'/>
- </pci>
- </features>
- <clock offset='utc'/>
- <on_poweroff>destroy</on_poweroff>
- <on_reboot>restart</on_reboot>
- <on_crash>destroy</on_crash>
- <devices>
- <emulator>/usr/bin/qemu-system-x86_64</emulator>
- <controller type='sata' index='0'>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/>
- </controller>
- <controller type='pci' index='0' model='pcie-root'/>
- <controller type='pci' index='1' model='dmi-to-pci-bridge'>
- <model name='i82801b11-bridge'/>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x1e' function='0x0'/>
- </controller>
- <controller type='pci' index='2' model='pci-bridge'>
- <model name='pci-bridge'/>
- <target chassisNr='2'/>
- <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
- </controller>
- <controller type='pci' index='3' model='pcie-root-port'>
- <model name='ioh3420'/>
- <target chassis='3' port='0x8'/>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
- </controller>
- <input type='mouse' bus='ps2'/>
- <input type='keyboard' bus='ps2'/>
- <audio id='1' type='none'/>
- <memballoon model='virtio'>
- <address type='pci' domain='0x0000' bus='0x02' slot='0x01' function='0x0'/>
- </memballoon>
- </devices>
-</domain>
+++ /dev/null
-../qemuxml2argvdata/pc-i440fx-acpi-hotplug-bridge-disable.xml
\ No newline at end of file
+++ /dev/null
-../qemuxml2argvdata/pc-i440fx-acpi-hotplug-bridge-enable.xml
\ No newline at end of file
+++ /dev/null
-../qemuxml2argvdata/q35-acpi-hotplug-bridge-disable.xml
\ No newline at end of file
+++ /dev/null
-../qemuxml2argvdata/q35-acpi-hotplug-bridge-enable.xml
\ No newline at end of file
DO_TEST("misc-disable-s3", QEMU_CAPS_PIIX_DISABLE_S3);
DO_TEST_CAPS_LATEST("pc-i440fx-acpi-root-hotplug-disable");
DO_TEST_CAPS_LATEST("pc-i440fx-acpi-root-hotplug-enable");
- DO_TEST("pc-i440fx-acpi-hotplug-bridge-disable",
- QEMU_CAPS_PIIX4_ACPI_HOTPLUG_BRIDGE);
- DO_TEST("pc-i440fx-acpi-hotplug-bridge-enable",
- QEMU_CAPS_PIIX4_ACPI_HOTPLUG_BRIDGE);
- DO_TEST("q35-acpi-hotplug-bridge-disable",
- QEMU_CAPS_DEVICE_PCI_BRIDGE,
- QEMU_CAPS_DEVICE_IOH3420,
- QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE,
- QEMU_CAPS_ICH9_ACPI_HOTPLUG_BRIDGE);
- DO_TEST("q35-acpi-hotplug-bridge-enable",
- QEMU_CAPS_DEVICE_PCI_BRIDGE,
- QEMU_CAPS_DEVICE_IOH3420,
- QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE,
- QEMU_CAPS_ICH9_ACPI_HOTPLUG_BRIDGE);
DO_TEST("misc-disable-suspends",
QEMU_CAPS_PIIX_DISABLE_S3,
QEMU_CAPS_PIIX_DISABLE_S4);