From: Andrew Cooper Date: Tue, 5 Jul 2016 09:40:21 +0000 (+0100) Subject: x86/hvm: Adjust hvm_nx_enabled() to match how Xen behaves X-Git-Tag: 4.9.0-rc1~350 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=7bdb974a82c1631bfc7451b9dd9756858617aef4;p=xen.git x86/hvm: Adjust hvm_nx_enabled() to match how Xen behaves On Intel hardware, EFER is not fully switched between host and guest contexts. In practice, this means that Xen's EFER.NX setting leaks into guest context, and influences the behaviour of the hardware pagewalker. When servicing a pagefault, Xen's model of guests behaviour should match hardware's behaviour, to allow correct interpretation of the pagefault error code, and to avoid creating observable difference in behaviour from the guests point of view. Signed-off-by: Andrew Cooper Reviewed-by: Jan Beulich --- diff --git a/xen/include/asm-x86/hvm/hvm.h b/xen/include/asm-x86/hvm/hvm.h index 87b203a6d4..eccc25e4be 100644 --- a/xen/include/asm-x86/hvm/hvm.h +++ b/xen/include/asm-x86/hvm/hvm.h @@ -292,8 +292,10 @@ int hvm_girq_dest_2_vcpu_id(struct domain *d, uint8_t dest, uint8_t dest_mode); (hvm_paging_enabled(v) && ((v)->arch.hvm_vcpu.guest_cr[4] & X86_CR4_SMEP)) #define hvm_smap_enabled(v) \ (hvm_paging_enabled(v) && ((v)->arch.hvm_vcpu.guest_cr[4] & X86_CR4_SMAP)) +/* HVM guests on Intel hardware leak Xen's NX settings into guest context. */ #define hvm_nx_enabled(v) \ - (!!((v)->arch.hvm_vcpu.guest_efer & EFER_NX)) + ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL && cpu_has_nx) || \ + ((v)->arch.hvm_vcpu.guest_efer & EFER_NX)) #define hvm_pku_enabled(v) \ (hvm_paging_enabled(v) && ((v)->arch.hvm_vcpu.guest_cr[4] & X86_CR4_PKE))