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