aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kvm/svm.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index bfb49489566e..8d61df4a02c7 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -135,6 +135,8 @@ struct vcpu_svm {
135 135
136 u32 *msrpm; 136 u32 *msrpm;
137 137
138 ulong nmi_iret_rip;
139
138 struct nested_state nested; 140 struct nested_state nested;
139 141
140 bool nmi_singlestep; 142 bool nmi_singlestep;
@@ -2653,6 +2655,7 @@ static int iret_interception(struct vcpu_svm *svm)
2653 ++svm->vcpu.stat.nmi_window_exits; 2655 ++svm->vcpu.stat.nmi_window_exits;
2654 clr_intercept(svm, INTERCEPT_IRET); 2656 clr_intercept(svm, INTERCEPT_IRET);
2655 svm->vcpu.arch.hflags |= HF_IRET_MASK; 2657 svm->vcpu.arch.hflags |= HF_IRET_MASK;
2658 svm->nmi_iret_rip = kvm_rip_read(&svm->vcpu);
2656 return 1; 2659 return 1;
2657} 2660}
2658 2661
@@ -3474,7 +3477,12 @@ static void svm_complete_interrupts(struct vcpu_svm *svm)
3474 3477
3475 svm->int3_injected = 0; 3478 svm->int3_injected = 0;
3476 3479
3477 if (svm->vcpu.arch.hflags & HF_IRET_MASK) { 3480 /*
3481 * If we've made progress since setting HF_IRET_MASK, we've
3482 * executed an IRET and can allow NMI injection.
3483 */
3484 if ((svm->vcpu.arch.hflags & HF_IRET_MASK)
3485 && kvm_rip_read(&svm->vcpu) != svm->nmi_iret_rip) {
3478 svm->vcpu.arch.hflags &= ~(HF_NMI_MASK | HF_IRET_MASK); 3486 svm->vcpu.arch.hflags &= ~(HF_NMI_MASK | HF_IRET_MASK);
3479 kvm_make_request(KVM_REQ_EVENT, &svm->vcpu); 3487 kvm_make_request(KVM_REQ_EVENT, &svm->vcpu);
3480 } 3488 }