From nobody Sat Feb 7 12:40:55 2026 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0781522F755 for ; Tue, 30 Dec 2025 20:59:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767128393; cv=none; b=N7CZ3Tm5pp7k2GN/N1au3x7J7rjKitkh7GD+uIFpvuoBofbvnOeJvCLueL5FKaVfiTQam4E5HqOlOQZqZSuGg6K2AZxypZ57UHBW8Esok2xMtKz9uvUZxG9g7VpHw8VrwQG86CUe07cKcVkQc7dT5o2hWjvdpWfRK4G/4ZKHmjE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767128393; c=relaxed/simple; bh=Yf8c47fOuuNkzfnpHdoKVTxRaTYauBW8yFATb/V1hEw=; h=Date:Mime-Version:Message-ID:Subject:From:To:Cc:Content-Type; b=sQ2RR7KoIipyNgrw7Olycyth/D9vdUIQ1RhfF2zo2BfCPdF3FANNhcsLIiRNOWKOkEpODKvcOOMCOBM1hfoR9rqRX/pyj9MOLnNHN6OFSNf4pvXFB360VaxKQimY0nq+4IZsiTDB/GhwrxM5yXqJhSW9HLiodoSmFbTPXAPIBLw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=McvBej4V; arc=none smtp.client-ip=209.85.210.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="McvBej4V" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-7b89c1ce9cfso11481883b3a.2 for ; Tue, 30 Dec 2025 12:59:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1767128391; x=1767733191; darn=vger.kernel.org; h=cc:to:from:subject:message-id:mime-version:date:reply-to:from:to:cc :subject:date:message-id:reply-to; bh=5nk5TvmPe83Os2b9bwchwqySErdfgrBx32d2v4ifhjQ=; b=McvBej4VUUB9Yb8J/modRXXzWV8LmbcxQSKiQuodrDUnkfifP/LgLthbW7Dv06Ciji 7reSgGEshmmQ0SP+0DBgOd9bhppRe8Y0xwEAiYf59l6di9asiZk2ctMScohyKNivL+ZH nt8o7MhgjFx4KUSgRvy8UWVAvJ3f5KvVvrHYeV+HMKnDFuvhHy04v2azdLPzRWzZy5UV w8uFNe5SDagiweQcax4EBdl33jXgrX6DopMy1fO3c7SAmoE7wsfV1nDH03qvCtYxmHEX 07MEUlnY1eg02vaycZjsMcFxkd8Dol1+TgpR9vONNvVU9ILQbJ0qyFQFDeGkEPGhPRqI hNzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767128391; x=1767733191; h=cc:to:from:subject:message-id:mime-version:date:reply-to :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=5nk5TvmPe83Os2b9bwchwqySErdfgrBx32d2v4ifhjQ=; b=QazfNpOIVi9jcBgDfYgsCs3PKjjQFlk8VmnIaWU+9dBsXvhx/k+EtMr5hq8PQ64C9n g8q8ynmxUqNF7htWqUrMBjm+ccHM9llBldyg0b0D4Jl1dlgMroNfDu6lUzsBQTjUArP9 QPBhuVWU4Tnc2dBbFONik2VWfFD/Tbul4HTYWwiR7R2NVes0QAmcsDyCI0YPc9/SINxU 9GzZaIOxO7/Ig5qB14y7+c/TEuh95d8GWKgFJ/RM8rcnSTDP2s3MgZ5Uhf7p4swfRcTU MuixZJpxRQMcXbz0+/uOqGRs93/tvq5Mjdkf+uEeedcWAqj6YUvRjAycdVn9IZ47ZRSm H17Q== X-Forwarded-Encrypted: i=1; AJvYcCVtry+D7HEeIMh5TnNk0T5lNWOXYIaPA4vz/xuCYp8huO75gdsqCXghheF8WlXF5s7QmGsg3nisuvVe/AI=@vger.kernel.org X-Gm-Message-State: AOJu0Yw1Yd0KLUkoNvobwuELI4hqevE9QkxD+6Nqg3zr3A/ZPdask7c1 KwENFczlSf1izG0ojXJRdBezdQHdnezWpP2kmngsb1GdT9vY0S4TrbsvLMVsVqdd3/AccBojNOi kGPcOHw== X-Google-Smtp-Source: AGHT+IGAuzn+m4gMdXThPs7O1JzbOAo+Q8is8e2w2bdDiH2qejYHd3LZNgFF858yE21dPAksD4Kjte1A2Ck= X-Received: from pfbfb38.prod.google.com ([2002:a05:6a00:2da6:b0:7c2:629c:5908]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:aa7:9a85:0:b0:7f7:398c:a855 with SMTP id d2e1a72fcca58-7ff65f789e1mr28943109b3a.39.1767128390969; Tue, 30 Dec 2025 12:59:50 -0800 (PST) Reply-To: Sean Christopherson Date: Tue, 30 Dec 2025 12:59:48 -0800 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 X-Mailer: git-send-email 2.52.0.351.gbe84eed79e-goog Message-ID: <20251230205948.4094097-1-seanjc@google.com> Subject: [PATCH] KVM: x86: Return "unsupported" instead of "invalid" on access to unsupported PV MSR From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 =3D=3D cpu->kvm_msr_buf->nmsrs' failed. Fixes: 66570e966dd9 ("kvm: x86: only provide PV features if enabled in gues= t's CPUID") Cc: stable@vger.kernel.org Signed-off-by: Sean Christopherson Reviewed-by: Jim Mattson --- arch/x86/kvm/x86.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index ff8812f3a129..dd0b5be1514d 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -4096,47 +4096,47 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struc= t msr_data *msr_info) break; case MSR_KVM_WALL_CLOCK_NEW: if (!guest_pv_has(vcpu, KVM_FEATURE_CLOCKSOURCE2)) - return 1; + return KVM_MSR_RET_UNSUPPORTED; =20 vcpu->kvm->arch.wall_clock =3D data; kvm_write_wall_clock(vcpu->kvm, data, 0); break; case MSR_KVM_WALL_CLOCK: if (!guest_pv_has(vcpu, KVM_FEATURE_CLOCKSOURCE)) - return 1; + return KVM_MSR_RET_UNSUPPORTED; =20 vcpu->kvm->arch.wall_clock =3D data; kvm_write_wall_clock(vcpu->kvm, data, 0); break; case MSR_KVM_SYSTEM_TIME_NEW: if (!guest_pv_has(vcpu, KVM_FEATURE_CLOCKSOURCE2)) - return 1; + return KVM_MSR_RET_UNSUPPORTED; =20 kvm_write_system_time(vcpu, data, false, msr_info->host_initiated); break; case MSR_KVM_SYSTEM_TIME: if (!guest_pv_has(vcpu, KVM_FEATURE_CLOCKSOURCE)) - return 1; + return KVM_MSR_RET_UNSUPPORTED; =20 kvm_write_system_time(vcpu, data, true, msr_info->host_initiated); break; case MSR_KVM_ASYNC_PF_EN: if (!guest_pv_has(vcpu, KVM_FEATURE_ASYNC_PF)) - return 1; + return KVM_MSR_RET_UNSUPPORTED; =20 if (kvm_pv_enable_async_pf(vcpu, data)) return 1; break; case MSR_KVM_ASYNC_PF_INT: if (!guest_pv_has(vcpu, KVM_FEATURE_ASYNC_PF_INT)) - return 1; + return KVM_MSR_RET_UNSUPPORTED; =20 if (kvm_pv_enable_async_pf_int(vcpu, data)) return 1; break; case MSR_KVM_ASYNC_PF_ACK: if (!guest_pv_has(vcpu, KVM_FEATURE_ASYNC_PF_INT)) - return 1; + return KVM_MSR_RET_UNSUPPORTED; if (data & 0x1) { /* * Pairs with the smp_mb__after_atomic() in @@ -4149,7 +4149,7 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct = msr_data *msr_info) break; case MSR_KVM_STEAL_TIME: if (!guest_pv_has(vcpu, KVM_FEATURE_STEAL_TIME)) - return 1; + return KVM_MSR_RET_UNSUPPORTED; =20 if (unlikely(!sched_info_on())) return 1; @@ -4167,7 +4167,7 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct = msr_data *msr_info) break; case MSR_KVM_PV_EOI_EN: if (!guest_pv_has(vcpu, KVM_FEATURE_PV_EOI)) - return 1; + return KVM_MSR_RET_UNSUPPORTED; =20 if (kvm_lapic_set_pv_eoi(vcpu, data, sizeof(u8))) return 1; @@ -4175,7 +4175,7 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct = msr_data *msr_info) =20 case MSR_KVM_POLL_CONTROL: if (!guest_pv_has(vcpu, KVM_FEATURE_POLL_CONTROL)) - return 1; + return KVM_MSR_RET_UNSUPPORTED; =20 /* only enable bit supported */ if (data & (-1ULL << 1)) @@ -4476,61 +4476,61 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, struc= t msr_data *msr_info) break; case MSR_KVM_WALL_CLOCK: if (!guest_pv_has(vcpu, KVM_FEATURE_CLOCKSOURCE)) - return 1; + return KVM_MSR_RET_UNSUPPORTED; =20 msr_info->data =3D vcpu->kvm->arch.wall_clock; break; case MSR_KVM_WALL_CLOCK_NEW: if (!guest_pv_has(vcpu, KVM_FEATURE_CLOCKSOURCE2)) - return 1; + return KVM_MSR_RET_UNSUPPORTED; =20 msr_info->data =3D vcpu->kvm->arch.wall_clock; break; case MSR_KVM_SYSTEM_TIME: if (!guest_pv_has(vcpu, KVM_FEATURE_CLOCKSOURCE)) - return 1; + return KVM_MSR_RET_UNSUPPORTED; =20 msr_info->data =3D vcpu->arch.time; break; case MSR_KVM_SYSTEM_TIME_NEW: if (!guest_pv_has(vcpu, KVM_FEATURE_CLOCKSOURCE2)) - return 1; + return KVM_MSR_RET_UNSUPPORTED; =20 msr_info->data =3D vcpu->arch.time; break; case MSR_KVM_ASYNC_PF_EN: if (!guest_pv_has(vcpu, KVM_FEATURE_ASYNC_PF)) - return 1; + return KVM_MSR_RET_UNSUPPORTED; =20 msr_info->data =3D vcpu->arch.apf.msr_en_val; break; case MSR_KVM_ASYNC_PF_INT: if (!guest_pv_has(vcpu, KVM_FEATURE_ASYNC_PF_INT)) - return 1; + return KVM_MSR_RET_UNSUPPORTED; =20 msr_info->data =3D vcpu->arch.apf.msr_int_val; break; case MSR_KVM_ASYNC_PF_ACK: if (!guest_pv_has(vcpu, KVM_FEATURE_ASYNC_PF_INT)) - return 1; + return KVM_MSR_RET_UNSUPPORTED; =20 msr_info->data =3D 0; break; case MSR_KVM_STEAL_TIME: if (!guest_pv_has(vcpu, KVM_FEATURE_STEAL_TIME)) - return 1; + return KVM_MSR_RET_UNSUPPORTED; =20 msr_info->data =3D vcpu->arch.st.msr_val; break; case MSR_KVM_PV_EOI_EN: if (!guest_pv_has(vcpu, KVM_FEATURE_PV_EOI)) - return 1; + return KVM_MSR_RET_UNSUPPORTED; =20 msr_info->data =3D vcpu->arch.pv_eoi.msr_val; break; case MSR_KVM_POLL_CONTROL: if (!guest_pv_has(vcpu, KVM_FEATURE_POLL_CONTROL)) - return 1; + return KVM_MSR_RET_UNSUPPORTED; =20 msr_info->data =3D vcpu->arch.msr_kvm_poll_control; break; base-commit: 9448598b22c50c8a5bb77a9103e2d49f134c9578 --=20 2.52.0.351.gbe84eed79e-goog