diff --git a/src/conf/domain_capabilities.c b/src/conf/domain_capabilities.c index e47aa865b1..828fa707ca 100644 --- a/src/conf/domain_capabilities.c +++ b/src/conf/domain_capabilities.c @@ -169,6 +169,33 @@ virDomainCapsCPUModelsCopy(virDomainCapsCPUModelsPtr old) } +virDomainCapsCPUModelsPtr +virDomainCapsCPUModelsFilter(virDomainCapsCPUModelsPtr old, + const char **models) +{ + virDomainCapsCPUModelsPtr cpuModels; + size_t i; + + if (!(cpuModels = virDomainCapsCPUModelsNew(0))) + return NULL; + + for (i = 0; i < old->nmodels; i++) { + if (models && !virStringArrayHasString(models, old->models[i].name)) + continue; + + if (virDomainCapsCPUModelsAdd(cpuModels, + old->models[i].name, -1) < 0) + goto error; + } + + return cpuModels; + + error: + virObjectUnref(cpuModels); + return NULL; +} + + int virDomainCapsCPUModelsAddSteal(virDomainCapsCPUModelsPtr cpuModels, char **name) diff --git a/src/conf/domain_capabilities.h b/src/conf/domain_capabilities.h index 149a13f328..57f0161be8 100644 --- a/src/conf/domain_capabilities.h +++ b/src/conf/domain_capabilities.h @@ -156,6 +156,8 @@ virDomainCapsPtr virDomainCapsNew(const char *path, virDomainCapsCPUModelsPtr virDomainCapsCPUModelsNew(size_t nmodels); virDomainCapsCPUModelsPtr virDomainCapsCPUModelsCopy(virDomainCapsCPUModelsPtr old); +virDomainCapsCPUModelsPtr virDomainCapsCPUModelsFilter(virDomainCapsCPUModelsPtr old, + const char **models); int virDomainCapsCPUModelsAddSteal(virDomainCapsCPUModelsPtr cpuModels, char **name); int virDomainCapsCPUModelsAdd(virDomainCapsCPUModelsPtr cpuModels, diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 13e802a58b..dc4bba71f3 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -156,6 +156,7 @@ virDomainAuditVcpu; virDomainCapsCPUModelsAdd; virDomainCapsCPUModelsAddSteal; virDomainCapsCPUModelsCopy; +virDomainCapsCPUModelsFilter; virDomainCapsCPUModelsNew; virDomainCapsEnumClear; virDomainCapsEnumSet; diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 87749c9fb5..92b8b026de 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -4288,6 +4288,8 @@ virQEMUCapsFillDomainCPUCaps(virCapsPtr caps, virQEMUCapsPtr qemuCaps, virDomainCapsPtr domCaps) { + virDomainCapsCPUModelsPtr filtered = NULL; + char **models = NULL; if (domCaps->virttype == VIR_DOMAIN_VIRT_KVM && virQEMUCapsGuestIsNative(caps->host.arch, qemuCaps->arch)) @@ -4297,7 +4299,13 @@ virQEMUCapsFillDomainCPUCaps(virCapsPtr caps, domCaps->cpu.hostModel = virQEMUCapsGuestIsNative(caps->host.arch, qemuCaps->arch); - domCaps->cpu.custom = virObjectRef(qemuCaps->cpuDefinitions); + if (qemuCaps->cpuDefinitions && + cpuGetModels(domCaps->arch, &models) >= 0) { + filtered = virDomainCapsCPUModelsFilter(qemuCaps->cpuDefinitions, + (const char **) models); + virStringFreeList(models); + } + domCaps->cpu.custom = filtered; return 0; } diff --git a/tests/domaincapsschemadata/qemu_2.6.0.ppc64le.xml b/tests/domaincapsschemadata/qemu_2.6.0.ppc64le.xml index a0aa8112a9..d96927438e 100644 --- a/tests/domaincapsschemadata/qemu_2.6.0.ppc64le.xml +++ b/tests/domaincapsschemadata/qemu_2.6.0.ppc64le.xml @@ -22,436 +22,8 @@ - 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