diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index e201d26540..87749c9fb5 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -4283,6 +4283,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->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,
@@ -4490,7 +4510,8 @@ virQEMUCapsFillDomainFeatureGICCaps(virQEMUCapsPtr qemuCaps,
int
-virQEMUCapsFillDomainCaps(virDomainCapsPtr domCaps,
+virQEMUCapsFillDomainCaps(virCapsPtr caps,
+ virDomainCapsPtr domCaps,
virQEMUCapsPtr qemuCaps,
virFirmwarePtr *firmwares,
size_t nfirmwares)
@@ -4513,6 +4534,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 e31c51c8a0..dcd358afd5 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -501,7 +501,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 5575b0a622..36a3067658 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -18637,6 +18637,7 @@ qemuConnectGetDomainCapabilities(virConnectPtr conn,
virDomainCapsPtr domCaps = NULL;
int arch = virArchFromHost(); /* virArch */
virQEMUDriverConfigPtr cfg = NULL;
+ virCapsPtr caps = NULL;
virCheckFlags(0, ret);
@@ -18645,6 +18646,9 @@ qemuConnectGetDomainCapabilities(virConnectPtr conn,
cfg = virQEMUDriverGetConfig(driver);
+ if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
+ goto cleanup;
+
if (qemuHostdevHostSupportsPassthroughLegacy() ||
qemuHostdevHostSupportsPassthroughVFIO())
virttype = VIR_DOMAIN_VIRT_KVM;
@@ -18716,13 +18720,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 6da28b060f..4ee2f9586d 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 @@
-
-
-
+
+
+
+ Opteron_G5
+ Opteron_G4
+ Opteron_G3
+ Opteron_G2
+ Opteron_G1
+ Haswell
+ SandyBridge
+ Westmere
+ Nehalem
+ Penryn
+ Conroe
+ n270
+ athlon
+ pentium3
+ pentium2
+ pentium
+ 486
+ coreduo
+ kvm32
+ qemu32
+ kvm64
+ core2duo
+ phenom
+ qemu64
+
diff --git a/tests/domaincapsschemadata/qemu_2.6.0-gicv2-virt.aarch64.xml b/tests/domaincapsschemadata/qemu_2.6.0-gicv2-virt.aarch64.xml
index ee51684f08..9e96f47d80 100644
--- a/tests/domaincapsschemadata/qemu_2.6.0-gicv2-virt.aarch64.xml
+++ b/tests/domaincapsschemadata/qemu_2.6.0-gicv2-virt.aarch64.xml
@@ -19,9 +19,40 @@
-
-
-
+
+
+
+ pxa262
+ pxa270-a0
+ arm1136
+ cortex-a15
+ pxa260
+ arm1136-r2
+ pxa261
+ pxa255
+ arm926
+ arm11mpcore
+ pxa250
+ ti925t
+ cortex-a57
+ sa1110
+ arm1176
+ cortex-a53
+ sa1100
+ pxa270-c5
+ cortex-a9
+ cortex-a8
+ pxa270-c0
+ arm1026
+ pxa270-b1
+ cortex-m3
+ cortex-m4
+ pxa270-b0
+ arm946
+ cortex-r5
+ pxa270-a1
+ pxa270
+
diff --git a/tests/domaincapsschemadata/qemu_2.6.0-gicv3-virt.aarch64.xml b/tests/domaincapsschemadata/qemu_2.6.0-gicv3-virt.aarch64.xml
index 88cced9f9d..c081b35992 100644
--- a/tests/domaincapsschemadata/qemu_2.6.0-gicv3-virt.aarch64.xml
+++ b/tests/domaincapsschemadata/qemu_2.6.0-gicv3-virt.aarch64.xml
@@ -19,9 +19,40 @@
-
-
-
+
+
+
+ pxa262
+ pxa270-a0
+ arm1136
+ cortex-a15
+ pxa260
+ arm1136-r2
+ pxa261
+ pxa255
+ arm926
+ arm11mpcore
+ pxa250
+ ti925t
+ cortex-a57
+ sa1110
+ arm1176
+ cortex-a53
+ sa1100
+ pxa270-c5
+ cortex-a9
+ cortex-a8
+ pxa270-c0
+ arm1026
+ pxa270-b1
+ cortex-m3
+ cortex-m4
+ pxa270-b0
+ arm946
+ cortex-r5
+ pxa270-a1
+ pxa270
+
diff --git a/tests/domaincapsschemadata/qemu_2.6.0.aarch64.xml b/tests/domaincapsschemadata/qemu_2.6.0.aarch64.xml
index 09c0e1c3db..811d2b7246 100644
--- a/tests/domaincapsschemadata/qemu_2.6.0.aarch64.xml
+++ b/tests/domaincapsschemadata/qemu_2.6.0.aarch64.xml
@@ -19,9 +19,40 @@
-
-
-
+
+
+
+ pxa262
+ pxa270-a0
+ arm1136
+ cortex-a15
+ pxa260
+ arm1136-r2
+ pxa261
+ pxa255
+ arm926
+ arm11mpcore
+ pxa250
+ ti925t
+ cortex-a57
+ sa1110
+ arm1176
+ cortex-a53
+ sa1100
+ pxa270-c5
+ cortex-a9
+ cortex-a8
+ pxa270-c0
+ arm1026
+ pxa270-b1
+ cortex-m3
+ cortex-m4
+ pxa270-b0
+ arm946
+ cortex-r5
+ pxa270-a1
+ pxa270
+
diff --git a/tests/domaincapsschemadata/qemu_2.6.0.ppc64le.xml b/tests/domaincapsschemadata/qemu_2.6.0.ppc64le.xml
index 40b255eef1..a0aa8112a9 100644
--- a/tests/domaincapsschemadata/qemu_2.6.0.ppc64le.xml
+++ b/tests/domaincapsschemadata/qemu_2.6.0.ppc64le.xml
@@ -19,9 +19,440 @@
-
-
-
+
+
+
+ default
+ ppc
+ ppc32
+ ppc64
+ 970mp
+ 970fx
+ 970
+ POWER8NVL
+ POWER8
+ POWER8E
+ POWER7+
+ POWER7
+ POWER5gs
+ POWER5+
+ Apollo7PM
+ 7457A
+ 7447A
+ Apollo7
+ 7457
+ Apollo6
+ 7455
+ 7445
+ 7451
+ 7441
+ Vger
+ 7450
+ 7448
+ Nitro
+ 7410
+ G4
+ Max
+ 7400
+ Goldfinger
+ 755
+ 745
+ LoneStar
+ 750l
+ 750gx
+ 750fx
+ 750cxe
+ 750cx
+ 750cl
+ Conan/Doyle
+ G3
+ Typhoon
+ 750
+ Arthur
+ 740
+ Mach5
+ Sirocco
+ 604e
+ Goldeneye
+ 603r
+ Vaillant
+ Stretch
+ 603e
+ Vanilla
+ 601v
+ 601
+ MPC8560
+ MPC8555E
+ MPC8555
+ MPC8548E
+ MPC8548
+ MPC8547E
+ MPC8545E
+ MPC8545
+ MPC8544E
+ MPC8544
+ MPC8543E
+ MPC8543
+ MPC8541E
+ MPC8541
+ MPC8540
+ MPC8533E
+ MPC8533
+ e500v2
+ e500v1
+ e500
+ MPC8347EA
+ MPC8347E
+ MPC8347A
+ MPC8347
+ e300
+ e200
+ MPC8280
+ MPC8275
+ MPC8272
+ MPC8271
+ MPC8270
+ MPC8266_HiP4
+ MPC8266_HiP3
+ MPC8266
+ MPC8265_HiP4
+ MPC8265_HiP3
+ MPC8265
+ MPC8264_HiP4
+ MPC8264_HiP3
+ MPC8264
+ MPC8260_HiP4
+ MPC8260_HiP3
+ MPC8260
+ MPC8255_HiP4
+ MPC8255_HiP3
+ MPC8255
+ MPC8250_HiP4
+ MPC8250_HiP3
+ MPC8250
+ MPC8248
+ MPC8247
+ MPC8245
+ MPC8241
+ PowerQUICC-II
+ MPC82xx
+ MPC5200B
+ MPC5200
+ MPC52xx
+ MPC8240
+ 440EP
+ x2vp50
+ x2vp7
+ 405GPe
+ 405GP
+ 405CR
+ 405
+ 403
+ 750cl_v1.0
+ 750cxe_v2.1
+ 7457A_v1.2
+ 755_v2.7
+ MPC8347ET
+ MPC8545E_v20
+ 750_v2.1
+ 755_v2.2
+ 745_v2.0
+ 7455_v1.0
+ MPC8547E_v21
+ STB25
+ POWER8_v2.0
+ 401G2
+ MPC8349A
+ 750e
+ MPC8545_v21
+ MPC8548_v11
+ 970fx_v2.0
+ 750fx_v2.0
+ POWER8E_v2.1
+ Cobra
+ 603p
+ 7400_v2.7
+ MPC8378E
+ e500v2_v10
+ e500mc
+ 603e7v1
+ 970mp_v1.0
+ MPC8555E_v11
+ 440-Xilinx-w-dfpu
+ 740e
+ 405CRc
+ 7447A_v1.1
+ MPC8543_v11
+ MPC8533E_v10
+ MPC8540_v21
+ e500v2_v21
+ e300c1
+ 7400_v2.2
+ 970fx_v1.0
+ 750gx_v1.2
+ 750fx_v1.0
+ MPC8641
+ MPC8544E_v10
+ 405D4
+ 7457_v1.1
+ 970fx_v3.0
+ 604e_v2.2
+ 755_v2.6
+ 7410_v1.4
+ Npe4GS3
+ 745_v2.4
+ 750_v2.0
+ 7445_v3.2
+ 750l_v3.2
+ MPC8540_v10
+ 750_v1.0
+ MPC8343A
+ MPC8378
+ G2HiP3
+ 750cxe_v3.0
+ e500_v10
+ STB03
+ MPC8567
+ MPC8545_v20
+ MPC8548_v10
+ 755_v1.1
+ 603e7v
+ Npe405H2
+ 750_v3.0
+ Npe405H
+ 7400_v2.6
+ 405GPa
+ MPC8548_v21
+ MPC8541E_v10
+ 750l_v2.2
+ MPC8555E_v10
+ 7457A_v1.1
+ e200z6
+ MPC8379E
+ e500v2_v20
+ MPC8347AP
+ 401B2
+ MPC8349E
+ 755_v2.1
+ MPC8543_v21
+ MPC8547E_v20
+ 745_v2.8
+ 7455_v3.4
+ 7448_v1.1
+ 740_v2.2
+ 7400_v1.1
+ MPC8567E
+ 7441_v2.10
+ 603e_v1.4
+ G2leGP1
+ 7451_v2.10
+ MPC8343E
+ 750cx_v2.2
+ Npe405L
+ 603e7
+ 401A1
+ MPC8377
+ 7448_v2.1
+ 7441_v2.3
+ 7400_v2.1
+ 405CRb
+ 604
+ MPC8540_v20
+ MPC8543_v10
+ 7447A_v1.0
+ 7445_v2.1
+ e500_v20
+ 750gx_v1.1
+ MPC8543E_v11
+ 750cxe_v2.4
+ MPC8548_v20
+ MPC8347AT
+ POWER8NVL_v1.0
+ 7457A_v1.0
+ 7457_v1.0
+ 7450_v1.2
+ MPC8572
+ 755_v2.5
+ 7410_v1.3
+ 745_v2.3
+ 750l_v2.1
+ 405GPR
+ 755_v2.0
+ MPC8541_v11
+ 401C2
+ e500v2_v30
+ 7455_v3.3
+ 405EZ
+ MPC8568E
+ 755_v1.0
+ 603e_v1.3
+ MPC8560_v10
+ MPC8560_v21
+ G2H4
+ MPC8533_v11
+ 740_v3.1
+ e200z5
+ MPC8349
+ 7400_v2.0
+ 405CRa
+ MPC8543E_v10
+ MPC8543E_v21
+ 750cxe_v2.3
+ MPC8543_v20
+ 745_v2.7
+ 403GC
+ e5500
+ 7448_v1.0
+ MPC5200_v12
+ 740_v2.1
+ 745_v2.2
+ 7400_v1.0
+ 7410_v1.2
+ x2vp4
+ MPC8555_v11
+ MPC8541_v10
+ 405LP
+ 750fx_v2.3
+ 405EP
+ 601_v2
+ MPC8544_v11
+ 401D2
+ MPC8572E
+ 604e_v1.0
+ 750cx_v2.1
+ MPC5200B_v21
+ 750l_v3.0
+ e300c4
+ 7448_v2.0
+ 7450_v2.1
+ G2leGP
+ 750cxe_v3.1b
+ 7400_v2.9
+ G2GP
+ 603
+ 405GPd
+ MPC8548E_v11
+ 603e7t
+ IOP480
+ 750gx_v1.0
+ MPC8560_v20
+ 405D2
+ 750fl
+ 750l_v2.0
+ x2vp20
+ e600
+ 7450_v1.1
+ 755_v2.4
+ 7445_v1.0
+ G2LS
+ MPC8543E_v20
+ 7447_v1.1
+ 603e_v2.2
+ 603e_v4
+ 7455_v3.2
+ 740_v2.0
+ MPC8347P
+ 440EPb
+ MPC603
+ 603e_v1.2
+ 750fx_v2.2
+ 740_v1.0
+ MPC8544_v10
+ 601_v1
+ 745_v1.1
+ POWER7+_v2.1
+ 750cx_v2.0
+ MPC8347EAP
+ 401E2
+ MPC8641D
+ e300c3
+ MPC8533_v10
+ 7441_v2.1
+ 740_v3.0
+ POWER5+_v2.1
+ 602
+ MPC8548E_v10
+ G2leLS
+ MPC8343
+ 750cx_v1.0
+ 750cxe_v2.2
+ 604e_v2.4
+ 755_v2.8
+ MPC8548E_v21
+ 745_v2.6
+ G2le
+ 403GB
+ MPC8545E_v21
+ POWER7_v2.3
+ 750_v2.2
+ 7450_v1.0
+ MPC5200_v11
+ 755_v2.3
+ MPC8347EP
+ 7410_v1.1
+ 750gl
+ 403GCX
+ 750p
+ 745_v2.1
+ 7445_v3.4
+ G2
+ MPC8555_v10
+ MPC8347T
+ 603e_v3
+ 970_v2.2
+ 440-Xilinx
+ 740p
+ MPC5200B_v20
+ 440EPX
+ 603e_v1.1
+ 7451_v2.3
+ 7450_v2.0
+ 7400_v2.8
+ 7455_v2.1
+ 405GPc
+ MPC8347EAT
+ 970mp_v1.1
+ 603e7v2
+ 604r
+ 7447A_v1.2
+ MPC8533E_v11
+ e500v2_v22
+ 401F2
+ MPC8343EA
+ 7457_v1.2
+ 970fx_v3.1
+ 7447_v1.0
+ 745_v2.5
+ MPC8548E_v20
+ MPC8610
+ 403GA
+ 750cxe_v2.4b
+ MPC5200_v10
+ 7410_v1.0
+ G2leGP3
+ 603e_v4.1
+ 7445_v3.3
+ 440EPa
+ 970fx_v2.1
+ MPC8377E
+ 750fx_v2.1
+ 601_v0
+ STB04
+ 745_v1.0
+ G2HiP4
+ 750cl_v2.0
+ 750cxr
+ MPC8349EA
+ 750cxe_v3.1
+ 401
+ MPC8379
+ MPC8568
+ e300c2
+ 750_v3.1
+ MPC8544E_v11
+ 405GPb
+ MPC8541E_v11
+
diff --git a/tests/domaincapsschemadata/qemu_2.6.0.x86_64.xml b/tests/domaincapsschemadata/qemu_2.6.0.x86_64.xml
index 6706fec0f3..80101a401d 100644
--- a/tests/domaincapsschemadata/qemu_2.6.0.x86_64.xml
+++ b/tests/domaincapsschemadata/qemu_2.6.0.x86_64.xml
@@ -19,9 +19,38 @@
-
-
-
+
+
+
+ Opteron_G5
+ Opteron_G4
+ Opteron_G3
+ Opteron_G2
+ Opteron_G1
+ Broadwell
+ Broadwell-noTSX
+ Haswell
+ Haswell-noTSX
+ IvyBridge
+ SandyBridge
+ Westmere
+ Nehalem
+ Penryn
+ Conroe
+ n270
+ athlon
+ pentium3
+ pentium2
+ pentium
+ 486
+ coreduo
+ kvm32
+ qemu32
+ kvm64
+ core2duo
+ phenom
+ qemu64
+
diff --git a/tests/domaincapstest.c b/tests/domaincapstest.c
index 907c0ad023..10b745209d 100644
--- a/tests/domaincapstest.c
+++ b/tests/domaincapstest.c
@@ -109,6 +109,54 @@ fillAllCaps(virDomainCapsPtr domCaps)
#if WITH_QEMU
# include "testutilsqemu.h"
+static virCPUDef aarch64Cpu = {
+ 0, 0, 0, 0, NULL, NULL, 0, NULL, 1, 1, 1, 0, 0, NULL,
+};
+
+static virCPUDef ppc64leCpu = {
+ VIR_CPU_TYPE_HOST, 0, 0,
+ VIR_ARCH_PPC64LE, (char *) "POWER8",
+ NULL, 0, NULL, 1, 1, 1, 0, 0, NULL,
+};
+
+static virCPUDef x86Cpu = {
+ VIR_CPU_TYPE_HOST, 0, 0,
+ VIR_ARCH_X86_64, (char *) "Broadwell",
+ NULL, 0, NULL, 1, 1, 1, 0, 0, NULL,
+};
+
+static int
+fakeHostCPU(virCapsPtr caps,
+ virArch arch)
+{
+ virCPUDefPtr cpu;
+
+ switch (arch) {
+ case VIR_ARCH_AARCH64:
+ cpu = &aarch64Cpu;
+ break;
+
+ case VIR_ARCH_PPC64LE:
+ cpu = &ppc64leCpu;
+ break;
+
+ case VIR_ARCH_X86_64:
+ cpu = &x86Cpu;
+ break;
+
+ default:
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ "cannot fake host CPU for arch %s",
+ virArchToString(arch));
+ return -1;
+ }
+
+ if (!(caps->host.cpu = virCPUDefCopy(cpu)))
+ return -1;
+
+ return 0;
+}
+
static int
fillQemuCaps(virDomainCapsPtr domCaps,
const char *name,
@@ -118,6 +166,7 @@ fillQemuCaps(virDomainCapsPtr domCaps,
{
int ret = -1;
char *path = NULL;
+ virCapsPtr caps = NULL;
virQEMUCapsPtr qemuCaps = NULL;
virDomainCapsLoaderPtr loader = &domCaps->os.loader;
@@ -136,7 +185,11 @@ fillQemuCaps(virDomainCapsPtr domCaps,
virQEMUCapsGetDefaultMachine(qemuCaps)) < 0)
goto cleanup;
- if (virQEMUCapsFillDomainCaps(domCaps, qemuCaps,
+ if (!(caps = virCapabilitiesNew(domCaps->arch, false, false)) ||
+ fakeHostCPU(caps, domCaps->arch) < 0)
+ goto cleanup;
+
+ if (virQEMUCapsFillDomainCaps(caps, domCaps, qemuCaps,
cfg->firmwares,
cfg->nfirmwares) < 0)
goto cleanup;
@@ -164,6 +217,7 @@ fillQemuCaps(virDomainCapsPtr domCaps,
ret = 0;
cleanup:
+ virObjectUnref(caps);
virObjectUnref(qemuCaps);
VIR_FREE(path);
return ret;