diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index ae3a0acc10e0d2b39f939522249521cd9b5af227..6d6191fe4e5fd8f65a42701e39a7a22a42d42c5b 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -1096,3 +1096,27 @@ virCPUDataAddFeature(virCPUDataPtr cpuData, return driver->dataAddFeature(cpuData, name); } + + +/** + * virCPUArchIsSupported: + * + * @arch: CPU architecture + * + * Returns true if the architecture is supported by any CPU driver. + */ +bool +virCPUArchIsSupported(virArch arch) +{ + size_t i; + size_t j; + + for (i = 0; i < G_N_ELEMENTS(drivers); i++) { + for (j = 0; j < drivers[i]->narch; j++) { + if (arch == drivers[i]->arch[j]) + return true; + } + } + + return false; +} diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h index 2e8b8923ae23784b900c372c59c67847c974802a..f779d2be176e10feca3e2442d44d91a59913d729 100644 --- a/src/cpu/cpu.h +++ b/src/cpu/cpu.h @@ -265,6 +265,9 @@ int virCPUDataAddFeature(virCPUDataPtr cpuData, const char *name); +bool +virCPUArchIsSupported(virArch arch); + /* virCPUDataFormat and virCPUDataParse are implemented for unit tests only and * have no real-life usage */ diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 3fc8d7de3fcf1a8cf85e94d9010f83c1856d5028..de0c7a313386c16d252071b7c010f20fd0cf8f13 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1310,6 +1310,7 @@ virStoragePoolObjVolumeListExport; # cpu/cpu.h cpuDecode; cpuEncode; +virCPUArchIsSupported; virCPUBaseline; virCPUCheckFeature; virCPUCompare; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index a28b51c10e354b896f49b765e119af24a11f716c..3dfa71650db1a1e5f5b91d62e29a3e55dd77ee23 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -4576,6 +4576,9 @@ qemuDomainDefSetDefaultCPU(virDomainDefPtr def, def->cpu->model)) return 0; + if (!virCPUArchIsSupported(def->os.arch)) + return 0; + /* Default CPU model info from QEMU is usable for TCG only except for * x86, s390, and ppc64. */ if (!ARCH_IS_X86(def->os.arch) &&