|
@@ -3245,7 +3245,12 @@ static void fill_xsave(u8 *dest, struct kvm_vcpu *vcpu)
|
|
|
u32 size, offset, ecx, edx;
|
|
|
cpuid_count(XSTATE_CPUID, index,
|
|
|
&size, &offset, &ecx, &edx);
|
|
|
- memcpy(dest + offset, src, size);
|
|
|
+ if (feature == XFEATURE_MASK_PKRU)
|
|
|
+ memcpy(dest + offset, &vcpu->arch.pkru,
|
|
|
+ sizeof(vcpu->arch.pkru));
|
|
|
+ else
|
|
|
+ memcpy(dest + offset, src, size);
|
|
|
+
|
|
|
}
|
|
|
|
|
|
valid -= feature;
|
|
@@ -3283,7 +3288,11 @@ static void load_xsave(struct kvm_vcpu *vcpu, u8 *src)
|
|
|
u32 size, offset, ecx, edx;
|
|
|
cpuid_count(XSTATE_CPUID, index,
|
|
|
&size, &offset, &ecx, &edx);
|
|
|
- memcpy(dest, src + offset, size);
|
|
|
+ if (feature == XFEATURE_MASK_PKRU)
|
|
|
+ memcpy(&vcpu->arch.pkru, src + offset,
|
|
|
+ sizeof(vcpu->arch.pkru));
|
|
|
+ else
|
|
|
+ memcpy(dest, src + offset, size);
|
|
|
}
|
|
|
|
|
|
valid -= feature;
|
|
@@ -7633,7 +7642,9 @@ void kvm_load_guest_fpu(struct kvm_vcpu *vcpu)
|
|
|
*/
|
|
|
vcpu->guest_fpu_loaded = 1;
|
|
|
__kernel_fpu_begin();
|
|
|
- __copy_kernel_to_fpregs(&vcpu->arch.guest_fpu.state);
|
|
|
+ /* PKRU is separately restored in kvm_x86_ops->run. */
|
|
|
+ __copy_kernel_to_fpregs(&vcpu->arch.guest_fpu.state,
|
|
|
+ ~XFEATURE_MASK_PKRU);
|
|
|
trace_kvm_fpu(1);
|
|
|
}
|
|
|
|