Revision 6c1f42fe target-i386/kvm.c
b/target-i386/kvm.c | ||
---|---|---|
117 | 117 |
|
118 | 118 |
#endif |
119 | 119 |
|
120 |
static void kvm_trim_features(uint32_t *features, uint32_t supported) |
|
121 |
{ |
|
122 |
int i; |
|
123 |
uint32_t mask; |
|
124 |
|
|
125 |
for (i = 0; i < 32; ++i) { |
|
126 |
mask = 1U << i; |
|
127 |
if ((*features & mask) && !(supported & mask)) { |
|
128 |
*features &= ~mask; |
|
129 |
} |
|
130 |
} |
|
131 |
} |
|
132 |
|
|
120 | 133 |
int kvm_arch_init_vcpu(CPUState *env) |
121 | 134 |
{ |
122 | 135 |
struct { |
... | ... | |
128 | 141 |
|
129 | 142 |
env->mp_state = KVM_MP_STATE_RUNNABLE; |
130 | 143 |
|
144 |
kvm_trim_features(&env->cpuid_features, |
|
145 |
kvm_arch_get_supported_cpuid(env, 1, R_EDX)); |
|
146 |
kvm_trim_features(&env->cpuid_ext_features, |
|
147 |
kvm_arch_get_supported_cpuid(env, 1, R_ECX)); |
|
148 |
kvm_trim_features(&env->cpuid_ext2_features, |
|
149 |
kvm_arch_get_supported_cpuid(env, 0x80000001, R_EDX)); |
|
150 |
kvm_trim_features(&env->cpuid_ext3_features, |
|
151 |
kvm_arch_get_supported_cpuid(env, 0x80000001, R_ECX)); |
|
152 |
|
|
131 | 153 |
cpuid_i = 0; |
132 | 154 |
|
133 | 155 |
cpu_x86_cpuid(env, 0, 0, &limit, &unused, &unused, &unused); |
Also available in: Unified diff