[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1/2] Revert "x86/hvm: disable pkeys for guests in non-paging mode"
On Fri, 2017-05-26 at 18:03 +0100, Andrew Cooper wrote: > This reverts commit c41e0266dd59ab50b7a153157e9bd2a3ad114b53. > > 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.LME > disabled. Yes, if EFER.LME = 0, Protection Keys would take no effect too, so it isn't necessary to clear CR4.PKE in non-paging mode. > > 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 > seeing PKE set if it reads CR4, and OSPKE being visible in CPUID. If CR4.PKE is cleared, OSPKE would be invisible at the same time. When guest does set CR4_PKE in non-paging mode, then CR4_PKE would be cleared in vmcs loading, so, OSPKE should be always invisible, and #UD should not be yielded too. Reviewed-by: Huaitong Han <huaitong.han@xxxxxxxxx> > > Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> > --- > CC: Jan Beulich <JBeulich@xxxxxxxx> > CC: Jun Nakajima <jun.nakajima@xxxxxxxxx> > CC: Kevin Tian <kevin.tian@xxxxxxxxx> > CC: Huaitong Han <huaitong.han@xxxxxxxxx> > --- > xen/arch/x86/hvm/vmx/vmx.c | 11 +++++------ > 1 file changed, 5 insertions(+), 6 deletions(-) > > diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c > index c8ef18a..58552c3 100644 > --- a/xen/arch/x86/hvm/vmx/vmx.c > +++ b/xen/arch/x86/hvm/vmx/vmx.c > @@ -1673,13 +1673,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; _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |