From nobody Mon Jun 8 15:36:51 2026 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.223.131]) (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 A3A713C3C00 for ; Thu, 28 May 2026 11:14:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=195.135.223.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779966849; cv=none; b=IYRrfmjiKjP3U5dFkw01RYqwxyj5z1WlvUrC4dfdwiFvXsqVzJS6kJgqcXwV4SjE/G4C1Q4shpN4I1rtD2VtSzRNlPTD20BYjntnh1vAz1UiY7RGCfCJehr8/P005kOrSPOrvYNlEISTN7NWVkI4RbA60tFGE7SIZy0JetAxvu4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779966849; c=relaxed/simple; bh=1mbzqhm3jy/Z0crtDf0D8EOqHaTPu3u7Z/3xM1xXZGc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DZ/5I0yJ0nDukB04touBaDQz6+nJC2dOlY6TdJ840HFTfiOUd+yQUouaCM5fp2FW7h8PcS/RBQA8IThRSZY9kIbabdSgvH2VP39Nzwi+3OMN3QFKjULWqYEFxRDVmvJAB2JuluQoSjhATtoJ1gAohZ0uN0maDvJeTpV8g5ceBP8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com; spf=pass smtp.mailfrom=suse.com; dkim=pass (1024-bit key) header.d=suse.com header.i=@suse.com header.b=p7pibjJY; dkim=pass (1024-bit key) header.d=suse.com header.i=@suse.com header.b=p7pibjJY; arc=none smtp.client-ip=195.135.223.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=suse.com header.i=@suse.com header.b="p7pibjJY"; dkim=pass (1024-bit key) header.d=suse.com header.i=@suse.com header.b="p7pibjJY" Received: from imap1.dmz-prg2.suse.org (unknown [10.150.64.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 9819166E88; Thu, 28 May 2026 11:14:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1779966845; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5DAIrNcZ6OVljSwBirP057gz50SAEW+xPSlSG6M1iNU=; b=p7pibjJY7EOyDxPjZYv0y1QDj95G0GVdOXf7vtRV1bR3U3YVci7q7dQc/LRavWoAbMlE7I AuFCj5MSfYV3iQrd7vUX4TlCc4o0EF8qOs6C4up26MAIaUlPsUb3+vuodWL+kg+25U6Xw2 CWl9wz4KAZxJoykNBJ/hMWyhCMSx82g= Authentication-Results: smtp-out2.suse.de; none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1779966845; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5DAIrNcZ6OVljSwBirP057gz50SAEW+xPSlSG6M1iNU=; b=p7pibjJY7EOyDxPjZYv0y1QDj95G0GVdOXf7vtRV1bR3U3YVci7q7dQc/LRavWoAbMlE7I AuFCj5MSfYV3iQrd7vUX4TlCc4o0EF8qOs6C4up26MAIaUlPsUb3+vuodWL+kg+25U6Xw2 CWl9wz4KAZxJoykNBJ/hMWyhCMSx82g= Received: from imap1.dmz-prg2.suse.org (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by imap1.dmz-prg2.suse.org (Postfix) with ESMTPS id 5832A5AD61; Thu, 28 May 2026 11:14:05 +0000 (UTC) Received: from dovecot-director2.suse.de ([2a07:de40:b281:106:10:150:64:167]) by imap1.dmz-prg2.suse.org with ESMTPSA id tNx0FH0jGGqrMgAAD6G6ig (envelope-from ); Thu, 28 May 2026 11:14:05 +0000 From: Juergen Gross To: linux-kernel@vger.kernel.org, x86@kernel.org, kvm@vger.kernel.org Cc: Juergen Gross , Sean Christopherson , Paolo Bonzini , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" Subject: [PATCH v2 1/5] KVM/x86: Change comment before KVM_MSR_RET_* defines Date: Thu, 28 May 2026 13:13:53 +0200 Message-ID: <20260528111357.264809-2-jgross@suse.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260528111357.264809-1-jgross@suse.com> References: <20260528111357.264809-1-jgross@suse.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Spam-Flag: NO X-Spam-Score: -2.80 X-Spam-Level: X-Spamd-Result: default: False [-2.80 / 50.00]; BAYES_HAM(-3.00)[100.00%]; MID_CONTAINS_FROM(1.00)[]; NEURAL_HAM_LONG(-1.00)[-1.000]; R_MISSING_CHARSET(0.50)[]; NEURAL_HAM_SHORT(-0.20)[-1.000]; MIME_GOOD(-0.10)[text/plain]; TO_MATCH_ENVRCPT_ALL(0.00)[]; ARC_NA(0.00)[]; RCVD_VIA_SMTP_AUTH(0.00)[]; FROM_HAS_DN(0.00)[]; MIME_TRACE(0.00)[0:+]; DBL_BLOCKED_OPENRESOLVER(0.00)[imap1.dmz-prg2.suse.org:helo,suse.com:email,suse.com:mid]; FUZZY_RATELIMITED(0.00)[rspamd.com]; RCPT_COUNT_SEVEN(0.00)[11]; RCVD_COUNT_TWO(0.00)[2]; FROM_EQ_ENVFROM(0.00)[]; DKIM_SIGNED(0.00)[suse.com:s=susede1]; TO_DN_SOME(0.00)[]; RCVD_TLS_ALL(0.00)[] Content-Type: text/plain; charset="utf-8" For MSR emulation return values only 2 special cases have defines, while the most used values 0 and 1 don't. Reason seems to be the maze of function calls of MSR emulation intertwined with the KVM guest exit handlers, which are using the values 0 and 1 for other purposes. This even led to the comment above the already existing defines, warning to use the values 0 and 1 (and negative errno values) in the MSR emulation at all. Fact is that MSR emulation and exit handlers are in fact rather well distinct, with only very few exceptions which are handled in a sane way. Negative errno values and 0 are fine to be used, while the value "1" is just used for unspecific error cases. Drop the warning comment part, as it is just plainly wrong. Replace it with a statement that it is fine to use negative errno values, 0, and the special MSR emulation return values defined. Don't mention the value "1", as current cases where MSR emulation is returning "1" should be modified to return a negative errno value instead. No change of functionality intended. Signed-off-by: Juergen Gross --- V2: - instead of defining new return value macros, adapt the comment --- arch/x86/kvm/x86.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/x86/kvm/x86.h b/arch/x86/kvm/x86.h index 38a905fa86de..5ca2f3d44092 100644 --- a/arch/x86/kvm/x86.h +++ b/arch/x86/kvm/x86.h @@ -675,8 +675,8 @@ enum kvm_msr_access { /* * Internal error codes that are used to indicate that MSR emulation encou= ntered * an error that should result in #GP in the guest, unless userspace handl= es it. - * Note, '1', '0', and negative numbers are off limits, as they are used b= y KVM - * as part of KVM's lightly documented internal KVM_RUN return codes. + * Other than these internal error codes negative errno values can be used= for + * error cases, or 0 for success. * * UNSUPPORTED - The MSR isn't supported, either because it is completely * unknown to KVM, or because the MSR should not exist according --=20 2.54.0 From nobody Mon Jun 8 15:36:51 2026 Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.223.130]) (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 EA9A03D5236 for ; Thu, 28 May 2026 11:14:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=195.135.223.130 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779966854; cv=none; b=Qa4gK1C5P5WxrTgnwV8S0m+Ahuqu6zMjOXq/izmFDSwY0z0zpFnnppT1OESW6dT0nfsecqnyi85BTmlRT5vjrULBnRgjYrpAiYiHokQpk1VHYxFCDCagwHHZMWxQUOTyq/acC9VojVZxSwq/3dzGWvtP0h6Ef1qGHb76q4uHYNg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779966854; c=relaxed/simple; bh=c/BRJrvMgUknobRNXd28o9C5+IkXCI0PYo28UU2pMjQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=H383OFPLx6+jBVs2o46U4tQj/+GWRK18e33rDUhGm07T/z6ZVnm7De3yjLl3CExO34IaHSlbIOaXOwNGzSYCjtUjHpyrERWkIxnbOsRjUxTXYauVIJgjrGMTnIpN+RETGnrq3JM/aNdGtF5xlJYNnaEzaaCHCicQLNM839D60fc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com; spf=pass smtp.mailfrom=suse.com; dkim=pass (1024-bit key) header.d=suse.com header.i=@suse.com header.b=jaGEgGbi; dkim=pass (1024-bit key) header.d=suse.com header.i=@suse.com header.b=jaGEgGbi; arc=none smtp.client-ip=195.135.223.130 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=suse.com header.i=@suse.com header.b="jaGEgGbi"; dkim=pass (1024-bit key) header.d=suse.com header.i=@suse.com header.b="jaGEgGbi" Received: from imap1.dmz-prg2.suse.org (unknown [10.150.64.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 2E30C6AF84; Thu, 28 May 2026 11:14:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1779966851; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=JU89tIdDGXTvPA6XgNNbGU8kkEGJwcqIu1wdTgG/MTQ=; b=jaGEgGbiKEXzvW6QDKuu4Mf2S6te0IozNoWU6DxAlXUiQXHARY/+V8wW0yFqYWJoQ+OJ6D L/zM7za75gApjQ02N7v5Sd41m5vBnQL95lGqUrPjxmO6gqxVISTvy/wmPKjkzpdhZZjM8/ MJwcGf2oRkiabgqlwe5EFnN8nIhNxO0= Authentication-Results: smtp-out1.suse.de; none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1779966851; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=JU89tIdDGXTvPA6XgNNbGU8kkEGJwcqIu1wdTgG/MTQ=; b=jaGEgGbiKEXzvW6QDKuu4Mf2S6te0IozNoWU6DxAlXUiQXHARY/+V8wW0yFqYWJoQ+OJ6D L/zM7za75gApjQ02N7v5Sd41m5vBnQL95lGqUrPjxmO6gqxVISTvy/wmPKjkzpdhZZjM8/ MJwcGf2oRkiabgqlwe5EFnN8nIhNxO0= Received: from imap1.dmz-prg2.suse.org (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by imap1.dmz-prg2.suse.org (Postfix) with ESMTPS id E2D505AD61; Thu, 28 May 2026 11:14:10 +0000 (UTC) Received: from dovecot-director2.suse.de ([2a07:de40:b281:106:10:150:64:167]) by imap1.dmz-prg2.suse.org with ESMTPSA id weZNNoIjGGq7MgAAD6G6ig (envelope-from ); Thu, 28 May 2026 11:14:10 +0000 From: Juergen Gross To: linux-kernel@vger.kernel.org, x86@kernel.org, kvm@vger.kernel.org Cc: Juergen Gross , Sean Christopherson , Paolo Bonzini , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" Subject: [PATCH v2 2/5] KVM/x86: Return -errno instead of "1" for APIC related MSR emulation Date: Thu, 28 May 2026 13:13:54 +0200 Message-ID: <20260528111357.264809-3-jgross@suse.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260528111357.264809-1-jgross@suse.com> References: <20260528111357.264809-1-jgross@suse.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Spam-Flag: NO X-Spam-Score: -2.80 X-Spam-Level: X-Spamd-Result: default: False [-2.80 / 50.00]; BAYES_HAM(-3.00)[100.00%]; MID_CONTAINS_FROM(1.00)[]; NEURAL_HAM_LONG(-1.00)[-1.000]; R_MISSING_CHARSET(0.50)[]; NEURAL_HAM_SHORT(-0.20)[-1.000]; MIME_GOOD(-0.10)[text/plain]; TO_MATCH_ENVRCPT_ALL(0.00)[]; ARC_NA(0.00)[]; RCVD_VIA_SMTP_AUTH(0.00)[]; FROM_HAS_DN(0.00)[]; MIME_TRACE(0.00)[0:+]; DBL_BLOCKED_OPENRESOLVER(0.00)[suse.com:email,suse.com:mid,imap1.dmz-prg2.suse.org:helo]; FUZZY_RATELIMITED(0.00)[rspamd.com]; RCPT_COUNT_SEVEN(0.00)[11]; RCVD_COUNT_TWO(0.00)[2]; FROM_EQ_ENVFROM(0.00)[]; DKIM_SIGNED(0.00)[suse.com:s=susede1]; TO_DN_SOME(0.00)[]; RCVD_TLS_ALL(0.00)[] Content-Type: text/plain; charset="utf-8" Instead of a literal "1" for signalling an error, use a negative errno value in the emulation code of APIC related MSR registers. Remove some not needed braces. Signed-off-by: Juergen Gross --- V2: - use -errno instead of KVM_MSR_RET_ERR --- arch/x86/kvm/lapic.c | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 4078e624ca66..3e7d83db2f7a 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -2412,11 +2412,10 @@ static int kvm_lapic_reg_write(struct kvm_lapic *ap= ic, u32 reg, u32 val) =20 switch (reg) { case APIC_ID: /* Local APIC ID */ - if (!apic_x2apic_mode(apic)) { + if (!apic_x2apic_mode(apic)) kvm_apic_set_xapic_id(apic, val >> 24); - } else { - ret =3D 1; - } + else + ret =3D -EINVAL; break; =20 case APIC_TASKPRI: @@ -2432,14 +2431,14 @@ static int kvm_lapic_reg_write(struct kvm_lapic *ap= ic, u32 reg, u32 val) if (!apic_x2apic_mode(apic)) kvm_apic_set_ldr(apic, val & APIC_LDR_MASK); else - ret =3D 1; + ret =3D -EINVAL; break; =20 case APIC_DFR: if (!apic_x2apic_mode(apic)) kvm_apic_set_dfr(apic, val | 0x0FFFFFFF); else - ret =3D 1; + ret =3D -EINVAL; break; =20 case APIC_SPIV: { @@ -2470,7 +2469,7 @@ static int kvm_lapic_reg_write(struct kvm_lapic *apic= , u32 reg, u32 val) break; case APIC_ICR2: if (apic_x2apic_mode(apic)) - ret =3D 1; + ret =3D -EINVAL; else kvm_lapic_set_reg(apic, APIC_ICR2, val & 0xff000000); break; @@ -2485,7 +2484,7 @@ static int kvm_lapic_reg_write(struct kvm_lapic *apic= , u32 reg, u32 val) case APIC_LVTCMCI: { u32 index =3D get_lvt_index(reg); if (!kvm_lapic_lvt_supported(apic, index)) { - ret =3D 1; + ret =3D -EINVAL; break; } if (!kvm_apic_sw_enabled(apic)) @@ -2527,7 +2526,7 @@ static int kvm_lapic_reg_write(struct kvm_lapic *apic= , u32 reg, u32 val) } case APIC_ESR: if (apic_x2apic_mode(apic) && val !=3D 0) - ret =3D 1; + ret =3D -EINVAL; break; =20 case APIC_SELF_IPI: @@ -2536,12 +2535,12 @@ static int kvm_lapic_reg_write(struct kvm_lapic *ap= ic, u32 reg, u32 val) * the vector, everything else is reserved. */ if (!apic_x2apic_mode(apic) || (val & ~APIC_VECTOR_MASK)) - ret =3D 1; + ret =3D -EINVAL; else kvm_apic_send_ipi(apic, APIC_DEST_SELF | val, 0); break; default: - ret =3D 1; + ret =3D -EINVAL; break; } =20 @@ -2599,7 +2598,7 @@ EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_lapic_set_eoi); static int __kvm_x2apic_icr_write(struct kvm_lapic *apic, u64 data, bool f= ast) { if (data & X2APIC_ICR_RESERVED_BITS) - return 1; + return -EINVAL; =20 /* * The BUSY bit is reserved on both Intel and AMD in x2APIC mode, but @@ -2804,12 +2803,12 @@ int kvm_apic_set_base(struct kvm_vcpu *vcpu, u64 va= lue, bool host_initiated) (guest_cpu_cap_has(vcpu, X86_FEATURE_X2APIC) ? 0 : X2APIC_ENABLE); =20 if ((value & reserved_bits) !=3D 0 || new_mode =3D=3D LAPIC_MODE_INVALID) - return 1; + return -EINVAL; if (!host_initiated) { if (old_mode =3D=3D LAPIC_MODE_X2APIC && new_mode =3D=3D LAPIC_MODE_XAPI= C) return 1; if (old_mode =3D=3D LAPIC_MODE_DISABLED && new_mode =3D=3D LAPIC_MODE_X2= APIC) - return 1; + return -EINVAL; } =20 __kvm_apic_set_base(vcpu, value); @@ -3438,7 +3437,7 @@ static int kvm_lapic_msr_read(struct kvm_lapic *apic,= u32 reg, u64 *data) } =20 if (kvm_lapic_reg_read(apic, reg, 4, &low)) - return 1; + return -EINVAL; =20 *data =3D low; =20 @@ -3457,7 +3456,7 @@ static int kvm_lapic_msr_write(struct kvm_lapic *apic= , u32 reg, u64 data) =20 /* Bits 63:32 are reserved in all other registers. */ if (data >> 32) - return 1; + return -EINVAL; =20 return kvm_lapic_reg_write(apic, reg, (u32)data); } @@ -3468,7 +3467,7 @@ int kvm_x2apic_msr_write(struct kvm_vcpu *vcpu, u32 m= sr, u64 data) u32 reg =3D (msr - APIC_BASE_MSR) << 4; =20 if (!lapic_in_kernel(vcpu) || !apic_x2apic_mode(apic)) - return 1; + return -EINVAL; =20 return kvm_lapic_msr_write(apic, reg, data); } @@ -3479,7 +3478,7 @@ int kvm_x2apic_msr_read(struct kvm_vcpu *vcpu, u32 ms= r, u64 *data) u32 reg =3D (msr - APIC_BASE_MSR) << 4; =20 if (!lapic_in_kernel(vcpu) || !apic_x2apic_mode(apic)) - return 1; + return -EINVAL; =20 return kvm_lapic_msr_read(apic, reg, data); } @@ -3487,7 +3486,7 @@ int kvm_x2apic_msr_read(struct kvm_vcpu *vcpu, u32 ms= r, u64 *data) int kvm_hv_vapic_msr_write(struct kvm_vcpu *vcpu, u32 reg, u64 data) { if (!lapic_in_kernel(vcpu)) - return 1; + return -EINVAL; =20 return kvm_lapic_msr_write(vcpu->arch.apic, reg, data); } @@ -3495,7 +3494,7 @@ int kvm_hv_vapic_msr_write(struct kvm_vcpu *vcpu, u32= reg, u64 data) int kvm_hv_vapic_msr_read(struct kvm_vcpu *vcpu, u32 reg, u64 *data) { if (!lapic_in_kernel(vcpu)) - return 1; + return -EINVAL; =20 return kvm_lapic_msr_read(vcpu->arch.apic, reg, data); } --=20 2.54.0 From nobody Mon Jun 8 15:36:51 2026 Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.223.130]) (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 C178B3D6484 for ; Thu, 28 May 2026 11:14:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=195.135.223.130 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779966860; cv=none; b=NW9OedOk4XCcKo8FPXe5oASOfpbZOz+w5AqGrwHzHRQ01O9C6uqlXhZ4TPfl7izFbl8XTLOKrTheD+ims3zssUK3O5jtjBK1wHdcHSMuD3tYl4nNAZ4OUDD7xfTQOnGiLfCyqfkZFLFdXEV4RPT7VBgXCdGANiWT70nGPhqu1Qo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779966860; c=relaxed/simple; bh=gttg+5qAZWEFQqYHVSIcofNzP8HUzFyz3hUN7CUc1Sw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=W9Y87QBwCXwVfYOHfYgt+KkuVTF2sogdRiUJSJDffLpdjNiNJv/D1BcDz+6I7sztYuObsxyQJCNlHQW/F2MnMo+eZQD4jACqPxAsJsnZOIJ7rNBFPuz6qoKrBBPkM/lmubIs5dom0qlugvM+JkHZvDQ0A8xMswIfyesdf7FIbJE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com; spf=pass smtp.mailfrom=suse.com; dkim=pass (1024-bit key) header.d=suse.com header.i=@suse.com header.b=re0Z+s8h; dkim=pass (1024-bit key) header.d=suse.com header.i=@suse.com header.b=re0Z+s8h; arc=none smtp.client-ip=195.135.223.130 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=suse.com header.i=@suse.com header.b="re0Z+s8h"; dkim=pass (1024-bit key) header.d=suse.com header.i=@suse.com header.b="re0Z+s8h" Received: from imap1.dmz-prg2.suse.org (unknown [10.150.64.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id BC5CE6AFDC; Thu, 28 May 2026 11:14:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1779966856; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=lphgc/lXXbp5mVkKaVPjsuOLrtCq7NDy9by+xJzbl7M=; b=re0Z+s8hAf6H3dxwNblF6c4jK3mUQFYoN3wd2covSfMzagX8AxYy5ubcXe/kJg/pxB0XSf m3zQpMEieuDvVDcoGlcPVhVarJ8T3KPYLcdb5nJfrWuAza6Pgk/PKRNbyKTj6n9dqRJ7kk pTBbH4k/m6iqaoj34PLei2W6QuFAn0o= Authentication-Results: smtp-out1.suse.de; none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1779966856; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=lphgc/lXXbp5mVkKaVPjsuOLrtCq7NDy9by+xJzbl7M=; b=re0Z+s8hAf6H3dxwNblF6c4jK3mUQFYoN3wd2covSfMzagX8AxYy5ubcXe/kJg/pxB0XSf m3zQpMEieuDvVDcoGlcPVhVarJ8T3KPYLcdb5nJfrWuAza6Pgk/PKRNbyKTj6n9dqRJ7kk pTBbH4k/m6iqaoj34PLei2W6QuFAn0o= Received: from imap1.dmz-prg2.suse.org (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by imap1.dmz-prg2.suse.org (Postfix) with ESMTPS id 77C2E5AD61; Thu, 28 May 2026 11:14:16 +0000 (UTC) Received: from dovecot-director2.suse.de ([2a07:de40:b281:106:10:150:64:167]) by imap1.dmz-prg2.suse.org with ESMTPSA id UBMsHIgjGGrEMgAAD6G6ig (envelope-from ); Thu, 28 May 2026 11:14:16 +0000 From: Juergen Gross To: linux-kernel@vger.kernel.org, x86@kernel.org, kvm@vger.kernel.org Cc: Juergen Gross , Vitaly Kuznetsov , Sean Christopherson , Paolo Bonzini , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" Subject: [PATCH v2 3/5] KVM/x86: Return -errno instead of "1" for Hyper-V related MSR emulation Date: Thu, 28 May 2026 13:13:55 +0200 Message-ID: <20260528111357.264809-4-jgross@suse.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260528111357.264809-1-jgross@suse.com> References: <20260528111357.264809-1-jgross@suse.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Spam-Level: X-Spam-Score: -2.80 X-Spam-Flag: NO X-Spamd-Result: default: False [-2.80 / 50.00]; BAYES_HAM(-3.00)[100.00%]; MID_CONTAINS_FROM(1.00)[]; NEURAL_HAM_LONG(-1.00)[-1.000]; R_MISSING_CHARSET(0.50)[]; NEURAL_HAM_SHORT(-0.20)[-1.000]; MIME_GOOD(-0.10)[text/plain]; FUZZY_RATELIMITED(0.00)[rspamd.com]; TO_MATCH_ENVRCPT_ALL(0.00)[]; RCPT_COUNT_TWELVE(0.00)[12]; DKIM_SIGNED(0.00)[suse.com:s=susede1]; MIME_TRACE(0.00)[0:+]; ARC_NA(0.00)[]; RCVD_TLS_ALL(0.00)[]; R_RATELIMIT(0.00)[to_ip_from(RLfdszjqhz8kzzb9uwpzdm8png)]; FROM_HAS_DN(0.00)[]; TO_DN_SOME(0.00)[]; FROM_EQ_ENVFROM(0.00)[]; RCVD_VIA_SMTP_AUTH(0.00)[]; RCVD_COUNT_TWO(0.00)[2]; DBL_BLOCKED_OPENRESOLVER(0.00)[suse.com:email,suse.com:mid,imap1.dmz-prg2.suse.org:helo] Content-Type: text/plain; charset="utf-8" Instead of a literal "1" for signalling an error, use a negative errno value in the emulation code of Hyper-V related MSR registers. Signed-off-by: Juergen Gross --- V2: - use -errno instead of KVM_MSR_RET_ERR --- arch/x86/kvm/hyperv.c | 72 +++++++++++++++++++++---------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c index 4438ecac9a89..809752a6d0ac 100644 --- a/arch/x86/kvm/hyperv.c +++ b/arch/x86/kvm/hyperv.c @@ -167,7 +167,7 @@ static int synic_set_sint(struct kvm_vcpu_hv_synic *syn= ic, int sint, * allow zero-initing the register from host as well. */ if (vector < HV_SYNIC_FIRST_VALID_VECTOR && !host && !masked) - return 1; + return -EINVAL; /* * Guest may configure multiple SINTs to use the same vector, so * we maintain a bitmap of vectors handled by synic, and a @@ -263,7 +263,7 @@ static int synic_set_msr(struct kvm_vcpu_hv_synic *syni= c, int ret; =20 if (!synic->active && (!host || data)) - return 1; + return -EINVAL; =20 trace_kvm_hv_synic_set_msr(vcpu->vcpu_id, msr, data, host); =20 @@ -276,7 +276,7 @@ static int synic_set_msr(struct kvm_vcpu_hv_synic *syni= c, break; case HV_X64_MSR_SVERSION: if (!host) { - ret =3D 1; + ret =3D -EINVAL; break; } synic->version =3D data; @@ -286,7 +286,7 @@ static int synic_set_msr(struct kvm_vcpu_hv_synic *syni= c, !synic->dont_zero_synic_pages) if (kvm_clear_guest(vcpu->kvm, data & PAGE_MASK, PAGE_SIZE)) { - ret =3D 1; + ret =3D -EFAULT; break; } synic->evt_page =3D data; @@ -298,7 +298,7 @@ static int synic_set_msr(struct kvm_vcpu_hv_synic *syni= c, !synic->dont_zero_synic_pages) if (kvm_clear_guest(vcpu->kvm, data & PAGE_MASK, PAGE_SIZE)) { - ret =3D 1; + ret =3D -EFAULT; break; } synic->msg_page =3D data; @@ -319,7 +319,7 @@ static int synic_set_msr(struct kvm_vcpu_hv_synic *syni= c, ret =3D synic_set_sint(synic, msr - HV_X64_MSR_SINT0, data, host); break; default: - ret =3D 1; + ret =3D -EINVAL; break; } return ret; @@ -365,7 +365,7 @@ static int syndbg_set_msr(struct kvm_vcpu *vcpu, u32 ms= r, u64 data, bool host) struct kvm_hv_syndbg *syndbg =3D to_hv_syndbg(vcpu); =20 if (!kvm_hv_is_syndbg_enabled(vcpu) && !host) - return 1; + return -EINVAL; =20 trace_kvm_hv_syndbg_set_msr(vcpu->vcpu_id, to_hv_vcpu(vcpu)->vp_index, msr, data); @@ -404,7 +404,7 @@ static int syndbg_get_msr(struct kvm_vcpu *vcpu, u32 ms= r, u64 *pdata, bool host) struct kvm_hv_syndbg *syndbg =3D to_hv_syndbg(vcpu); =20 if (!kvm_hv_is_syndbg_enabled(vcpu) && !host) - return 1; + return -EINVAL; =20 switch (msr) { case HV_X64_MSR_SYNDBG_CONTROL: @@ -440,7 +440,7 @@ static int synic_get_msr(struct kvm_vcpu_hv_synic *syni= c, u32 msr, u64 *pdata, int ret; =20 if (!synic->active && !host) - return 1; + return -EINVAL; =20 ret =3D 0; switch (msr) { @@ -463,7 +463,7 @@ static int synic_get_msr(struct kvm_vcpu_hv_synic *syni= c, u32 msr, u64 *pdata, *pdata =3D atomic64_read(&synic->sint[msr - HV_X64_MSR_SINT0]); break; default: - ret =3D 1; + ret =3D -EINVAL; break; } return ret; @@ -695,12 +695,12 @@ static int stimer_set_config(struct kvm_vcpu_hv_stime= r *stimer, u64 config, struct kvm_vcpu_hv_synic *synic =3D to_hv_synic(vcpu); =20 if (!synic->active && (!host || config)) - return 1; + return -EINVAL; =20 if (unlikely(!host && hv_vcpu->enforce_cpuid && new_config.direct_mode && !(hv_vcpu->cpuid_cache.features_edx & HV_STIMER_DIRECT_MODE_AVAILABLE))) - return 1; + return -EINVAL; =20 trace_kvm_hv_stimer_set_config(hv_stimer_to_vcpu(stimer)->vcpu_id, stimer->index, config, host); @@ -724,7 +724,7 @@ static int stimer_set_count(struct kvm_vcpu_hv_stimer *= stimer, u64 count, struct kvm_vcpu_hv_synic *synic =3D to_hv_synic(vcpu); =20 if (!synic->active && (!host || count)) - return 1; + return -EINVAL; =20 trace_kvm_hv_stimer_set_count(hv_stimer_to_vcpu(stimer)->vcpu_id, stimer->index, count, host); @@ -1380,7 +1380,7 @@ static int kvm_hv_set_msr_pw(struct kvm_vcpu *vcpu, u= 32 msr, u64 data, struct kvm_hv *hv =3D to_kvm_hv(kvm); =20 if (unlikely(!host && !hv_check_msr_access(to_hv_vcpu(vcpu), msr))) - return 1; + return -EINVAL; =20 switch (msr) { case HV_X64_MSR_GUEST_OS_ID: @@ -1476,23 +1476,23 @@ static int kvm_hv_set_msr_pw(struct kvm_vcpu *vcpu,= u32 msr, u64 data, break; case HV_X64_MSR_TSC_EMULATION_STATUS: if (data && !host) - return 1; + return -EINVAL; =20 hv->hv_tsc_emulation_status =3D data; break; case HV_X64_MSR_TIME_REF_COUNT: /* read-only, but still ignore it if host-initiated */ if (!host) - return 1; + return -EINVAL; break; case HV_X64_MSR_TSC_INVARIANT_CONTROL: /* Only bit 0 is supported */ if (data & ~HV_EXPOSE_INVARIANT_TSC) - return 1; + return -EINVAL; =20 /* The feature can't be disabled from the guest */ if (!host && hv->hv_invtsc_control && !data) - return 1; + return -EINVAL; =20 hv->hv_invtsc_control =3D data; break; @@ -1501,7 +1501,7 @@ static int kvm_hv_set_msr_pw(struct kvm_vcpu *vcpu, u= 32 msr, u64 data, return syndbg_set_msr(vcpu, msr, data, host); default: kvm_pr_unimpl_wrmsr(vcpu, msr, data); - return 1; + return -EINVAL; } return 0; } @@ -1521,7 +1521,7 @@ static int kvm_hv_set_msr(struct kvm_vcpu *vcpu, u32 = msr, u64 data, bool host) struct kvm_vcpu_hv *hv_vcpu =3D to_hv_vcpu(vcpu); =20 if (unlikely(!host && !hv_check_msr_access(hv_vcpu, msr))) - return 1; + return -EINVAL; =20 switch (msr) { case HV_X64_MSR_VP_INDEX: { @@ -1529,7 +1529,7 @@ static int kvm_hv_set_msr(struct kvm_vcpu *vcpu, u32 = msr, u64 data, bool host) u32 new_vp_index =3D (u32)data; =20 if (!host || new_vp_index >=3D KVM_MAX_VCPUS) - return 1; + return -EINVAL; =20 if (new_vp_index =3D=3D hv_vcpu->vp_index) return 0; @@ -1555,13 +1555,13 @@ static int kvm_hv_set_msr(struct kvm_vcpu *vcpu, u3= 2 msr, u64 data, bool host) if (!(data & HV_X64_MSR_VP_ASSIST_PAGE_ENABLE)) { hv_vcpu->hv_vapic =3D data; if (kvm_lapic_set_pv_eoi(vcpu, 0, 0)) - return 1; + return -EINVAL; break; } gfn =3D data >> HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_SHIFT; addr =3D kvm_vcpu_gfn_to_hva(vcpu, gfn); if (kvm_is_error_hva(addr)) - return 1; + return -EINVAL; =20 /* * Clear apic_assist portion of struct hv_vp_assist_page @@ -1569,13 +1569,13 @@ static int kvm_hv_set_msr(struct kvm_vcpu *vcpu, u3= 2 msr, u64 data, bool host) * to be preserved e.g. on migration. */ if (put_user(0, (u32 __user *)addr)) - return 1; + return -EFAULT; hv_vcpu->hv_vapic =3D data; kvm_vcpu_mark_page_dirty(vcpu, gfn); if (kvm_lapic_set_pv_eoi(vcpu, gfn_to_gpa(gfn) | KVM_MSR_ENABLED, sizeof(struct hv_vp_assist_page))) - return 1; + return -EINVAL; break; } case HV_X64_MSR_EOI: @@ -1586,7 +1586,7 @@ static int kvm_hv_set_msr(struct kvm_vcpu *vcpu, u32 = msr, u64 data, bool host) return kvm_hv_vapic_msr_write(vcpu, APIC_TASKPRI, data); case HV_X64_MSR_VP_RUNTIME: if (!host) - return 1; + return -EINVAL; hv_vcpu->runtime_offset =3D data - current_task_runtime_100ns(); break; case HV_X64_MSR_SCONTROL: @@ -1618,11 +1618,11 @@ static int kvm_hv_set_msr(struct kvm_vcpu *vcpu, u3= 2 msr, u64 data, bool host) case HV_X64_MSR_APIC_FREQUENCY: /* read-only, but still ignore it if host-initiated */ if (!host) - return 1; + return -EINVAL; break; default: kvm_pr_unimpl_wrmsr(vcpu, msr, data); - return 1; + return -EINVAL; } =20 return 0; @@ -1636,7 +1636,7 @@ static int kvm_hv_get_msr_pw(struct kvm_vcpu *vcpu, u= 32 msr, u64 *pdata, struct kvm_hv *hv =3D to_kvm_hv(kvm); =20 if (unlikely(!host && !hv_check_msr_access(to_hv_vcpu(vcpu), msr))) - return 1; + return -EINVAL; =20 switch (msr) { case HV_X64_MSR_GUEST_OS_ID: @@ -1677,7 +1677,7 @@ static int kvm_hv_get_msr_pw(struct kvm_vcpu *vcpu, u= 32 msr, u64 *pdata, return syndbg_get_msr(vcpu, msr, pdata, host); default: kvm_pr_unimpl_rdmsr(vcpu, msr); - return 1; + return -EINVAL; } =20 *pdata =3D data; @@ -1691,7 +1691,7 @@ static int kvm_hv_get_msr(struct kvm_vcpu *vcpu, u32 = msr, u64 *pdata, struct kvm_vcpu_hv *hv_vcpu =3D to_hv_vcpu(vcpu); =20 if (unlikely(!host && !hv_check_msr_access(hv_vcpu, msr))) - return 1; + return -EINVAL; =20 switch (msr) { case HV_X64_MSR_VP_INDEX: @@ -1743,7 +1743,7 @@ static int kvm_hv_get_msr(struct kvm_vcpu *vcpu, u32 = msr, u64 *pdata, break; default: kvm_pr_unimpl_rdmsr(vcpu, msr); - return 1; + return -EINVAL; } *pdata =3D data; return 0; @@ -1754,10 +1754,10 @@ int kvm_hv_set_msr_common(struct kvm_vcpu *vcpu, u3= 2 msr, u64 data, bool host) struct kvm_hv *hv =3D to_kvm_hv(vcpu->kvm); =20 if (!host && !vcpu->arch.hyperv_enabled) - return 1; + return -EINVAL; =20 if (kvm_hv_vcpu_init(vcpu)) - return 1; + return -EINVAL; =20 if (kvm_hv_msr_partition_wide(msr)) { int r; @@ -1775,10 +1775,10 @@ int kvm_hv_get_msr_common(struct kvm_vcpu *vcpu, u3= 2 msr, u64 *pdata, bool host) struct kvm_hv *hv =3D to_kvm_hv(vcpu->kvm); =20 if (!host && !vcpu->arch.hyperv_enabled) - return 1; + return -EINVAL; =20 if (kvm_hv_vcpu_init(vcpu)) - return 1; + return -EINVAL; =20 if (kvm_hv_msr_partition_wide(msr)) { int r; --=20 2.54.0 From nobody Mon Jun 8 15:36:51 2026 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.223.131]) (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 6491E3E0C61 for ; Thu, 28 May 2026 11:14:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=195.135.223.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779966866; cv=none; b=Cl8JoYcxiG6dvAD+xsTibChf2ZDTeUcMLLUBzpJiKkO2oMDqcQur2p+05FLEyLc+qrBufS4oC4pb3udPJ4Wko6KkvTRHhZWNLq6ZJMHA1B/iPdRePbLt6jaEdpZo4Ji3Gt/KFOAYkKXPv9APzDF2Edy1x3+Kf4cko7DrFZ+j44I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779966866; c=relaxed/simple; bh=m9d+7c85/6AA7n1Y3SufmsyrJZT30Ju59L4xiYM0eEA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AcfJVzwicqgbQLlqozKrufHqwAd5BnJX0Kl9qOsjRDNk3beRGsDsHYdNECyhXaFVwlvhXe5LCAXUBR/UtRLKte0MFLxbBpU0xeOEtwsinPcSYGzvDx+iOB0qNxuxu4yHCd3NLlExbY/BUDRf20R8q/Jx5V8Mm2kg9CQfKu8VnVA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com; spf=pass smtp.mailfrom=suse.com; dkim=pass (1024-bit key) header.d=suse.com header.i=@suse.com header.b=EoopqUq1; dkim=pass (1024-bit key) header.d=suse.com header.i=@suse.com header.b=EoopqUq1; arc=none smtp.client-ip=195.135.223.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=suse.com header.i=@suse.com header.b="EoopqUq1"; dkim=pass (1024-bit key) header.d=suse.com header.i=@suse.com header.b="EoopqUq1" Received: from imap1.dmz-prg2.suse.org (imap1.dmz-prg2.suse.org [IPv6:2a07:de40:b281:104:10:150:64:97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 606BE66E71; Thu, 28 May 2026 11:14:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1779966862; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=oEeoYf36DgkNjRbVgvgO3600/eMNP6CHaFTWurqUvl4=; b=EoopqUq1/HALCKZBzKSd+hIjSDB7hc7w6sXcAq1ZVUhaxBvXGWSxljBv6xPTPgrG4jBob3 wv8rw/YWfTljSpJIeE2u/CHLXomud5/Q5EHQ1wiPtyKuZ69Duojzmv19nAJ4yv5A0hRRtd ss3j+wpOIConwaVWuDC1/fSXwdip2gE= Authentication-Results: smtp-out2.suse.de; dkim=pass header.d=suse.com header.s=susede1 header.b=EoopqUq1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1779966862; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=oEeoYf36DgkNjRbVgvgO3600/eMNP6CHaFTWurqUvl4=; b=EoopqUq1/HALCKZBzKSd+hIjSDB7hc7w6sXcAq1ZVUhaxBvXGWSxljBv6xPTPgrG4jBob3 wv8rw/YWfTljSpJIeE2u/CHLXomud5/Q5EHQ1wiPtyKuZ69Duojzmv19nAJ4yv5A0hRRtd ss3j+wpOIConwaVWuDC1/fSXwdip2gE= Received: from imap1.dmz-prg2.suse.org (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by imap1.dmz-prg2.suse.org (Postfix) with ESMTPS id 1273A5AD61; Thu, 28 May 2026 11:14:22 +0000 (UTC) Received: from dovecot-director2.suse.de ([2a07:de40:b281:106:10:150:64:167]) by imap1.dmz-prg2.suse.org with ESMTPSA id zI4yA44jGGrMMgAAD6G6ig (envelope-from ); Thu, 28 May 2026 11:14:22 +0000 From: Juergen Gross To: linux-kernel@vger.kernel.org, x86@kernel.org, kvm@vger.kernel.org, linux-coco@lists.linux.dev Cc: Juergen Gross , Sean Christopherson , Paolo Bonzini , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" , Kiryl Shutsemau , Rick Edgecombe Subject: [PATCH v2 4/5] KVM/x86: Return -errno instead of "1" for VMX related MSR emulation Date: Thu, 28 May 2026 13:13:56 +0200 Message-ID: <20260528111357.264809-5-jgross@suse.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260528111357.264809-1-jgross@suse.com> References: <20260528111357.264809-1-jgross@suse.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Rspamd-Server: rspamd1.dmz-prg2.suse.org X-Rspamd-Action: no action X-Rspamd-Queue-Id: 606BE66E71 X-Spam-Flag: NO X-Spam-Score: -3.01 X-Spam-Level: X-Spamd-Result: default: False [-3.01 / 50.00]; BAYES_HAM(-3.00)[100.00%]; NEURAL_HAM_LONG(-1.00)[-1.000]; MID_CONTAINS_FROM(1.00)[]; R_MISSING_CHARSET(0.50)[]; R_DKIM_ALLOW(-0.20)[suse.com:s=susede1]; NEURAL_HAM_SHORT(-0.20)[-1.000]; MIME_GOOD(-0.10)[text/plain]; MX_GOOD(-0.01)[]; ARC_NA(0.00)[]; DBL_BLOCKED_OPENRESOLVER(0.00)[imap1.dmz-prg2.suse.org:rdns,imap1.dmz-prg2.suse.org:helo,suse.com:dkim,suse.com:email,suse.com:mid]; RCVD_VIA_SMTP_AUTH(0.00)[]; FROM_HAS_DN(0.00)[]; RCPT_COUNT_TWELVE(0.00)[14]; MIME_TRACE(0.00)[0:+]; FUZZY_RATELIMITED(0.00)[rspamd.com]; FROM_EQ_ENVFROM(0.00)[]; RCVD_TLS_ALL(0.00)[]; SPAMHAUS_XBL(0.00)[2a07:de40:b281:104:10:150:64:97:from]; TO_MATCH_ENVRCPT_ALL(0.00)[]; RCVD_COUNT_TWO(0.00)[2]; TO_DN_SOME(0.00)[]; DKIM_SIGNED(0.00)[suse.com:s=susede1]; DKIM_TRACE(0.00)[suse.com:+] Content-Type: text/plain; charset="utf-8" Instead of a literal "1" for signalling an error, use a negative errno value in the emulation code of VMX related MSR registers. Signed-off-by: Juergen Gross --- V2: - use -errno instead of KVM_MSR_RET_ERR --- arch/x86/kvm/vmx/nested.c | 2 +- arch/x86/kvm/vmx/pmu_intel.c | 16 +++--- arch/x86/kvm/vmx/tdx.c | 10 ++-- arch/x86/kvm/vmx/vmx.c | 96 ++++++++++++++++++------------------ 4 files changed, 62 insertions(+), 62 deletions(-) diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c index 3fe88f29be7a..2236f15ffab2 100644 --- a/arch/x86/kvm/vmx/nested.c +++ b/arch/x86/kvm/vmx/nested.c @@ -1611,7 +1611,7 @@ int vmx_get_vmx_msr(struct nested_vmx_msrs *msrs, u32= msr_index, u64 *pdata) *pdata =3D msrs->vmfunc_controls; break; default: - return 1; + return -EINVAL; } =20 return 0; diff --git a/arch/x86/kvm/vmx/pmu_intel.c b/arch/x86/kvm/vmx/pmu_intel.c index 27eb76e6b6a0..4f7e354c4b50 100644 --- a/arch/x86/kvm/vmx/pmu_intel.c +++ b/arch/x86/kvm/vmx/pmu_intel.c @@ -362,7 +362,7 @@ static int intel_pmu_get_msr(struct kvm_vcpu *vcpu, str= uct msr_data *msr_info) } else if (intel_pmu_handle_lbr_msrs_access(vcpu, msr_info, true)) { break; } - return 1; + return -EINVAL; } =20 return 0; @@ -379,14 +379,14 @@ static int intel_pmu_set_msr(struct kvm_vcpu *vcpu, s= truct msr_data *msr_info) switch (msr) { case MSR_CORE_PERF_FIXED_CTR_CTRL: if (data & pmu->fixed_ctr_ctrl_rsvd) - return 1; + return -EINVAL; =20 if (pmu->fixed_ctr_ctrl !=3D data) reprogram_fixed_counters(pmu, data); break; case MSR_IA32_PEBS_ENABLE: if (data & pmu->pebs_enable_rsvd) - return 1; + return -EINVAL; =20 if (pmu->pebs_enable !=3D data) { diff =3D pmu->pebs_enable ^ data; @@ -396,13 +396,13 @@ static int intel_pmu_set_msr(struct kvm_vcpu *vcpu, s= truct msr_data *msr_info) break; case MSR_IA32_DS_AREA: if (is_noncanonical_msr_address(data, vcpu)) - return 1; + return -EINVAL; =20 pmu->ds_area =3D data; break; case MSR_PEBS_DATA_CFG: if (data & pmu->pebs_data_cfg_rsvd) - return 1; + return -EINVAL; =20 pmu->pebs_data_cfg =3D data; break; @@ -411,7 +411,7 @@ static int intel_pmu_set_msr(struct kvm_vcpu *vcpu, str= uct msr_data *msr_info) (pmc =3D get_gp_pmc(pmu, msr, MSR_IA32_PMC0))) { if ((msr & MSR_PMC_FULL_WIDTH_BIT) && (data & ~pmu->counter_bitmask[KVM_PMC_GP])) - return 1; + return -EINVAL; =20 if (!msr_info->host_initiated && !(msr & MSR_PMC_FULL_WIDTH_BIT)) @@ -427,7 +427,7 @@ static int intel_pmu_set_msr(struct kvm_vcpu *vcpu, str= uct msr_data *msr_info) (pmu->raw_event_mask & HSW_IN_TX_CHECKPOINTED)) reserved_bits ^=3D HSW_IN_TX_CHECKPOINTED; if (data & reserved_bits) - return 1; + return -EINVAL; =20 if (data !=3D pmc->eventsel) { pmc->eventsel =3D data; @@ -439,7 +439,7 @@ static int intel_pmu_set_msr(struct kvm_vcpu *vcpu, str= uct msr_data *msr_info) break; } /* Not a known PMU MSR. */ - return 1; + return -EINVAL; } =20 return 0; diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c index 04ce321ebdf3..acc3242af4f4 100644 --- a/arch/x86/kvm/vmx/tdx.c +++ b/arch/x86/kvm/vmx/tdx.c @@ -2158,12 +2158,12 @@ int tdx_get_msr(struct kvm_vcpu *vcpu, struct msr_d= ata *msr) return 0; case MSR_IA32_MCG_EXT_CTL: if (!msr->host_initiated && !(vcpu->arch.mcg_cap & MCG_LMCE_P)) - return 1; + return -EINVAL; msr->data =3D vcpu->arch.mcg_ext_ctl; return 0; default: if (!tdx_has_emulated_msr(msr->index)) - return 1; + return -EACCES; =20 return kvm_get_msr_common(vcpu, msr); } @@ -2175,15 +2175,15 @@ int tdx_set_msr(struct kvm_vcpu *vcpu, struct msr_d= ata *msr) case MSR_IA32_MCG_EXT_CTL: if ((!msr->host_initiated && !(vcpu->arch.mcg_cap & MCG_LMCE_P)) || (msr->data & ~MCG_EXT_CTL_LMCE_EN)) - return 1; + return -EINVAL; vcpu->arch.mcg_ext_ctl =3D msr->data; return 0; default: if (tdx_is_read_only_msr(msr->index)) - return 1; + return -EACCES; =20 if (!tdx_has_emulated_msr(msr->index)) - return 1; + return -EACCES; =20 return kvm_set_msr_common(vcpu, msr); } diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index b9103de01428..2eee599fca30 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -2076,7 +2076,7 @@ int vmx_get_feature_msr(u32 msr, u64 *data) switch (msr) { case KVM_FIRST_EMULATED_VMX_MSR ... KVM_LAST_EMULATED_VMX_MSR: if (!nested) - return 1; + return -EINVAL; return vmx_get_vmx_msr(&vmcs_config.nested, msr, data); default: return KVM_MSR_RET_UNSUPPORTED; @@ -2111,18 +2111,18 @@ int vmx_get_msr(struct kvm_vcpu *vcpu, struct msr_d= ata *msr_info) case MSR_IA32_TSX_CTRL: if (!msr_info->host_initiated && !(vcpu->arch.arch_capabilities & ARCH_CAP_TSX_CTRL_MSR)) - return 1; + return -EINVAL; goto find_uret_msr; case MSR_IA32_UMWAIT_CONTROL: if (!msr_info->host_initiated && !vmx_has_waitpkg(vmx)) - return 1; + return -EINVAL; =20 msr_info->data =3D vmx->msr_ia32_umwait_control; break; case MSR_IA32_SPEC_CTRL: if (!msr_info->host_initiated && !guest_has_spec_ctrl_msr(vcpu)) - return 1; + return -EINVAL; =20 msr_info->data =3D to_vmx(vcpu)->spec_ctrl; break; @@ -2139,14 +2139,14 @@ int vmx_get_msr(struct kvm_vcpu *vcpu, struct msr_d= ata *msr_info) if (!kvm_mpx_supported() || (!msr_info->host_initiated && !guest_cpu_cap_has(vcpu, X86_FEATURE_MPX))) - return 1; + return -EINVAL; msr_info->data =3D vmcs_read64(GUEST_BNDCFGS); break; case MSR_IA32_MCG_EXT_CTL: if (!msr_info->host_initiated && !(vmx->msr_ia32_feature_control & FEAT_CTL_LMCE_ENABLED)) - return 1; + return -EINVAL; msr_info->data =3D vcpu->arch.mcg_ext_ctl; break; case MSR_IA32_FEAT_CTL: @@ -2155,16 +2155,16 @@ int vmx_get_msr(struct kvm_vcpu *vcpu, struct msr_d= ata *msr_info) case MSR_IA32_SGXLEPUBKEYHASH0 ... MSR_IA32_SGXLEPUBKEYHASH3: if (!msr_info->host_initiated && !guest_cpu_cap_has(vcpu, X86_FEATURE_SGX_LC)) - return 1; + return -EINVAL; msr_info->data =3D to_vmx(vcpu)->msr_ia32_sgxlepubkeyhash [msr_info->index - MSR_IA32_SGXLEPUBKEYHASH0]; break; case KVM_FIRST_EMULATED_VMX_MSR ... KVM_LAST_EMULATED_VMX_MSR: if (!guest_cpu_cap_has(vcpu, X86_FEATURE_VMX)) - return 1; + return -EINVAL; if (vmx_get_vmx_msr(&vmx->nested.msrs, msr_info->index, &msr_info->data)) - return 1; + return -EINVAL; #ifdef CONFIG_KVM_HYPERV /* * Enlightened VMCS v1 doesn't have certain VMCS fields but @@ -2180,19 +2180,19 @@ int vmx_get_msr(struct kvm_vcpu *vcpu, struct msr_d= ata *msr_info) break; case MSR_IA32_RTIT_CTL: if (!vmx_pt_mode_is_host_guest()) - return 1; + return -EINVAL; msr_info->data =3D vmx->pt_desc.guest.ctl; break; case MSR_IA32_RTIT_STATUS: if (!vmx_pt_mode_is_host_guest()) - return 1; + return -EINVAL; msr_info->data =3D vmx->pt_desc.guest.status; break; case MSR_IA32_RTIT_CR3_MATCH: if (!vmx_pt_mode_is_host_guest() || !intel_pt_validate_cap(vmx->pt_desc.caps, PT_CAP_cr3_filtering)) - return 1; + return -EINVAL; msr_info->data =3D vmx->pt_desc.guest.cr3_match; break; case MSR_IA32_RTIT_OUTPUT_BASE: @@ -2201,7 +2201,7 @@ int vmx_get_msr(struct kvm_vcpu *vcpu, struct msr_dat= a *msr_info) PT_CAP_topa_output) && !intel_pt_validate_cap(vmx->pt_desc.caps, PT_CAP_single_range_output))) - return 1; + return -EINVAL; msr_info->data =3D vmx->pt_desc.guest.output_base; break; case MSR_IA32_RTIT_OUTPUT_MASK: @@ -2210,14 +2210,14 @@ int vmx_get_msr(struct kvm_vcpu *vcpu, struct msr_d= ata *msr_info) PT_CAP_topa_output) && !intel_pt_validate_cap(vmx->pt_desc.caps, PT_CAP_single_range_output))) - return 1; + return -EINVAL; msr_info->data =3D vmx->pt_desc.guest.output_mask; break; case MSR_IA32_RTIT_ADDR0_A ... MSR_IA32_RTIT_ADDR3_B: index =3D msr_info->index - MSR_IA32_RTIT_ADDR0_A; if (!vmx_pt_mode_is_host_guest() || (index >=3D 2 * vmx->pt_desc.num_address_ranges)) - return 1; + return -EINVAL; if (index % 2) msr_info->data =3D vmx->pt_desc.guest.addr_b[index / 2]; else @@ -2359,7 +2359,7 @@ int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_dat= a *msr_info) break; case MSR_IA32_DEBUGCTLMSR: if (!vmx_is_valid_debugctl(vcpu, data, msr_info->host_initiated)) - return 1; + return -EINVAL; =20 data &=3D vmx_get_supported_debugctl(vcpu, msr_info->host_initiated); =20 @@ -2377,10 +2377,10 @@ int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_d= ata *msr_info) if (!kvm_mpx_supported() || (!msr_info->host_initiated && !guest_cpu_cap_has(vcpu, X86_FEATURE_MPX))) - return 1; + return -EINVAL; if (is_noncanonical_msr_address(data & PAGE_MASK, vcpu) || (data & MSR_IA32_BNDCFGS_RSVD)) - return 1; + return -EINVAL; =20 if (is_guest_mode(vcpu) && ((vmx->nested.msrs.entry_ctls_high & VM_ENTRY_LOAD_BNDCFGS) || @@ -2391,21 +2391,21 @@ int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_d= ata *msr_info) break; case MSR_IA32_UMWAIT_CONTROL: if (!msr_info->host_initiated && !vmx_has_waitpkg(vmx)) - return 1; + return -EINVAL; =20 /* The reserved bit 1 and non-32 bit [63:32] should be zero */ if (data & (BIT_ULL(1) | GENMASK_ULL(63, 32))) - return 1; + return -EINVAL; =20 vmx->msr_ia32_umwait_control =3D data; break; case MSR_IA32_SPEC_CTRL: if (!msr_info->host_initiated && !guest_has_spec_ctrl_msr(vcpu)) - return 1; + return -EINVAL; =20 if (kvm_spec_ctrl_test_value(data)) - return 1; + return -EINVAL; =20 vmx->spec_ctrl =3D data; if (!data) @@ -2430,9 +2430,9 @@ int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_dat= a *msr_info) case MSR_IA32_TSX_CTRL: if (!msr_info->host_initiated && !(vcpu->arch.arch_capabilities & ARCH_CAP_TSX_CTRL_MSR)) - return 1; + return -EINVAL; if (data & ~(TSX_CTRL_RTM_DISABLE | TSX_CTRL_CPUID_CLEAR)) - return 1; + return -EINVAL; goto find_uret_msr; case MSR_IA32_CR_PAT: ret =3D kvm_set_msr_common(vcpu, msr_info); @@ -2451,12 +2451,12 @@ int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_d= ata *msr_info) !(to_vmx(vcpu)->msr_ia32_feature_control & FEAT_CTL_LMCE_ENABLED)) || (data & ~MCG_EXT_CTL_LMCE_EN)) - return 1; + return -EINVAL; vcpu->arch.mcg_ext_ctl =3D data; break; case MSR_IA32_FEAT_CTL: if (!is_vmx_feature_control_msr_valid(vmx, msr_info)) - return 1; + return -EINVAL; =20 vmx->msr_ia32_feature_control =3D data; if (msr_info->host_initiated && data =3D=3D 0) @@ -2481,70 +2481,70 @@ int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_d= ata *msr_info) (!guest_cpu_cap_has(vcpu, X86_FEATURE_SGX_LC) || ((vmx->msr_ia32_feature_control & FEAT_CTL_LOCKED) && !(vmx->msr_ia32_feature_control & FEAT_CTL_SGX_LC_ENABLED)))) - return 1; + return -EINVAL; vmx->msr_ia32_sgxlepubkeyhash [msr_index - MSR_IA32_SGXLEPUBKEYHASH0] =3D data; break; case KVM_FIRST_EMULATED_VMX_MSR ... KVM_LAST_EMULATED_VMX_MSR: if (!msr_info->host_initiated) - return 1; /* they are read-only */ + return -EINVAL; /* they are read-only */ if (!guest_cpu_cap_has(vcpu, X86_FEATURE_VMX)) - return 1; + return -EINVAL; return vmx_set_vmx_msr(vcpu, msr_index, data); case MSR_IA32_RTIT_CTL: if (!vmx_pt_mode_is_host_guest() || vmx_rtit_ctl_check(vcpu, data) || vmx->nested.vmxon) - return 1; + return -EINVAL; vmcs_write64(GUEST_IA32_RTIT_CTL, data); vmx->pt_desc.guest.ctl =3D data; pt_update_intercept_for_msr(vcpu); break; case MSR_IA32_RTIT_STATUS: if (!pt_can_write_msr(vmx)) - return 1; + return -EINVAL; if (data & MSR_IA32_RTIT_STATUS_MASK) - return 1; + return -EINVAL; vmx->pt_desc.guest.status =3D data; break; case MSR_IA32_RTIT_CR3_MATCH: if (!pt_can_write_msr(vmx)) - return 1; + return -EINVAL; if (!intel_pt_validate_cap(vmx->pt_desc.caps, PT_CAP_cr3_filtering)) - return 1; + return -EINVAL; vmx->pt_desc.guest.cr3_match =3D data; break; case MSR_IA32_RTIT_OUTPUT_BASE: if (!pt_can_write_msr(vmx)) - return 1; + return -EINVAL; if (!intel_pt_validate_cap(vmx->pt_desc.caps, PT_CAP_topa_output) && !intel_pt_validate_cap(vmx->pt_desc.caps, PT_CAP_single_range_output)) - return 1; + return -EINVAL; if (!pt_output_base_valid(vcpu, data)) - return 1; + return -EINVAL; vmx->pt_desc.guest.output_base =3D data; break; case MSR_IA32_RTIT_OUTPUT_MASK: if (!pt_can_write_msr(vmx)) - return 1; + return -EINVAL; if (!intel_pt_validate_cap(vmx->pt_desc.caps, PT_CAP_topa_output) && !intel_pt_validate_cap(vmx->pt_desc.caps, PT_CAP_single_range_output)) - return 1; + return -EINVAL; vmx->pt_desc.guest.output_mask =3D data; break; case MSR_IA32_RTIT_ADDR0_A ... MSR_IA32_RTIT_ADDR3_B: if (!pt_can_write_msr(vmx)) - return 1; + return -EINVAL; index =3D msr_info->index - MSR_IA32_RTIT_ADDR0_A; if (index >=3D 2 * vmx->pt_desc.num_address_ranges) - return 1; + return -EINVAL; if (is_noncanonical_msr_address(data, vcpu)) - return 1; + return -EINVAL; if (index % 2) vmx->pt_desc.guest.addr_b[index / 2] =3D data; else @@ -2563,20 +2563,20 @@ int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_d= ata *msr_info) if (data & PERF_CAP_LBR_FMT) { if ((data & PERF_CAP_LBR_FMT) !=3D (kvm_caps.supported_perf_cap & PERF_CAP_LBR_FMT)) - return 1; + return -EINVAL; if (!cpuid_model_is_consistent(vcpu)) - return 1; + return -EINVAL; } if (data & PERF_CAP_PEBS_FORMAT) { if ((data & PERF_CAP_PEBS_MASK) !=3D (kvm_caps.supported_perf_cap & PERF_CAP_PEBS_MASK)) - return 1; + return -EINVAL; if (!guest_cpu_cap_has(vcpu, X86_FEATURE_DS)) - return 1; + return -EINVAL; if (!guest_cpu_cap_has(vcpu, X86_FEATURE_DTES64)) - return 1; + return -EINVAL; if (!cpuid_model_is_consistent(vcpu)) - return 1; + return -EINVAL; } ret =3D kvm_set_msr_common(vcpu, msr_info); break; --=20 2.54.0 From nobody Mon Jun 8 15:36:51 2026 Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.223.130]) (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 A336C3D4103 for ; Thu, 28 May 2026 11:14:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=195.135.223.130 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779966871; cv=none; b=q62Q/rBpbigO8LNqVfKdFLcC/TE6h0t0M/m5uQEkDGNZu84hbxe9YUokdlOkoRrhCPjWquRXv6PUiMZu9ZmTc9+hhpMHhUWIuv9ohAbMidqK2GGOjS2OPrwozVq4MaiImbDQquFYBmHdx+GvD2wrPbMWUpxJ/Yflz5hyMaN+EAI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779966871; c=relaxed/simple; bh=7f5srVmH0Xx0XEVGgWQLheUGHQMkiUXvXlV4c4bqp74=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=S9RozeVNnShfYF4ToIOwOkgdE0uyrYEXUyPT4238fkOOv8lH5956Leiossq7v/+DLT8OYqjKiciYpnaGep9USflRJyEi8Ot0+nRN/L/kD8zqzA3eQa40s2yUBQbo/cdKxhGcFbWIp2gBUs0dW9iRHzl9Sx55IxBf9jKGGmhQKGg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com; spf=pass smtp.mailfrom=suse.com; dkim=pass (1024-bit key) header.d=suse.com header.i=@suse.com header.b=KnA3uXOJ; dkim=pass (1024-bit key) header.d=suse.com header.i=@suse.com header.b=NuhpXqAu; arc=none smtp.client-ip=195.135.223.130 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=suse.com header.i=@suse.com header.b="KnA3uXOJ"; dkim=pass (1024-bit key) header.d=suse.com header.i=@suse.com header.b="NuhpXqAu" Received: from imap1.dmz-prg2.suse.org (unknown [10.150.64.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id EAA426AFE9; Thu, 28 May 2026 11:14:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1779966868; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=MAdbQ14wwNd5QTrRHnWRpm3W34C4IvV7gYCGkiD+Grs=; b=KnA3uXOJ/DRdG4O4V/40Hc0ltd7OrKNou/3ADMrzGlltszI4E/nzI2Y6ZkmURZkAesPPpv gkIiCtzfByTosobK1kQgE4Bh+Ws23ixcKYhW5zYQO46R+DvL77UCZhBFNmi87uUH9tv+tX LQBD8kpMIuNyj3VJqe5W1jtOrV1AKGI= Authentication-Results: smtp-out1.suse.de; none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1779966867; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=MAdbQ14wwNd5QTrRHnWRpm3W34C4IvV7gYCGkiD+Grs=; b=NuhpXqAuNZpLT99iqstdHg8SqwaCrXrI8xE4D+ggrpXawvLQYgtEehBYQaVgHye0s7trvn 0wdl4fMUOD0hnh8IMbH6Q1n+OliZMWs2l32F3cg0yB6iA6cczb+e3N24j51kg0HCSsqx6R jpBXEmfOIuM+jg4FuQeYTxIaAA+kh8s= Received: from imap1.dmz-prg2.suse.org (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by imap1.dmz-prg2.suse.org (Postfix) with ESMTPS id ABCC55AD61; Thu, 28 May 2026 11:14:27 +0000 (UTC) Received: from dovecot-director2.suse.de ([2a07:de40:b281:106:10:150:64:167]) by imap1.dmz-prg2.suse.org with ESMTPSA id pgPiKJMjGGrkMgAAD6G6ig (envelope-from ); Thu, 28 May 2026 11:14:27 +0000 From: Juergen Gross To: linux-kernel@vger.kernel.org, x86@kernel.org, kvm@vger.kernel.org Cc: Juergen Gross , Sean Christopherson , Paolo Bonzini , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" Subject: [PATCH v2 5/5] KVM/x86: Return -errno instead of "1" for SVM related MSR emulation Date: Thu, 28 May 2026 13:13:57 +0200 Message-ID: <20260528111357.264809-6-jgross@suse.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260528111357.264809-1-jgross@suse.com> References: <20260528111357.264809-1-jgross@suse.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Spam-Level: X-Spam-Score: -2.80 X-Spam-Flag: NO X-Spamd-Result: default: False [-2.80 / 50.00]; BAYES_HAM(-3.00)[100.00%]; MID_CONTAINS_FROM(1.00)[]; NEURAL_HAM_LONG(-1.00)[-1.000]; R_MISSING_CHARSET(0.50)[]; NEURAL_HAM_SHORT(-0.20)[-1.000]; MIME_GOOD(-0.10)[text/plain]; TO_MATCH_ENVRCPT_ALL(0.00)[]; ARC_NA(0.00)[]; RCVD_VIA_SMTP_AUTH(0.00)[]; FROM_HAS_DN(0.00)[]; TO_DN_SOME(0.00)[]; MIME_TRACE(0.00)[0:+]; DBL_BLOCKED_OPENRESOLVER(0.00)[imap1.dmz-prg2.suse.org:helo,suse.com:email,suse.com:mid]; FUZZY_RATELIMITED(0.00)[rspamd.com]; RCPT_COUNT_SEVEN(0.00)[11]; RCVD_COUNT_TWO(0.00)[2]; FROM_EQ_ENVFROM(0.00)[]; DKIM_SIGNED(0.00)[suse.com:s=susede1]; R_RATELIMIT(0.00)[to_ip_from(RLfdszjqhz8kzzb9uwpzdm8png)]; RCVD_TLS_ALL(0.00)[] Content-Type: text/plain; charset="utf-8" Instead of a literal "1" for signalling an error, use a negative errno value in the emulation code of SVM related MSR registers. Signed-off-by: Juergen Gross --- V2: - use -errno instead of KVM_MSR_RET_ERR --- arch/x86/kvm/svm/pmu.c | 4 ++-- arch/x86/kvm/svm/svm.c | 36 ++++++++++++++++++------------------ 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/arch/x86/kvm/svm/pmu.c b/arch/x86/kvm/svm/pmu.c index 7aa298eeb072..1c325d602baa 100644 --- a/arch/x86/kvm/svm/pmu.c +++ b/arch/x86/kvm/svm/pmu.c @@ -144,7 +144,7 @@ static int amd_pmu_get_msr(struct kvm_vcpu *vcpu, struc= t msr_data *msr_info) return 0; } =20 - return 1; + return -EINVAL; } =20 static int amd_pmu_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_inf= o) @@ -173,7 +173,7 @@ static int amd_pmu_set_msr(struct kvm_vcpu *vcpu, struc= t msr_data *msr_info) return 0; } =20 - return 1; + return -EINVAL; } =20 static void amd_pmu_refresh(struct kvm_vcpu *vcpu) diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c index e02a38da5296..f8d9df822ab3 100644 --- a/arch/x86/kvm/svm/svm.c +++ b/arch/x86/kvm/svm/svm.c @@ -2791,7 +2791,7 @@ static int svm_get_msr(struct kvm_vcpu *vcpu, struct = msr_data *msr_info) case MSR_AMD64_TSC_RATIO: if (!msr_info->host_initiated && !guest_cpu_cap_has(vcpu, X86_FEATURE_TSCRATEMSR)) - return 1; + return -EINVAL; msr_info->data =3D svm->tsc_ratio_msr; break; case MSR_STAR: @@ -2860,7 +2860,7 @@ static int svm_get_msr(struct kvm_vcpu *vcpu, struct = msr_data *msr_info) case MSR_IA32_SPEC_CTRL: if (!msr_info->host_initiated && !guest_has_spec_ctrl_msr(vcpu)) - return 1; + return -EINVAL; =20 if (boot_cpu_has(X86_FEATURE_V_SPEC_CTRL)) msr_info->data =3D svm->vmcb->save.spec_ctrl; @@ -2870,7 +2870,7 @@ static int svm_get_msr(struct kvm_vcpu *vcpu, struct = msr_data *msr_info) case MSR_AMD64_VIRT_SPEC_CTRL: if (!msr_info->host_initiated && !guest_cpu_cap_has(vcpu, X86_FEATURE_VIRT_SSBD)) - return 1; + return -EINVAL; =20 msr_info->data =3D svm->virt_spec_ctrl; break; @@ -2907,7 +2907,7 @@ static int svm_complete_emulated_msr(struct kvm_vcpu = *vcpu, int err) return kvm_complete_insn_gp(vcpu, err); =20 svm_vmgexit_inject_exception(svm, X86_TRAP_GP); - return 1; + return -EINVAL; } =20 static int svm_set_vm_cr(struct kvm_vcpu *vcpu, u64 data) @@ -2916,7 +2916,7 @@ static int svm_set_vm_cr(struct kvm_vcpu *vcpu, u64 d= ata) int svm_dis, chg_mask; =20 if (data & ~SVM_VM_CR_VALID_MASK) - return 1; + return -EINVAL; =20 chg_mask =3D SVM_VM_CR_VALID_MASK; =20 @@ -2930,7 +2930,7 @@ static int svm_set_vm_cr(struct kvm_vcpu *vcpu, u64 d= ata) =20 /* check for svm_disable while efer.svme is set */ if (svm_dis && (vcpu->arch.efer & EFER_SVME)) - return 1; + return -EINVAL; =20 return 0; } @@ -2952,7 +2952,7 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struct = msr_data *msr) if (!guest_cpu_cap_has(vcpu, X86_FEATURE_TSCRATEMSR)) { =20 if (!msr->host_initiated) - return 1; + return -EINVAL; /* * In case TSC scaling is not enabled, always * leave this MSR at the default value. @@ -2962,12 +2962,12 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struc= t msr_data *msr) * Ignore this value as well. */ if (data !=3D 0 && data !=3D svm->tsc_ratio_msr) - return 1; + return -EINVAL; break; } =20 if (data & SVM_TSC_RATIO_RSVD) - return 1; + return -EINVAL; =20 svm->tsc_ratio_msr =3D data; =20 @@ -2989,10 +2989,10 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struc= t msr_data *msr) case MSR_IA32_SPEC_CTRL: if (!msr->host_initiated && !guest_has_spec_ctrl_msr(vcpu)) - return 1; + return -EINVAL; =20 if (kvm_spec_ctrl_test_value(data)) - return 1; + return -EINVAL; =20 if (boot_cpu_has(X86_FEATURE_V_SPEC_CTRL)) svm->vmcb->save.spec_ctrl =3D data; @@ -3017,10 +3017,10 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struc= t msr_data *msr) case MSR_AMD64_VIRT_SPEC_CTRL: if (!msr->host_initiated && !guest_cpu_cap_has(vcpu, X86_FEATURE_VIRT_SSBD)) - return 1; + return -EINVAL; =20 if (data & ~SPEC_CTRL_SSBD) - return 1; + return -EINVAL; =20 svm->virt_spec_ctrl =3D data; break; @@ -3115,7 +3115,7 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struct = msr_data *msr) } =20 if (data & DEBUGCTL_RESERVED_BITS) - return 1; + return -EINVAL; =20 if (svm->vmcb->save.dbgctl =3D=3D data) break; @@ -3131,7 +3131,7 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struct = msr_data *msr) if (!lbrv) return KVM_MSR_RET_UNSUPPORTED; if (!msr->host_initiated) - return 1; + return -EINVAL; *svm_vmcb_lbr(svm, ecx) =3D data; vmcb_mark_dirty(svm->vmcb, VMCB_LBR); break; @@ -3143,7 +3143,7 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struct = msr_data *msr) * originating from those kernels. */ if (!msr->host_initiated && !page_address_valid(vcpu, data)) - return 1; + return -EINVAL; =20 svm->nested.hsave_msr =3D data & PAGE_MASK; break; @@ -3156,10 +3156,10 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struc= t msr_data *msr) u64 supported_de_cfg; =20 if (svm_get_feature_msr(ecx, &supported_de_cfg)) - return 1; + return -EINVAL; =20 if (data & ~supported_de_cfg) - return 1; + return -EINVAL; =20 svm->msr_decfg =3D data; break; --=20 2.54.0