diff options
-rw-r--r-- | arch/x86/kvm/x86.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index bb3a1531b249..722fe854985e 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -3114,6 +3114,12 @@ static int kvm_vcpu_ioctl_x86_set_vcpu_events(struct kvm_vcpu *vcpu, | |||
3114 | (events->exception.nr > 31 || events->exception.nr == NMI_VECTOR)) | 3114 | (events->exception.nr > 31 || events->exception.nr == NMI_VECTOR)) |
3115 | return -EINVAL; | 3115 | return -EINVAL; |
3116 | 3116 | ||
3117 | /* INITs are latched while in SMM */ | ||
3118 | if (events->flags & KVM_VCPUEVENT_VALID_SMM && | ||
3119 | (events->smi.smm || events->smi.pending) && | ||
3120 | vcpu->arch.mp_state == KVM_MP_STATE_INIT_RECEIVED) | ||
3121 | return -EINVAL; | ||
3122 | |||
3117 | process_nmi(vcpu); | 3123 | process_nmi(vcpu); |
3118 | vcpu->arch.exception.pending = events->exception.injected; | 3124 | vcpu->arch.exception.pending = events->exception.injected; |
3119 | vcpu->arch.exception.nr = events->exception.nr; | 3125 | vcpu->arch.exception.nr = events->exception.nr; |
@@ -7342,6 +7348,12 @@ int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu, | |||
7342 | mp_state->mp_state != KVM_MP_STATE_RUNNABLE) | 7348 | mp_state->mp_state != KVM_MP_STATE_RUNNABLE) |
7343 | return -EINVAL; | 7349 | return -EINVAL; |
7344 | 7350 | ||
7351 | /* INITs are latched while in SMM */ | ||
7352 | if ((is_smm(vcpu) || vcpu->arch.smi_pending) && | ||
7353 | (mp_state->mp_state == KVM_MP_STATE_SIPI_RECEIVED || | ||
7354 | mp_state->mp_state == KVM_MP_STATE_INIT_RECEIVED)) | ||
7355 | return -EINVAL; | ||
7356 | |||
7345 | if (mp_state->mp_state == KVM_MP_STATE_SIPI_RECEIVED) { | 7357 | if (mp_state->mp_state == KVM_MP_STATE_SIPI_RECEIVED) { |
7346 | vcpu->arch.mp_state = KVM_MP_STATE_INIT_RECEIVED; | 7358 | vcpu->arch.mp_state = KVM_MP_STATE_INIT_RECEIVED; |
7347 | set_bit(KVM_APIC_SIPI, &vcpu->arch.apic->pending_events); | 7359 | set_bit(KVM_APIC_SIPI, &vcpu->arch.apic->pending_events); |