Commit 8c28d031 authored by Avi Kivity's avatar Avi Kivity

KVM: Push struct x86_exception into walk_addr()

Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
Signed-off-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
parent ab9ae313
...@@ -72,7 +72,7 @@ struct guest_walker { ...@@ -72,7 +72,7 @@ struct guest_walker {
unsigned pt_access; unsigned pt_access;
unsigned pte_access; unsigned pte_access;
gfn_t gfn; gfn_t gfn;
u32 error_code; struct x86_exception fault;
}; };
static gfn_t gpte_to_gfn_lvl(pt_element_t gpte, int lvl) static gfn_t gpte_to_gfn_lvl(pt_element_t gpte, int lvl)
...@@ -266,21 +266,23 @@ static int FNAME(walk_addr_generic)(struct guest_walker *walker, ...@@ -266,21 +266,23 @@ static int FNAME(walk_addr_generic)(struct guest_walker *walker,
return 1; return 1;
error: error:
walker->error_code = 0; walker->fault.vector = PF_VECTOR;
walker->fault.error_code_valid = true;
walker->fault.error_code = 0;
if (present) 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) if (fetch_fault && mmu->nx)
walker->error_code |= PFERR_FETCH_MASK; walker->fault.error_code |= PFERR_FETCH_MASK;
if (rsvd_fault) if (rsvd_fault)
walker->error_code |= PFERR_RSVD_MASK; walker->fault.error_code |= PFERR_RSVD_MASK;
vcpu->arch.fault.address = addr; 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; return 0;
} }
...@@ -688,11 +690,8 @@ static gpa_t FNAME(gva_to_gpa)(struct kvm_vcpu *vcpu, gva_t vaddr, u32 access, ...@@ -688,11 +690,8 @@ static gpa_t FNAME(gva_to_gpa)(struct kvm_vcpu *vcpu, gva_t vaddr, u32 access,
if (r) { if (r) {
gpa = gfn_to_gpa(walker.gfn); gpa = gfn_to_gpa(walker.gfn);
gpa |= vaddr & ~PAGE_MASK; gpa |= vaddr & ~PAGE_MASK;
} else if (exception) { } else if (exception)
exception->vector = PF_VECTOR; *exception = walker.fault;
exception->error_code_valid = true;
exception->error_code = walker.error_code;
}
return gpa; return gpa;
} }
...@@ -710,11 +709,8 @@ static gpa_t FNAME(gva_to_gpa_nested)(struct kvm_vcpu *vcpu, gva_t vaddr, ...@@ -710,11 +709,8 @@ static gpa_t FNAME(gva_to_gpa_nested)(struct kvm_vcpu *vcpu, gva_t vaddr,
if (r) { if (r) {
gpa = gfn_to_gpa(walker.gfn); gpa = gfn_to_gpa(walker.gfn);
gpa |= vaddr & ~PAGE_MASK; gpa |= vaddr & ~PAGE_MASK;
} else if (exception) { } else if (exception)
exception->vector = PF_VECTOR; *exception = walker.fault;
exception->error_code_valid = true;
exception->error_code = walker.error_code;
}
return gpa; return gpa;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment