Merge tag 'pm-5.2-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael...
[linux-2.6-microblaze.git] / arch / x86 / kvm / x86.c
index 22cc90b..b9591ab 100644 (file)
@@ -3681,15 +3681,15 @@ static void fill_xsave(u8 *dest, struct kvm_vcpu *vcpu)
         */
        valid = xstate_bv & ~XFEATURE_MASK_FPSSE;
        while (valid) {
-               u64 feature = valid & -valid;
-               int index = fls64(feature) - 1;
-               void *src = get_xsave_addr(xsave, feature);
+               u64 xfeature_mask = valid & -valid;
+               int xfeature_nr = fls64(xfeature_mask) - 1;
+               void *src = get_xsave_addr(xsave, xfeature_nr);
 
                if (src) {
                        u32 size, offset, ecx, edx;
-                       cpuid_count(XSTATE_CPUID, index,
+                       cpuid_count(XSTATE_CPUID, xfeature_nr,
                                    &size, &offset, &ecx, &edx);
-                       if (feature == XFEATURE_MASK_PKRU)
+                       if (xfeature_nr == XFEATURE_PKRU)
                                memcpy(dest + offset, &vcpu->arch.pkru,
                                       sizeof(vcpu->arch.pkru));
                        else
@@ -3697,7 +3697,7 @@ static void fill_xsave(u8 *dest, struct kvm_vcpu *vcpu)
 
                }
 
-               valid -= feature;
+               valid -= xfeature_mask;
        }
 }
 
@@ -3724,22 +3724,22 @@ static void load_xsave(struct kvm_vcpu *vcpu, u8 *src)
         */
        valid = xstate_bv & ~XFEATURE_MASK_FPSSE;
        while (valid) {
-               u64 feature = valid & -valid;
-               int index = fls64(feature) - 1;
-               void *dest = get_xsave_addr(xsave, feature);
+               u64 xfeature_mask = valid & -valid;
+               int xfeature_nr = fls64(xfeature_mask) - 1;
+               void *dest = get_xsave_addr(xsave, xfeature_nr);
 
                if (dest) {
                        u32 size, offset, ecx, edx;
-                       cpuid_count(XSTATE_CPUID, index,
+                       cpuid_count(XSTATE_CPUID, xfeature_nr,
                                    &size, &offset, &ecx, &edx);
-                       if (feature == XFEATURE_MASK_PKRU)
+                       if (xfeature_nr == XFEATURE_PKRU)
                                memcpy(&vcpu->arch.pkru, src + offset,
                                       sizeof(vcpu->arch.pkru));
                        else
                                memcpy(dest, src + offset, size);
                }
 
-               valid -= feature;
+               valid -= xfeature_mask;
        }
 }
 
@@ -7908,6 +7908,10 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
                wait_lapic_expire(vcpu);
        guest_enter_irqoff();
 
+       fpregs_assert_state_consistent();
+       if (test_thread_flag(TIF_NEED_FPU_LOAD))
+               switch_fpu_return();
+
        if (unlikely(vcpu->arch.switch_db_regs)) {
                set_debugreg(0, 7);
                set_debugreg(vcpu->arch.eff_db[0], 0);
@@ -8166,22 +8170,30 @@ static int complete_emulated_mmio(struct kvm_vcpu *vcpu)
 /* Swap (qemu) user FPU context for the guest FPU context. */
 static void kvm_load_guest_fpu(struct kvm_vcpu *vcpu)
 {
-       preempt_disable();
+       fpregs_lock();
+
        copy_fpregs_to_fpstate(&current->thread.fpu);
        /* PKRU is separately restored in kvm_x86_ops->run.  */
        __copy_kernel_to_fpregs(&vcpu->arch.guest_fpu->state,
                                ~XFEATURE_MASK_PKRU);
-       preempt_enable();
+
+       fpregs_mark_activate();
+       fpregs_unlock();
+
        trace_kvm_fpu(1);
 }
 
 /* When vcpu_run ends, restore user space FPU context. */
 static void kvm_put_guest_fpu(struct kvm_vcpu *vcpu)
 {
-       preempt_disable();
+       fpregs_lock();
+
        copy_fpregs_to_fpstate(vcpu->arch.guest_fpu);
        copy_kernel_to_fpregs(&current->thread.fpu.state);
-       preempt_enable();
+
+       fpregs_mark_activate();
+       fpregs_unlock();
+
        ++vcpu->stat.fpu_reload;
        trace_kvm_fpu(0);
 }
@@ -8879,11 +8891,11 @@ void kvm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event)
                if (init_event)
                        kvm_put_guest_fpu(vcpu);
                mpx_state_buffer = get_xsave_addr(&vcpu->arch.guest_fpu->state.xsave,
-                                       XFEATURE_MASK_BNDREGS);
+                                       XFEATURE_BNDREGS);
                if (mpx_state_buffer)
                        memset(mpx_state_buffer, 0, sizeof(struct mpx_bndreg_state));
                mpx_state_buffer = get_xsave_addr(&vcpu->arch.guest_fpu->state.xsave,
-                                       XFEATURE_MASK_BNDCSR);
+                                       XFEATURE_BNDCSR);
                if (mpx_state_buffer)
                        memset(mpx_state_buffer, 0, sizeof(struct mpx_bndcsr));
                if (init_event)