stable.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Thomas Gleixner <tglx@linutronix.de>
To: Peter Schneider <pschneider1968@googlemail.com>
Cc: LKML <linux-kernel@vger.kernel.org>,
	x86@kernel.org, stable@vger.kernel.org,
	regressions@lists.linux.dev
Subject: Re: Kernel 6.9 regression: X86: Bogus messages from topology detection
Date: Thu, 30 May 2024 18:24:39 +0200	[thread overview]
Message-ID: <87le3r8dyw.ffs@tglx> (raw)
In-Reply-To: <87o78n8fe2.ffs@tglx>

On Thu, May 30 2024 at 17:53, Thomas Gleixner wrote:
> On Thu, May 30 2024 at 15:35, Thomas Gleixner wrote:
>> On Thu, May 30 2024 at 12:06, Peter Schneider wrote:
>> Now the million-dollar question is what unlocks CPUID to read the proper
>> value of EAX of leaf 0. All I could come up with is to sprinkle a dozen
>> of printks into that code. Updated debug patch below.
>
> Don't bother. Dave pointed out to me that this is unlocked in
> early_init_intel() via MSR_IA32_MISC_ENABLE_LIMIT_CPUID...
>
> Let me figure out how to fix that sanely.

The original code just worked because it was reevaluating this stuff
over and over until it magically became "correct".

The proper fix is obviously to unlock CPUID on Intel _before_ anything
which depends on cpuid_level is evaluated.

Thanks,

        tglx
---
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -969,7 +969,7 @@ static void init_speculation_control(str
 	}
 }
 
-void get_cpu_cap(struct cpuinfo_x86 *c)
+static void get_cpu_cap(struct cpuinfo_x86 *c)
 {
 	u32 eax, ebx, ecx, edx;
 
@@ -1585,6 +1585,7 @@ static void __init early_identify_cpu(st
 	if (have_cpuid_p()) {
 		cpu_detect(c);
 		get_cpu_vendor(c);
+		intel_unlock_cpuid_leafs(c);
 		get_cpu_cap(c);
 		setup_force_cpu_cap(X86_FEATURE_CPUID);
 		get_cpu_address_sizes(c);
@@ -1744,7 +1745,7 @@ static void generic_identify(struct cpui
 	cpu_detect(c);
 
 	get_cpu_vendor(c);
-
+	intel_unlock_cpuid_leafs(c);
 	get_cpu_cap(c);
 
 	get_cpu_address_sizes(c);
--- a/arch/x86/kernel/cpu/cpu.h
+++ b/arch/x86/kernel/cpu/cpu.h
@@ -61,14 +61,15 @@ extern __ro_after_init enum tsx_ctrl_sta
 
 extern void __init tsx_init(void);
 void tsx_ap_init(void);
+void intel_unlock_cpuid_leafs(struct cpuinfo_x86 *c);
 #else
 static inline void tsx_init(void) { }
 static inline void tsx_ap_init(void) { }
+static inline void intel_unlock_cpuid_leafs(struct cpuinfo_x86 *c) { }
 #endif /* CONFIG_CPU_SUP_INTEL */
 
 extern void init_spectral_chicken(struct cpuinfo_x86 *c);
 
-extern void get_cpu_cap(struct cpuinfo_x86 *c);
 extern void get_cpu_address_sizes(struct cpuinfo_x86 *c);
 extern void cpu_detect_cache_sizes(struct cpuinfo_x86 *c);
 extern void init_scattered_cpuid_features(struct cpuinfo_x86 *c);
--- a/arch/x86/kernel/cpu/intel.c
+++ b/arch/x86/kernel/cpu/intel.c
@@ -269,19 +269,26 @@ static void detect_tme_early(struct cpui
 	c->x86_phys_bits -= keyid_bits;
 }
 
+void intel_unlock_cpuid_leafs(struct cpuinfo_x86 *c)
+{
+	if (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL)
+		return;
+
+	if (c->x86 < 6 || (c->x86 == 6 && c->x86_model < 0xd))
+		return;
+
+	/*
+	 * The BIOS can have limited CPUID to leaf 2, which breaks feature
+	 * enumeration. Unlock it and update the maximum leaf info.
+	 */
+	if (msr_clear_bit(MSR_IA32_MISC_ENABLE, MSR_IA32_MISC_ENABLE_LIMIT_CPUID_BIT) > 0)
+		c->cpuid_level = cpuid_eax(0);
+}
+
 static void early_init_intel(struct cpuinfo_x86 *c)
 {
 	u64 misc_enable;
 
-	/* Unmask CPUID levels if masked: */
-	if (c->x86 > 6 || (c->x86 == 6 && c->x86_model >= 0xd)) {
-		if (msr_clear_bit(MSR_IA32_MISC_ENABLE,
-				  MSR_IA32_MISC_ENABLE_LIMIT_CPUID_BIT) > 0) {
-			c->cpuid_level = cpuid_eax(0);
-			get_cpu_cap(c);
-		}
-	}
-
 	if ((c->x86 == 0xf && c->x86_model >= 0x03) ||
 		(c->x86 == 0x6 && c->x86_model >= 0x0e))
 		set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC);





  reply	other threads:[~2024-05-30 16:24 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-05-27  7:29 Kernel 6.9 regression: X86: Bogus messages from topology detection Peter Schneider
2024-05-27 13:14 ` Thomas Gleixner
2024-05-27 20:49   ` Thomas Gleixner
2024-05-27 21:06   ` Peter Schneider
2024-05-27 21:15     ` Peter Schneider
2024-05-27 21:34       ` Christian Heusel
2024-05-30  8:30       ` Thomas Gleixner
2024-05-30 10:06         ` Peter Schneider
2024-05-30 13:35           ` Thomas Gleixner
2024-05-30 15:53             ` Thomas Gleixner
2024-05-30 16:24               ` Thomas Gleixner [this message]
2024-05-31  6:52                 ` Peter Schneider
2024-05-31  8:33                   ` Thomas Gleixner
2024-05-31  8:42                     ` Thomas Gleixner
2024-05-31  9:41                       ` Peter Schneider
2024-05-31 10:07                         ` Thomas Gleixner
2024-05-31 10:22                           ` Peter Schneider
2024-06-01  7:06                       ` Linux regression tracking (Thorsten Leemhuis)
2024-06-01  7:20                         ` Thomas Gleixner
2024-06-01  7:25                           ` Linux regression tracking (Thorsten Leemhuis)
2024-05-31  8:13                 ` Christian Heusel
2024-05-31  8:16                   ` Christian Heusel
2024-05-31  8:48                     ` Thomas Gleixner
2024-05-31  9:11                       ` Thomas Gleixner
2024-05-31 13:08                         ` Christian Heusel
2024-05-31 13:42                           ` Thomas Gleixner
2024-05-31 14:29                             ` Christian Heusel
2024-05-31 15:25                               ` Thomas Gleixner
2024-05-31 11:06                     ` Thomas Gleixner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87le3r8dyw.ffs@tglx \
    --to=tglx@linutronix.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pschneider1968@googlemail.com \
    --cc=regressions@lists.linux.dev \
    --cc=stable@vger.kernel.org \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).