Revision ea643051 target-i386/kvm.c
b/target-i386/kvm.c | ||
---|---|---|
546 | 546 |
entry->data = value; |
547 | 547 |
} |
548 | 548 |
|
549 |
static int kvm_put_msrs(CPUState *env) |
|
549 |
static int kvm_put_msrs(CPUState *env, int level)
|
|
550 | 550 |
{ |
551 | 551 |
struct { |
552 | 552 |
struct kvm_msrs info; |
... | ... | |
560 | 560 |
kvm_msr_entry_set(&msrs[n++], MSR_IA32_SYSENTER_EIP, env->sysenter_eip); |
561 | 561 |
if (kvm_has_msr_star(env)) |
562 | 562 |
kvm_msr_entry_set(&msrs[n++], MSR_STAR, env->star); |
563 |
kvm_msr_entry_set(&msrs[n++], MSR_IA32_TSC, env->tsc); |
|
564 | 563 |
#ifdef TARGET_X86_64 |
565 | 564 |
/* FIXME if lm capable */ |
566 | 565 |
kvm_msr_entry_set(&msrs[n++], MSR_CSTAR, env->cstar); |
... | ... | |
568 | 567 |
kvm_msr_entry_set(&msrs[n++], MSR_FMASK, env->fmask); |
569 | 568 |
kvm_msr_entry_set(&msrs[n++], MSR_LSTAR, env->lstar); |
570 | 569 |
#endif |
571 |
kvm_msr_entry_set(&msrs[n++], MSR_KVM_SYSTEM_TIME, env->system_time_msr); |
|
572 |
kvm_msr_entry_set(&msrs[n++], MSR_KVM_WALL_CLOCK, env->wall_clock_msr); |
|
570 |
if (level == KVM_PUT_FULL_STATE) { |
|
571 |
kvm_msr_entry_set(&msrs[n++], MSR_IA32_TSC, env->tsc); |
|
572 |
kvm_msr_entry_set(&msrs[n++], MSR_KVM_SYSTEM_TIME, |
|
573 |
env->system_time_msr); |
|
574 |
kvm_msr_entry_set(&msrs[n++], MSR_KVM_WALL_CLOCK, env->wall_clock_msr); |
|
575 |
} |
|
573 | 576 |
|
574 | 577 |
msr_data.info.nmsrs = n; |
575 | 578 |
|
... | ... | |
782 | 785 |
return 0; |
783 | 786 |
} |
784 | 787 |
|
785 |
static int kvm_put_vcpu_events(CPUState *env) |
|
788 |
static int kvm_put_vcpu_events(CPUState *env, int level)
|
|
786 | 789 |
{ |
787 | 790 |
#ifdef KVM_CAP_VCPU_EVENTS |
788 | 791 |
struct kvm_vcpu_events events; |
... | ... | |
806 | 809 |
|
807 | 810 |
events.sipi_vector = env->sipi_vector; |
808 | 811 |
|
809 |
events.flags = |
|
810 |
KVM_VCPUEVENT_VALID_NMI_PENDING | KVM_VCPUEVENT_VALID_SIPI_VECTOR; |
|
812 |
events.flags = 0; |
|
813 |
if (level >= KVM_PUT_RESET_STATE) { |
|
814 |
events.flags |= |
|
815 |
KVM_VCPUEVENT_VALID_NMI_PENDING | KVM_VCPUEVENT_VALID_SIPI_VECTOR; |
|
816 |
} |
|
811 | 817 |
|
812 | 818 |
return kvm_vcpu_ioctl(env, KVM_SET_VCPU_EVENTS, &events); |
813 | 819 |
#else |
... | ... | |
899 | 905 |
if (ret < 0) |
900 | 906 |
return ret; |
901 | 907 |
|
902 |
ret = kvm_put_msrs(env); |
|
908 |
ret = kvm_put_msrs(env, level);
|
|
903 | 909 |
if (ret < 0) |
904 | 910 |
return ret; |
905 | 911 |
|
906 |
ret = kvm_put_mp_state(env); |
|
907 |
if (ret < 0) |
|
908 |
return ret; |
|
912 |
if (level >= KVM_PUT_RESET_STATE) { |
|
913 |
ret = kvm_put_mp_state(env); |
|
914 |
if (ret < 0) |
|
915 |
return ret; |
|
916 |
} |
|
909 | 917 |
|
910 |
ret = kvm_put_vcpu_events(env); |
|
918 |
ret = kvm_put_vcpu_events(env, level);
|
|
911 | 919 |
if (ret < 0) |
912 | 920 |
return ret; |
913 | 921 |
|
Also available in: Unified diff