Revert "x86/hvm: disable pkeys for guests in non-paging mode"

This reverts commit c41e0266dd.

When determining Access Rights, Protection Keys only take effect when CR4.PKE
it set, and 4-level paging is active.  All other circumstances (notibly, 32bit
PAE paging) skip the Protection Key control mechanism.

Therefore, we do not need to clear CR4.PKE behind the back of a guest which is
not using paging, as such a guest is necesserily running with EFER.LMA
disabled.

The {RD,WR}PKRU instructions are specified as being legal for use in any
operating mode, but only if CR4.PKE is set.  By clearing CR4.PKE behind the
back of an unpaged guest, these instructions yield #UD despite the guest
correctly seeing PKE set if it reads CR4, and OSPKE being visible in CPUID.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Huaitong Han <huaitong.han@intel.com>
Acked-by: Kevin Tian <kevin.tian@intel.com>
master commit: 224acdd04a
master date: 2017-06-01 14:13:57 +0100
This commit is contained in:
Andrew Cooper authored and Jan Beulich committed 2017-06-23 15:15:57 +02:00
1 parent db2a8fe8b2
commit a2e3d27df7
1 file changed
+5 -6
+5 -6
View File
@@ -1588,13 +1588,12 @@ static void vmx_update_guest_cr(struct vcpu *v, unsigned int cr)
if ( !hvm_paging_enabled(v) )
{
/*
* SMEP/SMAP/PKU is disabled if CPU is in non-paging mode in
* hardware. However Xen always uses paging mode to emulate guest
* non-paging mode. To emulate this behavior, SMEP/SMAP/PKU needs
* to be manually disabled when guest VCPU is in non-paging mode.
* SMEP/SMAP is disabled if CPU is in non-paging mode in hardware.
* However Xen always uses paging mode to emulate guest non-paging
* mode. To emulate this behavior, SMEP/SMAP needs to be manually
* disabled when guest VCPU is in non-paging mode.
*/
v->arch.hvm_vcpu.hw_cr[4] &=
~(X86_CR4_SMEP | X86_CR4_SMAP | X86_CR4_PKE);
v->arch.hvm_vcpu.hw_cr[4] &= ~(X86_CR4_SMEP | X86_CR4_SMAP);
}
__vmwrite(GUEST_CR4, v->arch.hvm_vcpu.hw_cr[4]);
break;
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.