@@ -193,7 +193,7 @@ static const struct svm_direct_access_msrs {
193
193
{ .index = MSR_IA32_LASTBRANCHTOIP , .always = false },
194
194
{ .index = MSR_IA32_LASTINTFROMIP , .always = false },
195
195
{ .index = MSR_IA32_LASTINTTOIP , .always = false },
196
- { .index = MSR_IA32_SPEC_CTRL , .always = true },
196
+ { .index = MSR_IA32_SPEC_CTRL , .always = false },
197
197
{ .index = MSR_IA32_PRED_CMD , .always = false },
198
198
{ .index = MSR_INVALID , .always = false },
199
199
};
@@ -3176,6 +3176,11 @@ static int svm_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
3176
3176
msr_info -> data = svm -> nested .vm_cr_msr ;
3177
3177
break ;
3178
3178
case MSR_IA32_SPEC_CTRL :
3179
+ if (!msr_info -> host_initiated &&
3180
+ !guest_cpuid_has_ibrs (vcpu ) &&
3181
+ !guest_cpuid_has_ssbd (vcpu ))
3182
+ return 1 ;
3183
+
3179
3184
msr_info -> data = svm -> spec_ctrl ;
3180
3185
break ;
3181
3186
case MSR_AMD64_VIRT_SPEC_CTRL :
@@ -3301,7 +3306,32 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr)
3301
3306
vcpu_unimpl (vcpu , "unimplemented wrmsr: 0x%x data 0x%llx\n" , ecx , data );
3302
3307
break ;
3303
3308
case MSR_IA32_SPEC_CTRL :
3309
+ if (!msr -> host_initiated &&
3310
+ !guest_cpuid_has_ibrs (vcpu ) &&
3311
+ !guest_cpuid_has_ssbd (vcpu ))
3312
+ return 1 ;
3313
+
3314
+ /* The STIBP bit doesn't fault even if it's not advertised */
3315
+ if (data & ~(SPEC_CTRL_IBRS | SPEC_CTRL_STIBP ))
3316
+ return 1 ;
3317
+
3304
3318
svm -> spec_ctrl = data ;
3319
+
3320
+ if (!data )
3321
+ break ;
3322
+
3323
+ /*
3324
+ * For non-nested:
3325
+ * When it's written (to non-zero) for the first time, pass
3326
+ * it through.
3327
+ *
3328
+ * For nested:
3329
+ * The handling of the MSR bitmap for L2 guests is done in
3330
+ * nested_svm_vmrun_msrpm.
3331
+ * We update the L1 MSR bit as well since it will end up
3332
+ * touching the MSR anyway now.
3333
+ */
3334
+ set_msr_interception (svm -> msrpm , MSR_IA32_SPEC_CTRL , 1 , 1 );
3305
3335
break ;
3306
3336
case MSR_IA32_PRED_CMD :
3307
3337
if (!msr -> host_initiated &&
0 commit comments