vector = exitintinfo & SVM_EXITINTINFO_VEC_MASK;
        type = exitintinfo & SVM_EXITINTINFO_TYPE_MASK;
 
+       /*
+        * If NextRIP isn't enabled, KVM must manually advance RIP prior to
+        * injecting the soft exception/interrupt.  That advancement needs to
+        * be unwound if vectoring didn't complete.  Note, the _new_ event may
+        * not be the injected event, e.g. if KVM injected an INTn, the INTn
+        * hit a #NP in the guest, and the #NP encountered a #PF, the #NP will
+        * be the reported vectored event, but RIP still needs to be unwound.
+        */
+       if (int3_injected && type == SVM_EXITINTINFO_TYPE_EXEPT &&
+          kvm_is_linear_rip(vcpu, svm->int3_rip))
+               kvm_rip_write(vcpu, kvm_rip_read(vcpu) - int3_injected);
+
        switch (type) {
        case SVM_EXITINTINFO_TYPE_NMI:
                vcpu->arch.nmi_injected = true;
 
                /*
                 * In case of software exceptions, do not reinject the vector,
-                * but re-execute the instruction instead. Rewind RIP first
-                * if we emulated INT3 before.
+                * but re-execute the instruction instead.
                 */
-               if (kvm_exception_is_soft(vector)) {
-                       if (vector == BP_VECTOR && int3_injected &&
-                           kvm_is_linear_rip(vcpu, svm->int3_rip))
-                               kvm_rip_write(vcpu,
-                                             kvm_rip_read(vcpu) - int3_injected);
+               if (kvm_exception_is_soft(vector))
                        break;
-               }
+
                if (exitintinfo & SVM_EXITINTINFO_VALID_ERR) {
                        u32 err = svm->vmcb->control.exit_int_info_err;
                        kvm_requeue_exception_e(vcpu, vector, err);