|
@@ -2978,9 +2978,7 @@ static void kvm_vcpu_ioctl_x86_get_vcpu_events(struct kvm_vcpu *vcpu,
|
|
|
vcpu->arch.interrupt.pending && !vcpu->arch.interrupt.soft;
|
|
|
events->interrupt.nr = vcpu->arch.interrupt.nr;
|
|
|
events->interrupt.soft = 0;
|
|
|
- events->interrupt.shadow =
|
|
|
- kvm_x86_ops->get_interrupt_shadow(vcpu,
|
|
|
- KVM_X86_SHADOW_INT_MOV_SS | KVM_X86_SHADOW_INT_STI);
|
|
|
+ events->interrupt.shadow = kvm_x86_ops->get_interrupt_shadow(vcpu);
|
|
|
|
|
|
events->nmi.injected = vcpu->arch.nmi_injected;
|
|
|
events->nmi.pending = vcpu->arch.nmi_pending != 0;
|
|
@@ -4860,7 +4858,7 @@ static const struct x86_emulate_ops emulate_ops = {
|
|
|
|
|
|
static void toggle_interruptibility(struct kvm_vcpu *vcpu, u32 mask)
|
|
|
{
|
|
|
- u32 int_shadow = kvm_x86_ops->get_interrupt_shadow(vcpu, mask);
|
|
|
+ u32 int_shadow = kvm_x86_ops->get_interrupt_shadow(vcpu);
|
|
|
/*
|
|
|
* an sti; sti; sequence only disable interrupts for the first
|
|
|
* instruction. So, if the last instruction, be it emulated or
|
|
@@ -4868,7 +4866,9 @@ static void toggle_interruptibility(struct kvm_vcpu *vcpu, u32 mask)
|
|
|
* means that the last instruction is an sti. We should not
|
|
|
* leave the flag on in this case. The same goes for mov ss
|
|
|
*/
|
|
|
- if (!(int_shadow & mask))
|
|
|
+ if (int_shadow & mask)
|
|
|
+ mask = 0;
|
|
|
+ if (unlikely(int_shadow || mask))
|
|
|
kvm_x86_ops->set_interrupt_shadow(vcpu, mask);
|
|
|
}
|
|
|
|