From 24d31b05a15eec227bf85ded6db409b56c470b49 Mon Sep 17 00:00:00 2001 From: Xiao Guangrong Date: Wed, 20 Jun 2012 15:58:04 +0800 Subject: [PATCH] --- yaml --- r: 315899 b: refs/heads/master c: 4f5982a56a70a4a8b7966ef458d3fcdd27aa16cf h: refs/heads/master i: 315897: 54da9b9d1e4e04d93bb0f7d4648fb95d093d17c6 315895: 4e0ddfe7fbf2d3e189539414d72b4e83aafbea26 v: v3 --- [refs] | 2 +- trunk/arch/x86/kvm/vmx.c | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 230a29ad0462..a0e880efbded 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 8e22f955fb65c5930cc4c5a863cce4e27d0e4a3c +refs/heads/master: 4f5982a56a70a4a8b7966ef458d3fcdd27aa16cf diff --git a/trunk/arch/x86/kvm/vmx.c b/trunk/arch/x86/kvm/vmx.c index a2b9dd9af620..5c52a6d29908 100644 --- a/trunk/arch/x86/kvm/vmx.c +++ b/trunk/arch/x86/kvm/vmx.c @@ -4838,6 +4838,7 @@ static int handle_ept_violation(struct kvm_vcpu *vcpu) { unsigned long exit_qualification; gpa_t gpa; + u32 error_code; int gla_validity; exit_qualification = vmcs_readl(EXIT_QUALIFICATION); @@ -4862,7 +4863,13 @@ static int handle_ept_violation(struct kvm_vcpu *vcpu) gpa = vmcs_read64(GUEST_PHYSICAL_ADDRESS); trace_kvm_page_fault(gpa, exit_qualification); - return kvm_mmu_page_fault(vcpu, gpa, exit_qualification & 0x3, NULL, 0); + + /* It is a write fault? */ + error_code = exit_qualification & (1U << 1); + /* ept page table is present? */ + error_code |= (exit_qualification >> 3) & 0x1; + + return kvm_mmu_page_fault(vcpu, gpa, error_code, NULL, 0); } static u64 ept_rsvd_mask(u64 spte, int level)