KVM: Push struct x86_exception into walk_addr()
authorAvi Kivity <avi@redhat.com>
Mon, 22 Nov 2010 15:53:27 +0000 (17:53 +0200)
committerAvi Kivity <avi@redhat.com>
Wed, 12 Jan 2011 09:30:01 +0000 (11:30 +0200)
Signed-off-by: Avi Kivity <avi@redhat.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
arch/x86/kvm/paging_tmpl.h

index 3ac39de444ec82b994ad8baec1a37ae12477f525..ad5a5a28b96e8105f552974a605585ecf3cf0186 100644 (file)
@@ -72,7 +72,7 @@ struct guest_walker {
        unsigned pt_access;
        unsigned pte_access;
        gfn_t gfn;
-       u32 error_code;
+       struct x86_exception fault;
 };
 
 static gfn_t gpte_to_gfn_lvl(pt_element_t gpte, int lvl)
@@ -266,21 +266,23 @@ walk:
        return 1;
 
 error:
-       walker->error_code = 0;
+       walker->fault.vector = PF_VECTOR;
+       walker->fault.error_code_valid = true;
+       walker->fault.error_code = 0;
        if (present)
-               walker->error_code |= PFERR_PRESENT_MASK;
+               walker->fault.error_code |= PFERR_PRESENT_MASK;
 
-       walker->error_code |= write_fault | user_fault;
+       walker->fault.error_code |= write_fault | user_fault;
 
        if (fetch_fault && mmu->nx)
-               walker->error_code |= PFERR_FETCH_MASK;
+               walker->fault.error_code |= PFERR_FETCH_MASK;
        if (rsvd_fault)
-               walker->error_code |= PFERR_RSVD_MASK;
+               walker->fault.error_code |= PFERR_RSVD_MASK;
 
        vcpu->arch.fault.address    = addr;
-       vcpu->arch.fault.error_code = walker->error_code;
+       vcpu->arch.fault.error_code = walker->fault.error_code;
 
-       trace_kvm_mmu_walker_error(walker->error_code);
+       trace_kvm_mmu_walker_error(walker->fault.error_code);
        return 0;
 }
 
@@ -688,11 +690,8 @@ static gpa_t FNAME(gva_to_gpa)(struct kvm_vcpu *vcpu, gva_t vaddr, u32 access,
        if (r) {
                gpa = gfn_to_gpa(walker.gfn);
                gpa |= vaddr & ~PAGE_MASK;
-       } else if (exception) {
-               exception->vector = PF_VECTOR;
-               exception->error_code_valid = true;
-               exception->error_code = walker.error_code;
-       }
+       } else if (exception)
+               *exception = walker.fault;
 
        return gpa;
 }
@@ -710,11 +709,8 @@ static gpa_t FNAME(gva_to_gpa_nested)(struct kvm_vcpu *vcpu, gva_t vaddr,
        if (r) {
                gpa = gfn_to_gpa(walker.gfn);
                gpa |= vaddr & ~PAGE_MASK;
-       } else if (exception) {
-               exception->vector = PF_VECTOR;
-               exception->error_code_valid = true;
-               exception->error_code = walker.error_code;
-       }
+       } else if (exception)
+               *exception = walker.fault;
 
        return gpa;
 }