Commit e8a6aec9b5e062ca8d14ae0e14efda17ae9685d8
Committed by
Anthony Liguori
1 parent
02b049df
kvm: Trim cpu features not supported by kvm
Remove cpu features that are not supported by kvm from the cpuid features reported to the guest. Signed-off-by: Avi Kivity <avi@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Showing
1 changed file
with
30 additions
and
0 deletions
target-i386/helper.c
@@ -93,6 +93,21 @@ static void add_flagname_to_bitmaps(char *flagname, uint32_t *features, | @@ -93,6 +93,21 @@ static void add_flagname_to_bitmaps(char *flagname, uint32_t *features, | ||
93 | } | 93 | } |
94 | } | 94 | } |
95 | 95 | ||
96 | +static void kvm_trim_features(uint32_t *features, uint32_t supported, | ||
97 | + const char *names[]) | ||
98 | +{ | ||
99 | + int i; | ||
100 | + uint32_t mask; | ||
101 | + | ||
102 | + for (i = 0; i < 32; ++i) { | ||
103 | + mask = 1U << i; | ||
104 | + if ((*features & mask) && !(supported & mask)) { | ||
105 | + printf("Processor feature %s not supported by kvm\n", names[i]); | ||
106 | + *features &= ~mask; | ||
107 | + } | ||
108 | + } | ||
109 | +} | ||
110 | + | ||
96 | typedef struct x86_def_t { | 111 | typedef struct x86_def_t { |
97 | const char *name; | 112 | const char *name; |
98 | uint32_t level; | 113 | uint32_t level; |
@@ -1699,5 +1714,20 @@ CPUX86State *cpu_x86_init(const char *cpu_model) | @@ -1699,5 +1714,20 @@ CPUX86State *cpu_x86_init(const char *cpu_model) | ||
1699 | 1714 | ||
1700 | qemu_init_vcpu(env); | 1715 | qemu_init_vcpu(env); |
1701 | 1716 | ||
1717 | + if (kvm_enabled()) { | ||
1718 | + kvm_trim_features(&env->cpuid_features, | ||
1719 | + kvm_arch_get_supported_cpuid(env, 1, R_EDX), | ||
1720 | + feature_name); | ||
1721 | + kvm_trim_features(&env->cpuid_ext_features, | ||
1722 | + kvm_arch_get_supported_cpuid(env, 1, R_ECX), | ||
1723 | + ext_feature_name); | ||
1724 | + kvm_trim_features(&env->cpuid_ext2_features, | ||
1725 | + kvm_arch_get_supported_cpuid(env, 0x80000001, R_EDX), | ||
1726 | + ext2_feature_name); | ||
1727 | + kvm_trim_features(&env->cpuid_ext3_features, | ||
1728 | + kvm_arch_get_supported_cpuid(env, 0x80000001, R_ECX), | ||
1729 | + ext3_feature_name); | ||
1730 | + } | ||
1731 | + | ||
1702 | return env; | 1732 | return env; |
1703 | } | 1733 | } |