aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/kvm/x86.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/kvm/x86.c')
-rw-r--r--drivers/kvm/x86.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/drivers/kvm/x86.c b/drivers/kvm/x86.c
index 11440d12a2d3..dc007a32a883 100644
--- a/drivers/kvm/x86.c
+++ b/drivers/kvm/x86.c
@@ -142,6 +142,21 @@ void kvm_queue_exception(struct kvm_vcpu *vcpu, unsigned nr)
142} 142}
143EXPORT_SYMBOL_GPL(kvm_queue_exception); 143EXPORT_SYMBOL_GPL(kvm_queue_exception);
144 144
145void kvm_inject_page_fault(struct kvm_vcpu *vcpu, unsigned long addr,
146 u32 error_code)
147{
148 ++vcpu->stat.pf_guest;
149 if (vcpu->exception.pending && vcpu->exception.nr == PF_VECTOR) {
150 printk(KERN_DEBUG "kvm: inject_page_fault:"
151 " double fault 0x%lx\n", addr);
152 vcpu->exception.nr = DF_VECTOR;
153 vcpu->exception.error_code = 0;
154 return;
155 }
156 vcpu->cr2 = addr;
157 kvm_queue_exception_e(vcpu, PF_VECTOR, error_code);
158}
159
145void kvm_queue_exception_e(struct kvm_vcpu *vcpu, unsigned nr, u32 error_code) 160void kvm_queue_exception_e(struct kvm_vcpu *vcpu, unsigned nr, u32 error_code)
146{ 161{
147 WARN_ON(vcpu->exception.pending); 162 WARN_ON(vcpu->exception.pending);
@@ -1601,7 +1616,7 @@ static int emulator_write_emulated_onepage(unsigned long addr,
1601 gpa_t gpa = vcpu->mmu.gva_to_gpa(vcpu, addr); 1616 gpa_t gpa = vcpu->mmu.gva_to_gpa(vcpu, addr);
1602 1617
1603 if (gpa == UNMAPPED_GVA) { 1618 if (gpa == UNMAPPED_GVA) {
1604 kvm_x86_ops->inject_page_fault(vcpu, addr, 2); 1619 kvm_inject_page_fault(vcpu, addr, 2);
1605 return X86EMUL_PROPAGATE_FAULT; 1620 return X86EMUL_PROPAGATE_FAULT;
1606 } 1621 }
1607 1622