UBUNTU: SAUCE: kvm: fix push of wrong eip when doing softint
[linux-flexiantxendom0-natty.git] / arch / x86 / kvm / vmx.c
index bf89ec2..3aad96c 100644 (file)
@@ -1053,7 +1053,10 @@ static void vmx_queue_exception(struct kvm_vcpu *vcpu, unsigned nr,
        }
 
        if (vmx->rmode.vm86_active) {
-               if (kvm_inject_realmode_interrupt(vcpu, nr) != EMULATE_DONE)
+               int inc_eip = 0;
+               if (kvm_exception_is_soft(nr))
+                       inc_eip = vcpu->arch.event_exit_inst_len;
+               if (kvm_inject_realmode_interrupt(vcpu, nr, inc_eip) != EMULATE_DONE)
                        kvm_make_request(KVM_REQ_TRIPLE_FAULT, vcpu);
                return;
        }
@@ -2871,7 +2874,10 @@ static void vmx_inject_irq(struct kvm_vcpu *vcpu)
 
        ++vcpu->stat.irq_injections;
        if (vmx->rmode.vm86_active) {
-               if (kvm_inject_realmode_interrupt(vcpu, irq) != EMULATE_DONE)
+               int inc_eip = 0;
+               if (vcpu->arch.interrupt.soft)
+                       inc_eip = vcpu->arch.event_exit_inst_len;
+               if (kvm_inject_realmode_interrupt(vcpu, irq, inc_eip) != EMULATE_DONE)
                        kvm_make_request(KVM_REQ_TRIPLE_FAULT, vcpu);
                return;
        }
@@ -2905,7 +2911,7 @@ static void vmx_inject_nmi(struct kvm_vcpu *vcpu)
 
        ++vcpu->stat.nmi_injections;
        if (vmx->rmode.vm86_active) {
-               if (kvm_inject_realmode_interrupt(vcpu, NMI_VECTOR) != EMULATE_DONE)
+               if (kvm_inject_realmode_interrupt(vcpu, NMI_VECTOR, 0) != EMULATE_DONE)
                        kvm_make_request(KVM_REQ_TRIPLE_FAULT, vcpu);
                return;
        }