Signed-off-by: Jiri Denemark
---
src/qemu/qemu_capabilities.c | 24 +-
src/qemu/qemu_capabilities.h | 3 +-
src/qemu/qemu_driver.c | 7 +-
tests/domaincapsschemadata/qemu_1.7.0.x86_64.xml | 31 +-
.../qemu_2.6.0-gicv2-virt.aarch64.xml | 37 +-
.../qemu_2.6.0-gicv3-virt.aarch64.xml | 37 +-
tests/domaincapsschemadata/qemu_2.6.0.aarch64.xml | 37 +-
tests/domaincapsschemadata/qemu_2.6.0.ppc64le.xml | 437 -
tests/domaincapsschemadata/qemu_2.6.0.x86_64.xml | 35 +-
tests/domaincapstest.c | 56 ++-
10 files changed, 682 insertions(+), 22 deletions(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index aeea3a3..7a7ddb8 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -4194,6 +4194,26 @@ virQEMUCapsFillDomainOSCaps(virDomainCapsOSPtr os,
static int
+virQEMUCapsFillDomainCPUCaps(virCapsPtr caps,
+ virQEMUCapsPtr qemuCaps,
+ virDomainCapsPtr domCaps)
+{
+
+if (domCaps->virttype == VIR_DOMAIN_VIRT_KVM &&
+virQEMUCapsGuestIsNative(caps->host.arch, qemuCaps->arch))
+domCaps->cpu.hostPassthrough = true;
+
+if (qemuCaps->cpuDefinitions && caps && caps->host.cpu)
+domCaps->cpu.hostModel = virQEMUCapsGuestIsNative(caps->host.arch,
+ qemuCaps->arch);
+
+domCaps->cpu.custom = virObjectRef(qemuCaps->cpuDefinitions);
+
+return 0;
+}
+
+
+static int
virQEMUCapsFillDomainDeviceDiskCaps(virQEMUCapsPtr qemuCaps,
const char *machine,
virDomainCapsDeviceDiskPtr disk)
@@ -4400,7 +4420,8 @@ virQEMUCapsFillDomainFeatureGICCaps(virQEMUCapsPtr
qemuCaps,
int
-virQEMUCapsFillDomainCaps(virDomainCapsPtr domCaps,
+virQEMUCapsFillDomainCaps(virCapsPtr caps,
+ virDomainCapsPtr domCaps,
virQEMUCapsPtr qemuCaps,
virFirmwarePtr *firmwares,
size_t nfirmwares)
@@ -4423,6 +,7 @@ virQEMUCapsFillDomainCaps(virDomainCapsPtr domCaps,
}
if (virQEMUCapsFillDomainOSCaps(os, firmwares, nfirmwares) < 0 ||
+virQEMUCapsFillDomainCPUCaps(caps, qemuCaps, domCaps) < 0 ||
virQEMUCapsFillDomainDeviceDiskCaps(qemuCaps,
domCaps->machine, disk) < 0 ||
virQEMUCapsFillDomainDeviceGraphicsCaps(qemuCaps, graphics) < 0 ||
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index 0767a87..9fd38d9 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -494,7 +494,8 @@ int virQEMUCapsInitGuestFromBinary(virCapsPtr caps,
virQEMUCapsPtr kvmbinCaps,
virArch guestarch);
-int virQEMUCapsFillDomainCaps(virDomainCapsPtr domCaps,
+int virQEMUCapsFillDomainCaps(virCapsPtr caps,
+ virDomainCapsPtr domCaps,
virQEMUCapsPtr qemuCaps,
virFirmwarePtr *firmwares,
size_t nfirmwares);
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index a424af0..7e4f4e7 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -18497,6 +18497,7 @@ qemuConnectGetDomainCapabilities(virConnectPtr conn,
virDomainCapsPtr domCaps = NULL;
int arch = virArchFromHost(); /* virArch */
virQEMUDriverConfigPtr cfg = NULL;
+virCapsPtr caps = NULL;
virCheckFlags(0, ret);
@@ -18505,6 +18506,9 @@ qemuConnectGetDomainCapabilities(virConnectPtr conn,
cfg = virQEMUDriverGetConfig(driver);
+if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
+goto cleanup;
+
if (qemuHostdevHostSupportsPassthroughLegacy() ||
qemuHostdevHostSupportsPassthroughVFIO())
virttype = VIR_DOMAIN_VIRT_KVM;
@@ -18576,13 +18580,14 @@ qemuConnectGetDomainCapabilities(virConnectPtr conn,
if (!(domCaps = virDomainCapsNew(emulatorbin, machine, arch, virttype)))
goto cleanup;
-if (virQEMUCapsFillDomainCaps(domCaps, qemuCaps,
+if (virQEMUCapsFillDomainCaps(caps, domCaps, qemuCaps,
cfg->firmwares, cfg->nfirmwares) < 0)
goto cleanup;
ret = virDomainCapsFormat(domCaps);
cleanup:
virObjectUnref(cfg);
+virObjectUnref(caps);
virObjectUnref(domCaps);
virObjectUnref(qemuCaps);
return ret;
diff --git a/tests/domaincapsschemadata/qemu_1.7.0.x86_64.xml
b/tests/domaincapsschemadata/qemu_1.7.0.x86_64.xml
index 6da28b0..4ee2f95 100644
--- a/tests/domaincapsschemadata/qemu_1.7.0.x86_64.xml
+++ b/tests/domaincapsschemadata/qemu_1.7.0.x86_64.xml
@@ -19,9 +19,34 @@