Revision a0fb002c target-i386/kvm.c

b/target-i386/kvm.c
225 225
void kvm_arch_reset_vcpu(CPUState *env)
226 226
{
227 227
    env->interrupt_injected = -1;
228
    env->nmi_injected = 0;
229
    env->nmi_pending = 0;
228 230
}
229 231

  
230 232
static int kvm_has_msr_star(CPUState *env)
......
694 696
    return 0;
695 697
}
696 698

  
699
static int kvm_put_vcpu_events(CPUState *env)
700
{
701
#ifdef KVM_CAP_VCPU_EVENTS
702
    struct kvm_vcpu_events events;
703

  
704
    if (!kvm_has_vcpu_events()) {
705
        return 0;
706
    }
707

  
708
    events.exception.injected = (env->exception_index >= 0);
709
    events.exception.nr = env->exception_index;
710
    events.exception.has_error_code = env->has_error_code;
711
    events.exception.error_code = env->error_code;
712

  
713
    events.interrupt.injected = (env->interrupt_injected >= 0);
714
    events.interrupt.nr = env->interrupt_injected;
715
    events.interrupt.soft = env->soft_interrupt;
716

  
717
    events.nmi.injected = env->nmi_injected;
718
    events.nmi.pending = env->nmi_pending;
719
    events.nmi.masked = !!(env->hflags2 & HF2_NMI_MASK);
720

  
721
    events.sipi_vector = env->sipi_vector;
722

  
723
    return kvm_vcpu_ioctl(env, KVM_SET_VCPU_EVENTS, &events);
724
#else
725
    return 0;
726
#endif
727
}
728

  
729
static int kvm_get_vcpu_events(CPUState *env)
730
{
731
#ifdef KVM_CAP_VCPU_EVENTS
732
    struct kvm_vcpu_events events;
733
    int ret;
734

  
735
    if (!kvm_has_vcpu_events()) {
736
        return 0;
737
    }
738

  
739
    ret = kvm_vcpu_ioctl(env, KVM_GET_VCPU_EVENTS, &events);
740
    if (ret < 0) {
741
       return ret;
742
    }
743
    env->exception_index =
744
       events.exception.injected ? events.exception.nr : -1;
745
    env->has_error_code = events.exception.has_error_code;
746
    env->error_code = events.exception.error_code;
747

  
748
    env->interrupt_injected =
749
        events.interrupt.injected ? events.interrupt.nr : -1;
750
    env->soft_interrupt = events.interrupt.soft;
751

  
752
    env->nmi_injected = events.nmi.injected;
753
    env->nmi_pending = events.nmi.pending;
754
    if (events.nmi.masked) {
755
        env->hflags2 |= HF2_NMI_MASK;
756
    } else {
757
        env->hflags2 &= ~HF2_NMI_MASK;
758
    }
759

  
760
    env->sipi_vector = events.sipi_vector;
761
#endif
762

  
763
    return 0;
764
}
765

  
697 766
int kvm_arch_put_registers(CPUState *env)
698 767
{
699 768
    int ret;
......
718 787
    if (ret < 0)
719 788
        return ret;
720 789

  
790
    ret = kvm_put_vcpu_events(env);
791
    if (ret < 0)
792
        return ret;
793

  
721 794
    return 0;
722 795
}
723 796

  
......
745 818
    if (ret < 0)
746 819
        return ret;
747 820

  
821
    ret = kvm_get_vcpu_events(env);
822
    if (ret < 0)
823
        return ret;
824

  
748 825
    return 0;
749 826
}
750 827

  

Also available in: Unified diff