From 84d38307fe6dffa3b207b78167d80ccb6983ad48 Mon Sep 17 00:00:00 2001 From: Jiri Denemark Date: Fri, 22 Apr 2016 22:22:30 +0200 Subject: [PATCH] qemu: Fill in CPU domain capabilities Signed-off-by: Jiri Denemark --- src/qemu/qemu_capabilities.c | 24 +- src/qemu/qemu_capabilities.h | 3 +- src/qemu/qemu_driver.c | 7 +- .../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 +- .../qemu_2.6.0.aarch64.xml | 37 +- .../qemu_2.6.0.ppc64le.xml | 437 +++++++++++++++++- .../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 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;