Skip to content

Commit 5bb9ac1

Browse files
committed
KVM: x86: Return "unsupported" instead of "invalid" on access to unsupported PV MSR
Return KVM_MSR_RET_UNSUPPORTED instead of '1' (which for all intents and purposes means "invalid") when rejecting accesses to KVM PV MSRs to adhere to KVM's ABI of allowing host reads and writes of '0' to MSRs that are advertised to userspace via KVM_GET_MSR_INDEX_LIST, even if the vCPU model doesn't support the MSR. E.g. running a QEMU VM with -cpu host,-kvmclock,kvm-pv-enforce-cpuid yields: qemu: error: failed to set MSR 0x12 to 0x0 qemu: target/i386/kvm/kvm.c:3301: kvm_buf_set_msrs: Assertion `ret == cpu->kvm_msr_buf->nmsrs' failed. Fixes: 66570e9 ("kvm: x86: only provide PV features if enabled in guest's CPUID") Cc: stable@vger.kernel.org Reviewed-by: Jim Mattson <jmattson@google.com> Link: https://patch.msgid.link/20251230205948.4094097-1-seanjc@google.com Signed-off-by: Sean Christopherson <seanjc@google.com>
1 parent b47b93c commit 5bb9ac1

1 file changed

Lines changed: 20 additions & 20 deletions

File tree

arch/x86/kvm/x86.c

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4097,47 +4097,47 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
40974097
break;
40984098
case MSR_KVM_WALL_CLOCK_NEW:
40994099
if (!guest_pv_has(vcpu, KVM_FEATURE_CLOCKSOURCE2))
4100-
return 1;
4100+
return KVM_MSR_RET_UNSUPPORTED;
41014101

41024102
vcpu->kvm->arch.wall_clock = data;
41034103
kvm_write_wall_clock(vcpu->kvm, data, 0);
41044104
break;
41054105
case MSR_KVM_WALL_CLOCK:
41064106
if (!guest_pv_has(vcpu, KVM_FEATURE_CLOCKSOURCE))
4107-
return 1;
4107+
return KVM_MSR_RET_UNSUPPORTED;
41084108

41094109
vcpu->kvm->arch.wall_clock = data;
41104110
kvm_write_wall_clock(vcpu->kvm, data, 0);
41114111
break;
41124112
case MSR_KVM_SYSTEM_TIME_NEW:
41134113
if (!guest_pv_has(vcpu, KVM_FEATURE_CLOCKSOURCE2))
4114-
return 1;
4114+
return KVM_MSR_RET_UNSUPPORTED;
41154115

41164116
kvm_write_system_time(vcpu, data, false, msr_info->host_initiated);
41174117
break;
41184118
case MSR_KVM_SYSTEM_TIME:
41194119
if (!guest_pv_has(vcpu, KVM_FEATURE_CLOCKSOURCE))
4120-
return 1;
4120+
return KVM_MSR_RET_UNSUPPORTED;
41214121

41224122
kvm_write_system_time(vcpu, data, true, msr_info->host_initiated);
41234123
break;
41244124
case MSR_KVM_ASYNC_PF_EN:
41254125
if (!guest_pv_has(vcpu, KVM_FEATURE_ASYNC_PF))
4126-
return 1;
4126+
return KVM_MSR_RET_UNSUPPORTED;
41274127

41284128
if (kvm_pv_enable_async_pf(vcpu, data))
41294129
return 1;
41304130
break;
41314131
case MSR_KVM_ASYNC_PF_INT:
41324132
if (!guest_pv_has(vcpu, KVM_FEATURE_ASYNC_PF_INT))
4133-
return 1;
4133+
return KVM_MSR_RET_UNSUPPORTED;
41344134

41354135
if (kvm_pv_enable_async_pf_int(vcpu, data))
41364136
return 1;
41374137
break;
41384138
case MSR_KVM_ASYNC_PF_ACK:
41394139
if (!guest_pv_has(vcpu, KVM_FEATURE_ASYNC_PF_INT))
4140-
return 1;
4140+
return KVM_MSR_RET_UNSUPPORTED;
41414141
if (data & 0x1) {
41424142
/*
41434143
* Pairs with the smp_mb__after_atomic() in
@@ -4150,7 +4150,7 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
41504150
break;
41514151
case MSR_KVM_STEAL_TIME:
41524152
if (!guest_pv_has(vcpu, KVM_FEATURE_STEAL_TIME))
4153-
return 1;
4153+
return KVM_MSR_RET_UNSUPPORTED;
41544154

41554155
if (unlikely(!sched_info_on()))
41564156
return 1;
@@ -4168,15 +4168,15 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
41684168
break;
41694169
case MSR_KVM_PV_EOI_EN:
41704170
if (!guest_pv_has(vcpu, KVM_FEATURE_PV_EOI))
4171-
return 1;
4171+
return KVM_MSR_RET_UNSUPPORTED;
41724172

41734173
if (kvm_lapic_set_pv_eoi(vcpu, data, sizeof(u8)))
41744174
return 1;
41754175
break;
41764176

41774177
case MSR_KVM_POLL_CONTROL:
41784178
if (!guest_pv_has(vcpu, KVM_FEATURE_POLL_CONTROL))
4179-
return 1;
4179+
return KVM_MSR_RET_UNSUPPORTED;
41804180

41814181
/* only enable bit supported */
41824182
if (data & (-1ULL << 1))
@@ -4477,61 +4477,61 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
44774477
break;
44784478
case MSR_KVM_WALL_CLOCK:
44794479
if (!guest_pv_has(vcpu, KVM_FEATURE_CLOCKSOURCE))
4480-
return 1;
4480+
return KVM_MSR_RET_UNSUPPORTED;
44814481

44824482
msr_info->data = vcpu->kvm->arch.wall_clock;
44834483
break;
44844484
case MSR_KVM_WALL_CLOCK_NEW:
44854485
if (!guest_pv_has(vcpu, KVM_FEATURE_CLOCKSOURCE2))
4486-
return 1;
4486+
return KVM_MSR_RET_UNSUPPORTED;
44874487

44884488
msr_info->data = vcpu->kvm->arch.wall_clock;
44894489
break;
44904490
case MSR_KVM_SYSTEM_TIME:
44914491
if (!guest_pv_has(vcpu, KVM_FEATURE_CLOCKSOURCE))
4492-
return 1;
4492+
return KVM_MSR_RET_UNSUPPORTED;
44934493

44944494
msr_info->data = vcpu->arch.time;
44954495
break;
44964496
case MSR_KVM_SYSTEM_TIME_NEW:
44974497
if (!guest_pv_has(vcpu, KVM_FEATURE_CLOCKSOURCE2))
4498-
return 1;
4498+
return KVM_MSR_RET_UNSUPPORTED;
44994499

45004500
msr_info->data = vcpu->arch.time;
45014501
break;
45024502
case MSR_KVM_ASYNC_PF_EN:
45034503
if (!guest_pv_has(vcpu, KVM_FEATURE_ASYNC_PF))
4504-
return 1;
4504+
return KVM_MSR_RET_UNSUPPORTED;
45054505

45064506
msr_info->data = vcpu->arch.apf.msr_en_val;
45074507
break;
45084508
case MSR_KVM_ASYNC_PF_INT:
45094509
if (!guest_pv_has(vcpu, KVM_FEATURE_ASYNC_PF_INT))
4510-
return 1;
4510+
return KVM_MSR_RET_UNSUPPORTED;
45114511

45124512
msr_info->data = vcpu->arch.apf.msr_int_val;
45134513
break;
45144514
case MSR_KVM_ASYNC_PF_ACK:
45154515
if (!guest_pv_has(vcpu, KVM_FEATURE_ASYNC_PF_INT))
4516-
return 1;
4516+
return KVM_MSR_RET_UNSUPPORTED;
45174517

45184518
msr_info->data = 0;
45194519
break;
45204520
case MSR_KVM_STEAL_TIME:
45214521
if (!guest_pv_has(vcpu, KVM_FEATURE_STEAL_TIME))
4522-
return 1;
4522+
return KVM_MSR_RET_UNSUPPORTED;
45234523

45244524
msr_info->data = vcpu->arch.st.msr_val;
45254525
break;
45264526
case MSR_KVM_PV_EOI_EN:
45274527
if (!guest_pv_has(vcpu, KVM_FEATURE_PV_EOI))
4528-
return 1;
4528+
return KVM_MSR_RET_UNSUPPORTED;
45294529

45304530
msr_info->data = vcpu->arch.pv_eoi.msr_val;
45314531
break;
45324532
case MSR_KVM_POLL_CONTROL:
45334533
if (!guest_pv_has(vcpu, KVM_FEATURE_POLL_CONTROL))
4534-
return 1;
4534+
return KVM_MSR_RET_UNSUPPORTED;
45354535

45364536
msr_info->data = vcpu->arch.msr_kvm_poll_control;
45374537
break;

0 commit comments

Comments
 (0)