if (ustate->xsave.header.xfeatures & ~xcr0)
                return -EINVAL;
 
+       /*
+        * Nullify @vpkru to preserve its current value if PKRU's bit isn't set
+        * in the header.  KVM's odd ABI is to leave PKRU untouched in this
+        * case (all other components are eventually re-initialized).
+        */
+       if (!(ustate->xsave.header.xfeatures & XFEATURE_MASK_PKRU))
+               vpkru = NULL;
+
        return copy_uabi_from_kernel_to_xstate(kstate, ustate, vpkru);
 }
 EXPORT_SYMBOL_GPL(fpu_copy_uabi_to_guest_fpstate);
 
  *     it is harmless.
  * 2.  When called from ptrace the PKRU register will be restored from the
  *     thread_struct's pkru field. A pointer to that is passed in @pkru.
+ *     The kernel will restore it manually, so the XRSTOR behavior that resets
+ *     the PKRU register to the hardware init value (0) if the corresponding
+ *     xfeatures bit is not set is emulated here.
  * 3.  When called from KVM the PKRU register will be restored from the vcpu's
- *     pkru field. A pointer to that is passed in @pkru.
+ *     pkru field. A pointer to that is passed in @pkru. KVM hasn't used
+ *     XRSTOR and hasn't had the PKRU resetting behavior described above. To
+ *     preserve that KVM behavior, it passes NULL for @pkru if the xfeatures
+ *     bit is not set.
  */
 static int copy_uabi_to_xstate(struct fpstate *fpstate, const void *kbuf,
                               const void __user *ubuf, u32 *pkru)
 
                xpkru = __raw_xsave_addr(xsave, XFEATURE_PKRU);
                *pkru = xpkru->pkru;
+       } else {
+               /*
+                * KVM may pass NULL here to indicate that it does not need
+                * PKRU updated.
+                */
+               if (pkru)
+                       *pkru = 0;
        }
 
        /*