aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/x86.c
diff options
context:
space:
mode:
authorJoerg Roedel <joerg.roedel@amd.com>2010-09-10 11:30:46 -0400
committerAvi Kivity <avi@redhat.com>2010-10-24 04:52:33 -0400
commit8df25a328a6ca3bd0f048278f4d5ae0a1f6fadc1 (patch)
tree613b4e3c09fa90a7a52b4283cc0687ce547bd5c7 /arch/x86/kvm/x86.c
parent3241f22da85d26505b39f525a88f52ebd1235975 (diff)
KVM: MMU: Track page fault data in struct vcpu
This patch introduces a struct with two new fields in vcpu_arch for x86: * fault.address * fault.error_code This will be used to correctly propagate page faults back into the guest when we could have either an ordinary page fault or a nested page fault. In the case of a nested page fault the fault-address is different from the original address that should be walked. So we need to keep track about the real fault-address. Signed-off-by: Joerg Roedel <joerg.roedel@amd.com> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/x86/kvm/x86.c')
-rw-r--r--arch/x86/kvm/x86.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 9d434777154d..48b74d2fbfb7 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -329,11 +329,12 @@ void kvm_requeue_exception(struct kvm_vcpu *vcpu, unsigned nr)
329} 329}
330EXPORT_SYMBOL_GPL(kvm_requeue_exception); 330EXPORT_SYMBOL_GPL(kvm_requeue_exception);
331 331
332void kvm_inject_page_fault(struct kvm_vcpu *vcpu, unsigned long addr, 332void kvm_inject_page_fault(struct kvm_vcpu *vcpu)
333 u32 error_code)
334{ 333{
334 unsigned error_code = vcpu->arch.fault.error_code;
335
335 ++vcpu->stat.pf_guest; 336 ++vcpu->stat.pf_guest;
336 vcpu->arch.cr2 = addr; 337 vcpu->arch.cr2 = vcpu->arch.fault.address;
337 kvm_queue_exception_e(vcpu, PF_VECTOR, error_code); 338 kvm_queue_exception_e(vcpu, PF_VECTOR, error_code);
338} 339}
339 340
@@ -4080,7 +4081,7 @@ static void inject_emulated_exception(struct kvm_vcpu *vcpu)
4080{ 4081{
4081 struct x86_emulate_ctxt *ctxt = &vcpu->arch.emulate_ctxt; 4082 struct x86_emulate_ctxt *ctxt = &vcpu->arch.emulate_ctxt;
4082 if (ctxt->exception == PF_VECTOR) 4083 if (ctxt->exception == PF_VECTOR)
4083 kvm_inject_page_fault(vcpu, ctxt->cr2, ctxt->error_code); 4084 kvm_inject_page_fault(vcpu);
4084 else if (ctxt->error_code_valid) 4085 else if (ctxt->error_code_valid)
4085 kvm_queue_exception_e(vcpu, ctxt->exception, ctxt->error_code); 4086 kvm_queue_exception_e(vcpu, ctxt->exception, ctxt->error_code);
4086 else 4087 else