Revision ea643051

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