@@ -73,6 +73,20 @@ static int kvm_check_cpuid(struct kvm_vcpu *vcpu)
return 0;
}
+static inline void guest_cpuid_change(struct kvm_vcpu *vcpu, u32 function,
+ u32 index, unsigned int feature, bool set)
+{
+ struct kvm_cpuid_entry2 *e = kvm_find_cpuid_entry(vcpu, function, index);
+
+ if (e)
+ cpuid_entry_change(e, feature, set);
+}
+
+void kvm_apic_base_update_cpuid(struct kvm_vcpu *vcpu, bool set)
+{
+ guest_cpuid_change(vcpu, 1, 0, X86_FEATURE_APIC, set);
+}
+
void kvm_update_cpuid_runtime(struct kvm_vcpu *vcpu)
{
struct kvm_cpuid_entry2 *best;
@@ -9,6 +9,7 @@
extern u32 kvm_cpu_caps[NCAPINTS] __read_mostly;
void kvm_set_cpu_caps(void);
+void kvm_apic_base_update_cpuid(struct kvm_vcpu *vcpu, bool set);
void kvm_update_cpuid_runtime(struct kvm_vcpu *vcpu);
struct kvm_cpuid_entry2 *kvm_find_cpuid_entry(struct kvm_vcpu *vcpu,
u32 function, u32 index);
@@ -2231,7 +2231,7 @@ void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value)
vcpu->arch.apic_base = value;
if ((old_value ^ value) & MSR_IA32_APICBASE_ENABLE)
- kvm_update_cpuid_runtime(vcpu);
+ kvm_apic_base_update_cpuid(vcpu, !!(value & MSR_IA32_APICBASE_ENABLE));
if (!apic)
return;
And let kvm_lapic_set_base() call kvm_apic_base_update_cpuid() instead of whole kvm_update_cpuid_runtime(). Signed-off-by: Robert Hoo <robert.hu@linux.intel.com> --- arch/x86/kvm/cpuid.c | 14 ++++++++++++++ arch/x86/kvm/cpuid.h | 1 + arch/x86/kvm/lapic.c | 2 +- 3 files changed, 16 insertions(+), 1 deletion(-)