From nobody Tue Jun 23 06:13:58 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 66EC5C433FE for ; Wed, 9 Mar 2022 17:14:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237029AbiCIRPt (ORCPT ); Wed, 9 Mar 2022 12:15:49 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36040 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238417AbiCIROX (ORCPT ); Wed, 9 Mar 2022 12:14:23 -0500 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id D2E8F12F43A for ; Wed, 9 Mar 2022 09:09:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1646845773; h=from:from:reply-to:subject:subject: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=We3EN0WBNbBd0dp5yY6VG/gbbkfuqHO4cLRFYWTCIpg=; b=PlhRoVv1DirwQIKO/kjs1rFX6Gv1gkjndNwZU7eiS3pF4oFdmsBgWUOKWFLH3HLSH0VMN5 lwajcAt4fGGWLHM09VVMYxqkIZKkQaQsGd0Djj47HKF16n6vb99aEffJhCos1jn8BX5W2v D/iDl7t7JPymw01AtBKfcmwmeRELu7U= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-675-tV7UOu1pPHygsB9q5W9NLw-1; Wed, 09 Mar 2022 12:09:30 -0500 X-MC-Unique: tV7UOu1pPHygsB9q5W9NLw-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id BF67480734E; Wed, 9 Mar 2022 17:09:29 +0000 (UTC) Received: from virtlab701.virt.lab.eng.bos.redhat.com (virtlab701.virt.lab.eng.bos.redhat.com [10.19.152.228]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5277D866F1; Wed, 9 Mar 2022 17:09:29 +0000 (UTC) From: Paolo Bonzini To: linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: vkuznets@redhat.com, jmattson@google.com Subject: [PATCH 1/2] KVM: x86: add support for CPUID leaf 0x80000021 Date: Wed, 9 Mar 2022 12:09:27 -0500 Message-Id: <20220309170928.1032664-2-pbonzini@redhat.com> In-Reply-To: <20220309170928.1032664-1-pbonzini@redhat.com> References: <20220309170928.1032664-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" CPUID leaf 0x80000021 defines some features (or lack of bugs) of AMD processors. Expose the ones that make sense via KVM_GET_SUPPORTED_CPUID. Signed-off-by: Paolo Bonzini --- arch/x86/kvm/cpuid.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c index 419eb8e14f79..30832aad402f 100644 --- a/arch/x86/kvm/cpuid.c +++ b/arch/x86/kvm/cpuid.c @@ -1068,7 +1068,7 @@ static inline int __do_cpuid_func(struct kvm_cpuid_ar= ray *array, u32 function) entry->edx =3D 0; break; case 0x80000000: - entry->eax =3D min(entry->eax, 0x8000001f); + entry->eax =3D min(entry->eax, 0x80000021); break; case 0x80000001: cpuid_entry_override(entry, CPUID_8000_0001_EDX); @@ -1139,6 +1139,23 @@ static inline int __do_cpuid_func(struct kvm_cpuid_a= rray *array, u32 function) entry->ebx &=3D ~GENMASK(11, 6); } break; + case 0x80000020: + entry->eax =3D entry->ebx =3D entry->ecx =3D entry->edx =3D 0; + break; + case 0x80000021: + entry->ebx =3D entry->ecx =3D entry->edx =3D 0; + /* + * Pass down these bits: + * EAX 0 NNDBP, Processor ignores nested data breakpoints + * EAX 2 LAS, LFENCE always serializing + * EAX 6 NSCB, Null selector clear base + * + * Other defined bits are for MSRs that KVM does not expose: + * EAX 3 SPCL, SMM page configuration lock + * EAX 13 PCMSR, Prefetch control MSR + */ + entry->eax &=3D BIT(0) | BIT(2) | BIT(6); + break; /*Add support for Centaur's CPUID instruction*/ case 0xC0000000: /*Just support up to 0xC0000004 now*/ --=20 2.31.1 From nobody Tue Jun 23 06:13:58 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 79C48C433EF for ; Wed, 9 Mar 2022 17:15:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235874AbiCIRQN (ORCPT ); Wed, 9 Mar 2022 12:16:13 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36744 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238400AbiCIROS (ORCPT ); Wed, 9 Mar 2022 12:14:18 -0500 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 95B8512AB5 for ; Wed, 9 Mar 2022 09:09:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1646845772; h=from:from:reply-to:subject:subject: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=s/o3sPCCWF9DwYJSFG90KCzdlkqUEgVretFfIHQN8Mo=; b=KJHU7sZm+Y7z0eh5zxuTsbBP1SmJjv7KMk2tHQJOm6859mQz2bON6BOrGqdlI5mJPcM28t lUWeyTcgQREK8AbunBA20ZOAaxJtnSIQZJBvdhS9qN5r/BB8kQMcAGj8igObxynTit/KbE zl1u7gGY/5TMSK48IgHVpAETmUO8Stk= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-362-T5WUUdbbMmGXVTHoigC-hA-1; Wed, 09 Mar 2022 12:09:31 -0500 X-MC-Unique: T5WUUdbbMmGXVTHoigC-hA-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 4BAEE1854E2A; Wed, 9 Mar 2022 17:09:30 +0000 (UTC) Received: from virtlab701.virt.lab.eng.bos.redhat.com (virtlab701.virt.lab.eng.bos.redhat.com [10.19.152.228]) by smtp.corp.redhat.com (Postfix) with ESMTP id DA28B866F1; Wed, 9 Mar 2022 17:09:29 +0000 (UTC) From: Paolo Bonzini To: linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: vkuznets@redhat.com, jmattson@google.com Subject: [PATCH 2/2] KVM: x86: synthesize CPUID leaf 0x80000021h if useful Date: Wed, 9 Mar 2022 12:09:28 -0500 Message-Id: <20220309170928.1032664-3-pbonzini@redhat.com> In-Reply-To: <20220309170928.1032664-1-pbonzini@redhat.com> References: <20220309170928.1032664-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Guests should have X86_BUG_NULL_SEG if and only if the host has the bug. Use the info from static_cpu_has_bug to form the 0x80000021 CPUID leaf that was defined for Zen3. Userspace can then set the bit even on older CPUs that do not have the bug, such as Zen2. Do the same for X86_FEATURE_LFENCE_RDTSC as well, since various processors have had very different ways of detecting it and not all of them are available to userspace. Signed-off-by: Paolo Bonzini --- arch/x86/kvm/cpuid.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c index 30832aad402f..58b0b4e0263c 100644 --- a/arch/x86/kvm/cpuid.c +++ b/arch/x86/kvm/cpuid.c @@ -723,6 +723,19 @@ static struct kvm_cpuid_entry2 *do_host_cpuid(struct k= vm_cpuid_array *array, /* Hypervisor leaves are always synthesized by __do_cpuid_func. */ return entry; =20 + case 0x80000000: + /* + * 0x80000021 is sometimes synthesized by __do_cpuid_func, which + * would result in out-of-bounds calls to do_host_cpuid. + */ + { + static int max_cpuid_80000000; + if (!READ_ONCE(max_cpuid_80000000)) + WRITE_ONCE(max_cpuid_80000000, cpuid_eax(0x80000000)); + if (function > READ_ONCE(max_cpuid_80000000)) + return entry; + } + default: break; } @@ -1069,6 +1082,14 @@ static inline int __do_cpuid_func(struct kvm_cpuid_a= rray *array, u32 function) break; case 0x80000000: entry->eax =3D min(entry->eax, 0x80000021); + /* + * Serializing LFENCE is reported in a multitude of ways, + * and NullSegClearsBase is not reported in CPUID on Zen2; + * help userspace by providing the CPUID leaf ourselves. + */ + if (static_cpu_has(X86_FEATURE_LFENCE_RDTSC) + || !static_cpu_has_bug(X86_BUG_NULL_SEG)) + entry->eax =3D max(entry->eax, 0x80000021); break; case 0x80000001: cpuid_entry_override(entry, CPUID_8000_0001_EDX); @@ -1155,6 +1176,10 @@ static inline int __do_cpuid_func(struct kvm_cpuid_a= rray *array, u32 function) * EAX 13 PCMSR, Prefetch control MSR */ entry->eax &=3D BIT(0) | BIT(2) | BIT(6); + if (static_cpu_has(X86_FEATURE_LFENCE_RDTSC)) + entry->eax |=3D BIT(2); + if (!static_cpu_has_bug(X86_BUG_NULL_SEG)) + entry->eax |=3D BIT(6); break; /*Add support for Centaur's CPUID instruction*/ case 0xC0000000: --=20 2.31.1