|
@@ -4417,22 +4417,20 @@ static int enable_irq_window(struct kvm_vcpu *vcpu)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static void enable_nmi_window(struct kvm_vcpu *vcpu)
|
|
|
+static int enable_nmi_window(struct kvm_vcpu *vcpu)
|
|
|
{
|
|
|
u32 cpu_based_vm_exec_control;
|
|
|
|
|
|
- if (!cpu_has_virtual_nmis()) {
|
|
|
- enable_irq_window(vcpu);
|
|
|
- return;
|
|
|
- }
|
|
|
+ if (!cpu_has_virtual_nmis())
|
|
|
+ return enable_irq_window(vcpu);
|
|
|
+
|
|
|
+ if (vmcs_read32(GUEST_INTERRUPTIBILITY_INFO) & GUEST_INTR_STATE_STI)
|
|
|
+ return enable_irq_window(vcpu);
|
|
|
|
|
|
- if (vmcs_read32(GUEST_INTERRUPTIBILITY_INFO) & GUEST_INTR_STATE_STI) {
|
|
|
- enable_irq_window(vcpu);
|
|
|
- return;
|
|
|
- }
|
|
|
cpu_based_vm_exec_control = vmcs_read32(CPU_BASED_VM_EXEC_CONTROL);
|
|
|
cpu_based_vm_exec_control |= CPU_BASED_VIRTUAL_NMI_PENDING;
|
|
|
vmcs_write32(CPU_BASED_VM_EXEC_CONTROL, cpu_based_vm_exec_control);
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
static void vmx_inject_irq(struct kvm_vcpu *vcpu)
|