From: Xiao Guangrong <guangrong.xiao@xxxxxxxxxxxxxxx> This reverts commit 5688dccad8a05988be55eacc9e5c7dc8ef20a6d0. It is not necessary, please refer to: https://lkml.org/lkml/2016/3/10/302 Signed-off-by: Xiao Guangrong <guangrong.xiao@xxxxxxxxxxxxxxx> --- arch/x86/kvm/mmu.c | 2 +- arch/x86/kvm/paging_tmpl.h | 26 +++++++++++--------------- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 28c750a..92c42b7 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -3885,7 +3885,7 @@ static void update_permission_bitmask(struct kvm_vcpu *vcpu, u = bit & ACC_USER_MASK; if (!ept) { - /* Not really needed: if !nx, ff will always be zero */ + /* Not really needed: !nx will cause pte.nx to fault */ x |= !mmu->nx; /* Allow supervisor writes if !cr0.wp */ w |= !is_write_protection(vcpu) && !uf; diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h index cf1f6c2..385b136 100644 --- a/arch/x86/kvm/paging_tmpl.h +++ b/arch/x86/kvm/paging_tmpl.h @@ -283,24 +283,13 @@ static int FNAME(walk_addr_generic)(struct guest_walker *walker, gpa_t pte_gpa; int offset; const int write_fault = access & PFERR_WRITE_MASK; - u16 errcode; + const int user_fault = access & PFERR_USER_MASK; + const int fetch_fault = access & PFERR_FETCH_MASK; + u16 errcode = 0; gpa_t real_gpa; gfn_t gfn; trace_kvm_mmu_pagetable_walk(addr, access); - - /* - * Do not modify PFERR_FETCH_MASK in access. It is used later in the call to - * mmu->translate_gpa and, when nested virtualization is in use, the X or NX - * bit of nested page tables always applies---even if NX and SMEP are disabled - * in the guest. - * - * TODO: cache the result of the NX and SMEP test in struct kvm_mmu? - */ - errcode = access; - if (!(mmu->nx || kvm_read_cr4_bits(vcpu, X86_CR4_SMEP))) - errcode &= ~PFERR_FETCH_MASK; - retry_walk: walker->level = mmu->root_level; pte = mmu->get_cr3(vcpu); @@ -411,7 +400,9 @@ retry_walk: if (unlikely(!accessed_dirty)) { ret = FNAME(update_accessed_dirty_bits)(vcpu, mmu, walker, write_fault); - if (ret > 0) + if (unlikely(ret < 0)) + goto error; + else if (ret) goto retry_walk; } @@ -422,6 +413,11 @@ retry_walk: return 1; error: + errcode |= write_fault | user_fault; + if (fetch_fault && (mmu->nx || + kvm_read_cr4_bits(vcpu, X86_CR4_SMEP))) + errcode |= PFERR_FETCH_MASK; + walker->fault.vector = PF_VECTOR; walker->fault.error_code_valid = true; walker->fault.error_code = errcode; -- 1.8.3.1 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html