|
@@ -4823,6 +4823,22 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu)
|
|
|
if (unlikely(svm->nested.exit_required))
|
|
|
return;
|
|
|
|
|
|
+ /*
|
|
|
+ * Disable singlestep if we're injecting an interrupt/exception.
|
|
|
+ * We don't want our modified rflags to be pushed on the stack where
|
|
|
+ * we might not be able to easily reset them if we disabled NMI
|
|
|
+ * singlestep later.
|
|
|
+ */
|
|
|
+ if (svm->nmi_singlestep && svm->vmcb->control.event_inj) {
|
|
|
+ /*
|
|
|
+ * Event injection happens before external interrupts cause a
|
|
|
+ * vmexit and interrupts are disabled here, so smp_send_reschedule
|
|
|
+ * is enough to force an immediate vmexit.
|
|
|
+ */
|
|
|
+ disable_nmi_singlestep(svm);
|
|
|
+ smp_send_reschedule(vcpu->cpu);
|
|
|
+ }
|
|
|
+
|
|
|
pre_svm_run(svm);
|
|
|
|
|
|
sync_lapic_to_cr8(vcpu);
|