this patch adds a probe that lists all enforceable and migrateable CPU models to the -cpu help output. The idea is to know a priory which CPU modules can be exposed to the user without loosing any feature flags.
Signed-off-by: Peter Lieven <p...@kamp.de> --- target-i386/cpu.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/target-i386/cpu.c b/target-i386/cpu.c index cfb8aa7..3a56d3f 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -1961,6 +1961,45 @@ static void listflags(FILE *f, fprintf_function print, const char **featureset) } } +/* + * Check if the CPU Definition is enforcable on the current host CPU + * and contains no unmigratable flags. + * + * Returns: true if the CPU can be enforced and migrated. + */ +static bool x86_cpu_enforce_and_migratable(X86CPUDefinition *def) +{ + int i; + for (i = 0; i < ARRAY_SIZE(feature_word_info); i++) { + FeatureWordInfo *fw = &feature_word_info[i]; + uint32_t eax, ebx, ecx, edx, host; + host_cpuid(fw->cpuid_eax, 0, &eax, &ebx, &ecx, &edx); + switch (fw->cpuid_reg) { + case R_EAX: + host = eax; + break; + case R_EBX: + host = ebx; + break; + case R_ECX: + host = ecx; + break; + case R_EDX: + host = edx; + break; + default: + return false; + } + if (def->features[i] & ~host) { + return false; + } + if (def->features[i] & fw->unmigratable_flags) { + return false; + } + } + return true; +} + /* generate CPU information. */ void x86_cpu_list(FILE *f, fprintf_function cpu_fprintf) { @@ -1987,6 +2026,16 @@ void x86_cpu_list(FILE *f, fprintf_function cpu_fprintf) listflags(f, cpu_fprintf, fw->feat_names); (*cpu_fprintf)(f, "\n"); } + + (*cpu_fprintf)(f, "\nEnforceable and migratable x86 CPU models in KVM mode:\n"); + (*cpu_fprintf)(f, " "); + for (i = 0; i < ARRAY_SIZE(builtin_x86_defs); i++) { + def = &builtin_x86_defs[i]; + if (x86_cpu_enforce_and_migratable(def)) { + (*cpu_fprintf)(f, " %s", def->name); + } + } + (*cpu_fprintf)(f, "\n"); } CpuDefinitionInfoList *arch_query_cpu_definitions(Error **errp) -- 1.9.1