diff options
author | Eduardo Habkost <ehabkost@redhat.com> | 2013-04-25 15:43:00 -0300 |
---|---|---|
committer | Andreas Färber <afaerber@suse.de> | 2013-05-06 22:14:56 +0200 |
commit | 0668af542f99b7bb1d95539829b27d5a1bcecde4 (patch) | |
tree | 0d8a1a17942979a3393c397675b29d19be78dab1 /target-i386 | |
parent | b2a856d99281f2fee60a4313d204205bcd2c4269 (diff) | |
download | qemu-0668af542f99b7bb1d95539829b27d5a1bcecde4.zip qemu-0668af542f99b7bb1d95539829b27d5a1bcecde4.tar.gz qemu-0668af542f99b7bb1d95539829b27d5a1bcecde4.tar.bz2 |
target-i386: Introduce generic CPUID feature compat function
Introduce x86_cpu_compat_set_features(), that can be used to set/unset
feature bits on specific CPU models for machine-type compatibility.
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
Signed-off-by: Andreas Färber <afaerber@suse.de>
Diffstat (limited to 'target-i386')
-rw-r--r-- | target-i386/cpu.c | 26 | ||||
-rw-r--r-- | target-i386/cpu.h | 4 |
2 files changed, 30 insertions, 0 deletions
diff --git a/target-i386/cpu.c b/target-i386/cpu.c index 8e21c94..8198a1b 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -971,6 +971,32 @@ static x86_def_t builtin_x86_defs[] = { }, }; +/** + * x86_cpu_compat_set_features: + * @cpu_model: CPU model name to be changed. If NULL, all CPU models are changed + * @w: Identifies the feature word to be changed. + * @feat_add: Feature bits to be added to feature word + * @feat_remove: Feature bits to be removed from feature word + * + * Change CPU model feature bits for compatibility. + * + * This function may be used by machine-type compatibility functions + * to enable or disable feature bits on specific CPU models. + */ +void x86_cpu_compat_set_features(const char *cpu_model, FeatureWord w, + uint32_t feat_add, uint32_t feat_remove) +{ + x86_def_t *def; + int i; + for (i = 0; i < ARRAY_SIZE(builtin_x86_defs); i++) { + def = &builtin_x86_defs[i]; + if (!cpu_model || !strcmp(cpu_model, def->name)) { + def->features[w] |= feat_add; + def->features[w] &= ~feat_remove; + } + } +} + #ifdef CONFIG_KVM static int cpu_x86_fill_model_id(char *str) { diff --git a/target-i386/cpu.h b/target-i386/cpu.h index 3e2e9f6..058c57f 100644 --- a/target-i386/cpu.h +++ b/target-i386/cpu.h @@ -1255,6 +1255,10 @@ void cpu_report_tpr_access(CPUX86State *env, TPRAccess access); void disable_kvm_pv_eoi(void); +void x86_cpu_compat_set_features(const char *cpu_model, FeatureWord w, + uint32_t feat_add, uint32_t feat_remove); + + /* Return name of 32-bit register, from a R_* constant */ const char *get_register_name_32(unsigned int reg); |