Revision 57780495 target-i386/kvm.c
b/target-i386/kvm.c | ||
---|---|---|
777 | 777 |
struct kvm_msr_entry entries[100]; |
778 | 778 |
} msr_data; |
779 | 779 |
struct kvm_msr_entry *msrs = msr_data.entries; |
780 |
int n = 0; |
|
780 |
int i, n = 0;
|
|
781 | 781 |
|
782 | 782 |
kvm_msr_entry_set(&msrs[n++], MSR_IA32_SYSENTER_CS, env->sysenter_cs); |
783 | 783 |
kvm_msr_entry_set(&msrs[n++], MSR_IA32_SYSENTER_ESP, env->sysenter_esp); |
... | ... | |
797 | 797 |
env->system_time_msr); |
798 | 798 |
kvm_msr_entry_set(&msrs[n++], MSR_KVM_WALL_CLOCK, env->wall_clock_msr); |
799 | 799 |
} |
800 |
#ifdef KVM_CAP_MCE |
|
801 |
if (env->mcg_cap) { |
|
802 |
if (level == KVM_PUT_RESET_STATE) |
|
803 |
kvm_msr_entry_set(&msrs[n++], MSR_MCG_STATUS, env->mcg_status); |
|
804 |
else if (level == KVM_PUT_FULL_STATE) { |
|
805 |
kvm_msr_entry_set(&msrs[n++], MSR_MCG_STATUS, env->mcg_status); |
|
806 |
kvm_msr_entry_set(&msrs[n++], MSR_MCG_CTL, env->mcg_ctl); |
|
807 |
for (i = 0; i < (env->mcg_cap & 0xff) * 4; i++) |
|
808 |
kvm_msr_entry_set(&msrs[n++], MSR_MC0_CTL + i, env->mce_banks[i]); |
|
809 |
} |
|
810 |
} |
|
811 |
#endif |
|
800 | 812 |
|
801 | 813 |
msr_data.info.nmsrs = n; |
802 | 814 |
|
... | ... | |
1004 | 1016 |
msrs[n++].index = MSR_KVM_SYSTEM_TIME; |
1005 | 1017 |
msrs[n++].index = MSR_KVM_WALL_CLOCK; |
1006 | 1018 |
|
1019 |
#ifdef KVM_CAP_MCE |
|
1020 |
if (env->mcg_cap) { |
|
1021 |
msrs[n++].index = MSR_MCG_STATUS; |
|
1022 |
msrs[n++].index = MSR_MCG_CTL; |
|
1023 |
for (i = 0; i < (env->mcg_cap & 0xff) * 4; i++) |
|
1024 |
msrs[n++].index = MSR_MC0_CTL + i; |
|
1025 |
} |
|
1026 |
#endif |
|
1027 |
|
|
1007 | 1028 |
msr_data.info.nmsrs = n; |
1008 | 1029 |
ret = kvm_vcpu_ioctl(env, KVM_GET_MSRS, &msr_data); |
1009 | 1030 |
if (ret < 0) |
... | ... | |
1046 | 1067 |
case MSR_KVM_WALL_CLOCK: |
1047 | 1068 |
env->wall_clock_msr = msrs[i].data; |
1048 | 1069 |
break; |
1070 |
#ifdef KVM_CAP_MCE |
|
1071 |
case MSR_MCG_STATUS: |
|
1072 |
env->mcg_status = msrs[i].data; |
|
1073 |
break; |
|
1074 |
case MSR_MCG_CTL: |
|
1075 |
env->mcg_ctl = msrs[i].data; |
|
1076 |
break; |
|
1077 |
#endif |
|
1078 |
default: |
|
1079 |
#ifdef KVM_CAP_MCE |
|
1080 |
if (msrs[i].index >= MSR_MC0_CTL && |
|
1081 |
msrs[i].index < MSR_MC0_CTL + (env->mcg_cap & 0xff) * 4) { |
|
1082 |
env->mce_banks[msrs[i].index - MSR_MC0_CTL] = msrs[i].data; |
|
1083 |
break; |
|
1084 |
} |
|
1085 |
#endif |
|
1049 | 1086 |
} |
1050 | 1087 |
} |
1051 | 1088 |
|
Also available in: Unified diff