OSDN Git Service

Merge git://git.kernel.org/pub/scm/virt/kvm/kvm
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 14 Apr 2014 23:21:28 +0000 (16:21 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 14 Apr 2014 23:21:28 +0000 (16:21 -0700)
Pull KVM fixes from Marcelo Tosatti:
 - Fix for guest triggerable BUG_ON (CVE-2014-0155)
 - CR4.SMAP support
 - Spurious WARN_ON() fix

* git://git.kernel.org/pub/scm/virt/kvm/kvm:
  KVM: x86: remove WARN_ON from get_kernel_ns()
  KVM: Rename variable smep to cr4_smep
  KVM: expose SMAP feature to guest
  KVM: Disable SMAP for guests in EPT realmode and EPT unpaging mode
  KVM: Add SMAP support when setting CR4
  KVM: Remove SMAP bit from CR4_RESERVED_BITS
  KVM: ioapic: try to recover if pending_eoi goes out of range
  KVM: ioapic: fix assignment of ioapic->rtc_status.pending_eoi (CVE-2014-0155)

1  2 
arch/x86/kvm/x86.c

diff --combined arch/x86/kvm/x86.c
@@@ -652,6 -652,9 +652,9 @@@ int kvm_set_cr4(struct kvm_vcpu *vcpu, 
        if (!guest_cpuid_has_smep(vcpu) && (cr4 & X86_CR4_SMEP))
                return 1;
  
+       if (!guest_cpuid_has_smap(vcpu) && (cr4 & X86_CR4_SMAP))
+               return 1;
        if (!guest_cpuid_has_fsgsbase(vcpu) && (cr4 & X86_CR4_FSGSBASE))
                return 1;
  
            (!(cr4 & X86_CR4_PCIDE) && (old_cr4 & X86_CR4_PCIDE)))
                kvm_mmu_reset_context(vcpu);
  
+       if ((cr4 ^ old_cr4) & X86_CR4_SMAP)
+               update_permission_bitmask(vcpu, vcpu->arch.walk_mmu, false);
        if ((cr4 ^ old_cr4) & X86_CR4_OSXSAVE)
                kvm_update_cpuid(vcpu);
  
@@@ -1117,7 -1123,6 +1123,6 @@@ static inline u64 get_kernel_ns(void
  {
        struct timespec ts;
  
-       WARN_ON(preemptible());
        ktime_get_ts(&ts);
        monotonic_to_bootbased(&ts);
        return timespec_to_ns(&ts);
@@@ -4164,7 -4169,8 +4169,8 @@@ static int vcpu_mmio_gva_to_gpa(struct 
                | (write ? PFERR_WRITE_MASK : 0);
  
        if (vcpu_match_mmio_gva(vcpu, gva)
-           && !permission_fault(vcpu->arch.walk_mmu, vcpu->arch.access, access)) {
+           && !permission_fault(vcpu, vcpu->arch.walk_mmu,
+                                vcpu->arch.access, access)) {
                *gpa = vcpu->arch.mmio_gfn << PAGE_SHIFT |
                                        (gva & (PAGE_SIZE - 1));
                trace_vcpu_match_mmio(gva, *gpa, write, false);
@@@ -5422,8 -5428,7 +5428,8 @@@ static void kvm_timer_init(void
        int cpu;
  
        max_tsc_khz = tsc_khz;
 -      register_hotcpu_notifier(&kvmclock_cpu_notifier_block);
 +
 +      cpu_notifier_register_begin();
        if (!boot_cpu_has(X86_FEATURE_CONSTANT_TSC)) {
  #ifdef CONFIG_CPU_FREQ
                struct cpufreq_policy policy;
        pr_debug("kvm: max_tsc_khz = %ld\n", max_tsc_khz);
        for_each_online_cpu(cpu)
                smp_call_function_single(cpu, tsc_khz_changed, NULL, 1);
 +
 +      __register_hotcpu_notifier(&kvmclock_cpu_notifier_block);
 +      cpu_notifier_register_done();
 +
  }
  
  static DEFINE_PER_CPU(struct kvm_vcpu *, current_vcpu);