uint64_t sysenter_esp;
uint64_t sysenter_eip;
+ u64 msr_decfg;
+
u64 next_rip;
u64 host_user_msrs[NR_HOST_SAVE_USER_MSRS];
static int svm_get_msr_feature(struct kvm_msr_entry *msr)
{
- return 1;
+ msr->data = 0;
+
+ switch (msr->index) {
+ case MSR_F10H_DECFG:
+ if (boot_cpu_has(X86_FEATURE_LFENCE_RDTSC))
+ msr->data |= BIT_ULL(MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT);
+ break;
+ default:
+ return 1;
+ }
+
+ return 0;
}
static int svm_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
case MSR_IA32_UCODE_REV:
msr_info->data = 0x01000065;
break;
+ case MSR_F10H_DECFG:
+ msr_info->data = svm->msr_decfg;
+ break;
default:
return kvm_get_msr_common(vcpu, msr_info);
}
svm->virt_spec_ctrl = data;
break;
+ case MSR_F10H_DECFG: {
+ struct kvm_msr_entry msr_entry;
+
+ msr_entry.index = msr->index;
+ if (svm_get_msr_feature(&msr_entry))
+ return 1;
+
+ /* Check the supported bits */
+ if (data & ~msr_entry.data)
+ return 1;
+
+ /* Don't allow the guest to change a bit, #GP */
+ if (!msr->host_initiated && (data ^ msr_entry.data))
+ return 1;
+
+ svm->msr_decfg = data;
+ break;
+ }
default:
return kvm_set_msr_common(vcpu, msr);
}
*/
static u32 msr_based_features[] = {
MSR_IA32_ARCH_CAPABILITIES,
+ MSR_F10H_DECFG,
};
static unsigned int num_msr_based_features;