* [PATCH v3 0/5] x86/cpu: Refactor identify_cpu()
@ 2026-09-16 19:51 Ihor Solodrai
2026-09-16 19:51 ` [PATCH v3 1/5] x86/cpu: Factor init_cpu_info() out of identify_cpu() Ihor Solodrai
` (4 more replies)
0 siblings, 5 replies; 11+ messages in thread
From: Ihor Solodrai @ 2026-09-16 19:51 UTC (permalink / raw)
To: Borislav Petkov, Dave Hansen, Ingo Molnar, Thomas Gleixner
Cc: Alexei Starovoitov, Andrii Nakryiko, Andrey Ryabinin,
Andrew Morton, H . Peter Anvin, Andrey Konovalov, linux-kernel,
x86, bpf, kasan-dev, linux-mm, kernel-team
Refactor identify_cpu() machinery on x86 and then implement a fix for
a bug when cpu capabilities are temporarily cleared within an
interruptable window. For more details and discussion see the relevant
bug report [1] and patch #5 ("x86/cpu: Don't transiently clear the
boot CPU's capabilities").
Suggested-by: Borislav Petkov <bp@alien8.de>
Signed-off-by: Ihor Solodrai <ihor.solodrai@linux.dev>
[1] https://lore.kernel.org/bpf/20260610175651.647515-1-ihor.solodrai@linux.dev/
---
v2->v3:
* Commit message edits on patches #1, #2, #5
v2: https://lore.kernel.org/bpf/20260814235134.3461435-1-ihor.solodrai@linux.dev/
v1->v2:
* Rewrite commit messages to fit more conventional structure (Boris)
* Drop identify_cpu_32() helper, it's unnecessary (Boris)
* New patch (#2): now early_identify_cpu() resets boot_cpu_data
through init_cpu_info() as well
* The boot CPU reset is now skipped on 32-bit too (sashiko)
v1: https://lore.kernel.org/bpf/20260704002046.3859585-1-ihor.solodrai@linux.dev/
---
Ihor Solodrai (5):
x86/cpu: Factor init_cpu_info() out of identify_cpu()
x86/cpu: Initialize boot CPU cpuinfo defaults early
x86/cpu: Inline generic_identify() into identify_cpu()
x86/cpu: Move 32-bit SEP setup into identify_cpu()
x86/cpu: Don't transiently clear the boot CPU's capabilities
arch/x86/kernel/cpu/common.c | 92 +++++++++++++++++-------------------
1 file changed, 44 insertions(+), 48 deletions(-)
base-commit: fd73f4a6659897191fa0d40695fe370925dd3780
--
2.55.0
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v3 1/5] x86/cpu: Factor init_cpu_info() out of identify_cpu()
2026-09-16 19:51 [PATCH v3 0/5] x86/cpu: Refactor identify_cpu() Ihor Solodrai
@ 2026-09-16 19:51 ` Ihor Solodrai
2026-09-17 2:00 ` [tip: x86/cpu] " tip-bot2 for Ihor Solodrai
2026-09-16 19:52 ` [PATCH v3 2/5] x86/cpu: Initialize boot CPU cpuinfo defaults early Ihor Solodrai
` (3 subsequent siblings)
4 siblings, 1 reply; 11+ messages in thread
From: Ihor Solodrai @ 2026-09-16 19:51 UTC (permalink / raw)
To: Borislav Petkov, Dave Hansen, Ingo Molnar, Thomas Gleixner
Cc: Alexei Starovoitov, Andrii Nakryiko, Andrey Ryabinin,
Andrew Morton, H . Peter Anvin, Andrey Konovalov, linux-kernel,
x86, bpf, kasan-dev, linux-mm, kernel-team
identify_cpu() unconditionally resets the struct cpuinfo_x86 fields to
their default values and clears the capability arrays with memset()
before rescanning the CPU to fill it in again.
However the boot CPU capabilities have already been scanned by
early_identify_cpu(), with interrupts disabled.
Introduce init_cpu_info() helper in preparation for letting the
callers decide whether the reset is needed.
No functional changes.
Signed-off-by: Ihor Solodrai <ihor.solodrai@linux.dev>
---
arch/x86/kernel/cpu/common.c | 51 ++++++++++++++++++++----------------
1 file changed, 28 insertions(+), 23 deletions(-)
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index c7352827f491..c3dce89ba590 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -1782,6 +1782,32 @@ static void __init cpu_parse_early_param(void)
}
}
+static void init_cpu_info(struct cpuinfo_x86 *c)
+{
+ c->x86_cache_size = 0;
+ c->x86_vendor = X86_VENDOR_UNKNOWN;
+ c->x86_model = c->x86_stepping = 0; /* So far unknown... */
+ c->x86_vendor_id[0] = '\0'; /* Unset */
+ c->x86_model_id[0] = '\0'; /* Unset */
+#ifdef CONFIG_X86_64
+ c->x86_clflush_size = 64;
+ c->x86_phys_bits = 36;
+ c->x86_virt_bits = 48;
+#else
+ c->cpuid_level = -1; /* CPUID not detected */
+ c->x86_clflush_size = 32;
+ c->x86_phys_bits = 32;
+ c->x86_virt_bits = 32;
+#endif
+ c->x86_cache_alignment = c->x86_clflush_size;
+ memset(&c->x86_capability, 0, sizeof(c->x86_capability));
+ memset(&c->cpuid, 0, sizeof(c->cpuid));
+#ifdef CONFIG_X86_VMX_FEATURE_NAMES
+ memset(&c->vmx_capability, 0, sizeof(c->vmx_capability));
+#endif
+ c->extended_cpuid_level = 0;
+}
+
/*
* Do minimum CPU detection early.
* Fields really needed: vendor, cpuid_level, family, model, mask,
@@ -1966,8 +1992,6 @@ void check_null_seg_clears_base(struct cpuinfo_x86 *c)
static void generic_identify(struct cpuinfo_x86 *c)
{
- c->extended_cpuid_level = 0;
-
if (!cpuid_feature())
identify_cpu_without_cpuid(c);
@@ -2011,27 +2035,8 @@ static void identify_cpu(struct cpuinfo_x86 *c)
int i;
c->loops_per_jiffy = loops_per_jiffy;
- c->x86_cache_size = 0;
- c->x86_vendor = X86_VENDOR_UNKNOWN;
- c->x86_model = c->x86_stepping = 0; /* So far unknown... */
- c->x86_vendor_id[0] = '\0'; /* Unset */
- c->x86_model_id[0] = '\0'; /* Unset */
-#ifdef CONFIG_X86_64
- c->x86_clflush_size = 64;
- c->x86_phys_bits = 36;
- c->x86_virt_bits = 48;
-#else
- c->cpuid_level = -1; /* CPUID not detected */
- c->x86_clflush_size = 32;
- c->x86_phys_bits = 32;
- c->x86_virt_bits = 32;
-#endif
- c->x86_cache_alignment = c->x86_clflush_size;
- memset(&c->x86_capability, 0, sizeof(c->x86_capability));
- memset(&c->cpuid, 0, sizeof(c->cpuid));
-#ifdef CONFIG_X86_VMX_FEATURE_NAMES
- memset(&c->vmx_capability, 0, sizeof(c->vmx_capability));
-#endif
+
+ init_cpu_info(c);
generic_identify(c);
--
2.55.0
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v3 2/5] x86/cpu: Initialize boot CPU cpuinfo defaults early
2026-09-16 19:51 [PATCH v3 0/5] x86/cpu: Refactor identify_cpu() Ihor Solodrai
2026-09-16 19:51 ` [PATCH v3 1/5] x86/cpu: Factor init_cpu_info() out of identify_cpu() Ihor Solodrai
@ 2026-09-16 19:52 ` Ihor Solodrai
2026-09-17 2:00 ` [tip: x86/cpu] " tip-bot2 for Ihor Solodrai
2026-09-16 19:52 ` [PATCH v3 3/5] x86/cpu: Inline generic_identify() into identify_cpu() Ihor Solodrai
` (2 subsequent siblings)
4 siblings, 1 reply; 11+ messages in thread
From: Ihor Solodrai @ 2026-09-16 19:52 UTC (permalink / raw)
To: Borislav Petkov, Dave Hansen, Ingo Molnar, Thomas Gleixner
Cc: Alexei Starovoitov, Andrii Nakryiko, Andrey Ryabinin,
Andrew Morton, H . Peter Anvin, Andrey Konovalov, linux-kernel,
x86, bpf, kasan-dev, linux-mm, kernel-team
early_identify_cpu() clears the capability array, the CPUID table and
extended_cpuid_level, but the architectural defaults for the rest of
struct cpuinfo_x86 are set only later, in identify_cpu().
Use the same defaults from the start, so that the boot CPU does not
depend on a later reset to end up with the right ones.
Signed-off-by: Ihor Solodrai <ihor.solodrai@linux.dev>
---
This change comes before the last patch because that one removes the
reset: without the defaults established here the boot CPU would be
left at 32 instead of 64 on an x86_64 CPU which does not enumerate
CLFLUSH.
---
arch/x86/kernel/cpu/common.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index c3dce89ba590..66695addbdf3 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -1812,16 +1812,15 @@ static void init_cpu_info(struct cpuinfo_x86 *c)
* Do minimum CPU detection early.
* Fields really needed: vendor, cpuid_level, family, model, mask,
* cache alignment.
- * The others are not touched to avoid unwanted side effects.
+ * The others are reset to their defaults here and only filled in later,
+ * by identify_cpu().
*
* WARNING: this function is only called on the boot CPU. Don't add code
* here that is supposed to run on all CPUs.
*/
static void __init early_identify_cpu(struct cpuinfo_x86 *c)
{
- memset(&c->x86_capability, 0, sizeof(c->x86_capability));
- memset(&c->cpuid, 0, sizeof(c->cpuid));
- c->extended_cpuid_level = 0;
+ init_cpu_info(c);
if (!cpuid_feature())
identify_cpu_without_cpuid(c);
--
2.55.0
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v3 3/5] x86/cpu: Inline generic_identify() into identify_cpu()
2026-09-16 19:51 [PATCH v3 0/5] x86/cpu: Refactor identify_cpu() Ihor Solodrai
2026-09-16 19:51 ` [PATCH v3 1/5] x86/cpu: Factor init_cpu_info() out of identify_cpu() Ihor Solodrai
2026-09-16 19:52 ` [PATCH v3 2/5] x86/cpu: Initialize boot CPU cpuinfo defaults early Ihor Solodrai
@ 2026-09-16 19:52 ` Ihor Solodrai
2026-09-17 2:00 ` [tip: x86/cpu] " tip-bot2 for Ihor Solodrai
2026-09-16 19:52 ` [PATCH v3 4/5] x86/cpu: Move 32-bit SEP setup " Ihor Solodrai
2026-09-16 19:52 ` [PATCH v3 5/5] x86/cpu: Don't transiently clear the boot CPU's capabilities Ihor Solodrai
4 siblings, 1 reply; 11+ messages in thread
From: Ihor Solodrai @ 2026-09-16 19:52 UTC (permalink / raw)
To: Borislav Petkov, Dave Hansen, Ingo Molnar, Thomas Gleixner
Cc: Alexei Starovoitov, Andrii Nakryiko, Andrey Ryabinin,
Andrew Morton, H . Peter Anvin, Andrey Konovalov, linux-kernel,
x86, bpf, kasan-dev, linux-mm, kernel-team
generic_identify() has exactly one call site: at the top of
identify_cpu(). Fold it into identify_cpu() so that a single function
does the job for both the boot CPU and the secondary CPUs.
While at it, fix up both copies of the Cyrix comment.
No functional changes.
Signed-off-by: Ihor Solodrai <ihor.solodrai@linux.dev>
---
arch/x86/kernel/cpu/common.c | 32 ++++++++++++++------------------
1 file changed, 14 insertions(+), 18 deletions(-)
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index 66695addbdf3..2b2a4c40ef76 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -1825,7 +1825,7 @@ static void __init early_identify_cpu(struct cpuinfo_x86 *c)
if (!cpuid_feature())
identify_cpu_without_cpuid(c);
- /* cyrix could have cpuid enabled via c_identify()*/
+ /* Cyrix could have CPUID enabled via c_identify(). */
if (cpuid_feature()) {
cpuid_scan_cpu(c);
cpu_detect(c);
@@ -1989,14 +1989,23 @@ void check_null_seg_clears_base(struct cpuinfo_x86 *c)
set_cpu_bug(c, X86_BUG_NULL_SEG);
}
-static void generic_identify(struct cpuinfo_x86 *c)
+/*
+ * This does the hard work of actually picking apart the CPU stuff...
+ */
+static void identify_cpu(struct cpuinfo_x86 *c)
{
+ int i;
+
+ c->loops_per_jiffy = loops_per_jiffy;
+
+ init_cpu_info(c);
+
if (!cpuid_feature())
identify_cpu_without_cpuid(c);
- /* cyrix could have cpuid enabled via c_identify()*/
+ /* Cyrix could have CPUID enabled via c_identify(). */
if (!cpuid_feature())
- return;
+ goto no_cpuid;
cpuid_scan_cpu(c);
cpu_detect(c);
@@ -2024,21 +2033,8 @@ static void generic_identify(struct cpuinfo_x86 *c)
#ifdef CONFIG_X86_32
set_cpu_bug(c, X86_BUG_ESPFIX);
#endif
-}
-
-/*
- * This does the hard work of actually picking apart the CPU stuff...
- */
-static void identify_cpu(struct cpuinfo_x86 *c)
-{
- int i;
-
- c->loops_per_jiffy = loops_per_jiffy;
-
- init_cpu_info(c);
-
- generic_identify(c);
+no_cpuid:
cpu_parse_topology(c);
if (this_cpu->c_identify)
--
2.55.0
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v3 4/5] x86/cpu: Move 32-bit SEP setup into identify_cpu()
2026-09-16 19:51 [PATCH v3 0/5] x86/cpu: Refactor identify_cpu() Ihor Solodrai
` (2 preceding siblings ...)
2026-09-16 19:52 ` [PATCH v3 3/5] x86/cpu: Inline generic_identify() into identify_cpu() Ihor Solodrai
@ 2026-09-16 19:52 ` Ihor Solodrai
2026-09-17 2:00 ` [tip: x86/cpu] " tip-bot2 for Ihor Solodrai
2026-09-16 19:52 ` [PATCH v3 5/5] x86/cpu: Don't transiently clear the boot CPU's capabilities Ihor Solodrai
4 siblings, 1 reply; 11+ messages in thread
From: Ihor Solodrai @ 2026-09-16 19:52 UTC (permalink / raw)
To: Borislav Petkov, Dave Hansen, Ingo Molnar, Thomas Gleixner
Cc: Alexei Starovoitov, Andrii Nakryiko, Andrey Ryabinin,
Andrew Morton, H . Peter Anvin, Andrey Konovalov, linux-kernel,
x86, bpf, kasan-dev, linux-mm, kernel-team
identify_boot_cpu() and identify_secondary_cpu() both call
enable_sep_cpu() under CONFIG_X86_32 immediately after identify_cpu().
Do it once and drop the ifdefs while at it.
No functional changes.
Reviewed-by: Nikolay Borisov <nik.borisov@suse.com>
Signed-off-by: Ihor Solodrai <ihor.solodrai@linux.dev>
---
arch/x86/kernel/cpu/common.c | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index 2b2a4c40ef76..83d613d07997 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -2126,6 +2126,9 @@ static void identify_cpu(struct cpuinfo_x86 *c)
mcheck_cpu_init(c);
numa_add_cpu(smp_processor_id());
+
+ if (IS_ENABLED(CONFIG_X86_32))
+ enable_sep_cpu();
}
/*
@@ -2163,9 +2166,6 @@ static __init void identify_boot_cpu(void)
identify_cpu(&boot_cpu_data);
if (HAS_KERNEL_IBT && cpu_feature_enabled(X86_FEATURE_IBT))
pr_info("CET detected: Indirect Branch Tracking enabled\n");
-#ifdef CONFIG_X86_32
- enable_sep_cpu();
-#endif
cpu_detect_tlb(&boot_cpu_data);
setup_cr_pinning();
@@ -2185,9 +2185,6 @@ void identify_secondary_cpu(unsigned int cpu)
c->cpu_index = cpu;
identify_cpu(c);
-#ifdef CONFIG_X86_32
- enable_sep_cpu();
-#endif
x86_spec_ctrl_setup_ap();
update_srbds_msr();
if (boot_cpu_has_bug(X86_BUG_GDS))
--
2.55.0
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v3 5/5] x86/cpu: Don't transiently clear the boot CPU's capabilities
2026-09-16 19:51 [PATCH v3 0/5] x86/cpu: Refactor identify_cpu() Ihor Solodrai
` (3 preceding siblings ...)
2026-09-16 19:52 ` [PATCH v3 4/5] x86/cpu: Move 32-bit SEP setup " Ihor Solodrai
@ 2026-09-16 19:52 ` Ihor Solodrai
2026-09-17 2:00 ` [tip: x86/cpu] " tip-bot2 for Ihor Solodrai
4 siblings, 1 reply; 11+ messages in thread
From: Ihor Solodrai @ 2026-09-16 19:52 UTC (permalink / raw)
To: Borislav Petkov, Dave Hansen, Ingo Molnar, Thomas Gleixner
Cc: Alexei Starovoitov, Andrii Nakryiko, Andrey Ryabinin,
Andrew Morton, H . Peter Anvin, Andrey Konovalov, linux-kernel,
x86, bpf, kasan-dev, linux-mm, kernel-team
On the boot CPU identify_cpu() runs from arch_cpu_finalize_init(),
with interrupts enabled and before alternatives are patched. So
cpu_feature_enabled() still evaluates against boot_cpu_data.
identify_cpu() rebuilds c->x86_capability from scratch: the reset
zeroes the array and the CPUID rescan fills it in again. An interrupt
delivered in that window finds X86_FEATURE_LA57 clear in
boot_cpu_data, so pgtable_l5_enabled() is false and KASAN checks a
5-level address against the 4-level addressability limit. The result
is a bogus "wild-memory-access" report, and under kasan_multi_shot a
report storm that wedges the boot.
The boot CPU has already been scanned by early_identify_cpu(), with
interrupts disabled, and its capabilities cannot have changed
since. Reset only the CPUs which have not been scanned yet.
The window is as old as identify_cpu() rebuilding the capabilities.
Commit 39b9552281ab ("x86/mm: Optimize boot-time paging mode switching
cost") merely let KASAN notice it by making pgtable_l5_enabled() read
the feature bit. So no Fixes: tag.
Closes: https://lore.kernel.org/bpf/20260610175651.647515-1-ihor.solodrai@linux.dev/
Signed-off-by: Ihor Solodrai <ihor.solodrai@linux.dev>
---
arch/x86/kernel/cpu/common.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index 83d613d07997..496ffe429496 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -1998,8 +1998,6 @@ static void identify_cpu(struct cpuinfo_x86 *c)
c->loops_per_jiffy = loops_per_jiffy;
- init_cpu_info(c);
-
if (!cpuid_feature())
identify_cpu_without_cpuid(c);
@@ -2184,6 +2182,7 @@ void identify_secondary_cpu(unsigned int cpu)
*c = boot_cpu_data;
c->cpu_index = cpu;
+ init_cpu_info(c);
identify_cpu(c);
x86_spec_ctrl_setup_ap();
update_srbds_msr();
--
2.55.0
^ permalink raw reply [flat|nested] 11+ messages in thread
* [tip: x86/cpu] x86/cpu: Don't transiently clear the boot CPU's capabilities
2026-09-16 19:52 ` [PATCH v3 5/5] x86/cpu: Don't transiently clear the boot CPU's capabilities Ihor Solodrai
@ 2026-09-17 2:00 ` tip-bot2 for Ihor Solodrai
0 siblings, 0 replies; 11+ messages in thread
From: tip-bot2 for Ihor Solodrai @ 2026-09-17 2:00 UTC (permalink / raw)
To: linux-tip-commits; +Cc: Ihor Solodrai, Borislav Petkov (AMD), x86, linux-kernel
The following commit has been merged into the x86/cpu branch of tip:
Commit-ID: 2711d67bc3a776abcfc651ad87be5d29ada19166
Gitweb: https://git.kernel.org/tip/2711d67bc3a776abcfc651ad87be5d29ada19166
Author: Ihor Solodrai <ihor.solodrai@linux.dev>
AuthorDate: Wed, 16 Sep 2026 12:52:03 -07:00
Committer: Borislav Petkov (AMD) <bp@alien8.de>
CommitterDate: Thu, 17 Sep 2026 02:05:39 +02:00
x86/cpu: Don't transiently clear the boot CPU's capabilities
On the boot CPU, identify_cpu() runs from arch_cpu_finalize_init(), with
interrupts enabled and before alternatives are patched. So
cpu_feature_enabled() still evaluates against boot_cpu_data.
identify_cpu() rebuilds c->x86_capability from scratch: the reset zeroes the
array and the CPUID rescan fills it in again. An interrupt delivered in that
window finds X86_FEATURE_LA57 clear in boot_cpu_data, so pgtable_l5_enabled()
is false and KASAN checks a 5-level address against the 4-level addressability
limit. The result is a bogus "wild-memory-access" report, and under
kasan_multi_shot a report storm that wedges the boot.
The boot CPU has already been scanned by early_identify_cpu(), with interrupts
disabled, and its capabilities cannot have changed since. Reset only the CPUs
which have not been scanned yet.
The window is as old as identify_cpu() rebuilding the capabilities. Commit
39b9552281ab ("x86/mm: Optimize boot-time paging mode switching cost")
merely let KASAN notice it by making pgtable_l5_enabled() read the feature
bit. So no Fixes: tag.
Closes: https://lore.kernel.org/bpf/20260610175651.647515-1-ihor.solodrai@linux.dev/
Signed-off-by: Ihor Solodrai <ihor.solodrai@linux.dev>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Link: https://patch.msgid.link/20260916195203.1099646-6-ihor.solodrai@linux.dev
---
arch/x86/kernel/cpu/common.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index 156a7b8..7d4ff29 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -2000,8 +2000,6 @@ static void identify_cpu(struct cpuinfo_x86 *c)
c->loops_per_jiffy = loops_per_jiffy;
- init_cpu_info(c);
-
if (!cpuid_feature())
identify_cpu_without_cpuid(c);
@@ -2186,6 +2184,7 @@ void identify_secondary_cpu(unsigned int cpu)
*c = boot_cpu_data;
c->cpu_index = cpu;
+ init_cpu_info(c);
identify_cpu(c);
x86_spec_ctrl_setup_ap();
update_srbds_msr();
^ permalink raw reply [flat|nested] 11+ messages in thread
* [tip: x86/cpu] x86/cpu: Move 32-bit SEP setup into identify_cpu()
2026-09-16 19:52 ` [PATCH v3 4/5] x86/cpu: Move 32-bit SEP setup " Ihor Solodrai
@ 2026-09-17 2:00 ` tip-bot2 for Ihor Solodrai
0 siblings, 0 replies; 11+ messages in thread
From: tip-bot2 for Ihor Solodrai @ 2026-09-17 2:00 UTC (permalink / raw)
To: linux-tip-commits
Cc: Ihor Solodrai, Borislav Petkov (AMD), Nikolay Borisov, x86, linux-kernel
The following commit has been merged into the x86/cpu branch of tip:
Commit-ID: db349783ca7aa99345f3809523bff2db8f8714de
Gitweb: https://git.kernel.org/tip/db349783ca7aa99345f3809523bff2db8f8714de
Author: Ihor Solodrai <ihor.solodrai@linux.dev>
AuthorDate: Wed, 16 Sep 2026 12:52:02 -07:00
Committer: Borislav Petkov (AMD) <bp@alien8.de>
CommitterDate: Thu, 17 Sep 2026 02:02:18 +02:00
x86/cpu: Move 32-bit SEP setup into identify_cpu()
identify_boot_cpu() and identify_secondary_cpu() both call
enable_sep_cpu() under CONFIG_X86_32 immediately after identify_cpu().
Do it once and drop the ifdefs while at it.
No functional changes.
Signed-off-by: Ihor Solodrai <ihor.solodrai@linux.dev>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Reviewed-by: Nikolay Borisov <nik.borisov@suse.com>
Link: https://patch.msgid.link/20260916195203.1099646-5-ihor.solodrai@linux.dev
---
arch/x86/kernel/cpu/common.c | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index 79a1260..156a7b8 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -2128,6 +2128,9 @@ no_cpuid:
mcheck_cpu_init(c);
numa_add_cpu(smp_processor_id());
+
+ if (IS_ENABLED(CONFIG_X86_32))
+ enable_sep_cpu();
}
/*
@@ -2165,9 +2168,6 @@ static __init void identify_boot_cpu(void)
identify_cpu(&boot_cpu_data);
if (HAS_KERNEL_IBT && cpu_feature_enabled(X86_FEATURE_IBT))
pr_info("CET detected: Indirect Branch Tracking enabled\n");
-#ifdef CONFIG_X86_32
- enable_sep_cpu();
-#endif
cpu_detect_tlb(&boot_cpu_data);
setup_cr_pinning();
@@ -2187,9 +2187,6 @@ void identify_secondary_cpu(unsigned int cpu)
c->cpu_index = cpu;
identify_cpu(c);
-#ifdef CONFIG_X86_32
- enable_sep_cpu();
-#endif
x86_spec_ctrl_setup_ap();
update_srbds_msr();
if (boot_cpu_has_bug(X86_BUG_GDS))
^ permalink raw reply [flat|nested] 11+ messages in thread
* [tip: x86/cpu] x86/cpu: Inline generic_identify() into identify_cpu()
2026-09-16 19:52 ` [PATCH v3 3/5] x86/cpu: Inline generic_identify() into identify_cpu() Ihor Solodrai
@ 2026-09-17 2:00 ` tip-bot2 for Ihor Solodrai
0 siblings, 0 replies; 11+ messages in thread
From: tip-bot2 for Ihor Solodrai @ 2026-09-17 2:00 UTC (permalink / raw)
To: linux-tip-commits; +Cc: Ihor Solodrai, Borislav Petkov (AMD), x86, linux-kernel
The following commit has been merged into the x86/cpu branch of tip:
Commit-ID: ad86fe2134ccdc97a967693d2723a731c99fb7bc
Gitweb: https://git.kernel.org/tip/ad86fe2134ccdc97a967693d2723a731c99fb7bc
Author: Ihor Solodrai <ihor.solodrai@linux.dev>
AuthorDate: Wed, 16 Sep 2026 12:52:01 -07:00
Committer: Borislav Petkov (AMD) <bp@alien8.de>
CommitterDate: Thu, 17 Sep 2026 02:00:25 +02:00
x86/cpu: Inline generic_identify() into identify_cpu()
generic_identify() has exactly one call site: at the top of
identify_cpu(). Fold it into identify_cpu() so that a single function
does the job for both the boot CPU and the secondary CPUs.
While at it, fix up both copies of the Cyrix comment.
No functional changes.
Signed-off-by: Ihor Solodrai <ihor.solodrai@linux.dev>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Link: https://patch.msgid.link/20260916195203.1099646-4-ihor.solodrai@linux.dev
---
arch/x86/kernel/cpu/common.c | 32 ++++++++++++++------------------
1 file changed, 14 insertions(+), 18 deletions(-)
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index d1a949a..79a1260 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -1827,7 +1827,7 @@ static void __init early_identify_cpu(struct cpuinfo_x86 *c)
if (!cpuid_feature())
identify_cpu_without_cpuid(c);
- /* cyrix could have cpuid enabled via c_identify()*/
+ /* Cyrix could have CPUID enabled via c_identify(). */
if (cpuid_feature()) {
cpuid_scan_cpu(c);
cpu_detect(c);
@@ -1991,14 +1991,23 @@ void check_null_seg_clears_base(struct cpuinfo_x86 *c)
set_cpu_bug(c, X86_BUG_NULL_SEG);
}
-static void generic_identify(struct cpuinfo_x86 *c)
+/*
+ * This does the hard work of actually picking apart the CPU stuff...
+ */
+static void identify_cpu(struct cpuinfo_x86 *c)
{
+ int i;
+
+ c->loops_per_jiffy = loops_per_jiffy;
+
+ init_cpu_info(c);
+
if (!cpuid_feature())
identify_cpu_without_cpuid(c);
- /* cyrix could have cpuid enabled via c_identify()*/
+ /* Cyrix could have CPUID enabled via c_identify(). */
if (!cpuid_feature())
- return;
+ goto no_cpuid;
cpuid_scan_cpu(c);
cpu_detect(c);
@@ -2026,21 +2035,8 @@ static void generic_identify(struct cpuinfo_x86 *c)
#ifdef CONFIG_X86_32
set_cpu_bug(c, X86_BUG_ESPFIX);
#endif
-}
-
-/*
- * This does the hard work of actually picking apart the CPU stuff...
- */
-static void identify_cpu(struct cpuinfo_x86 *c)
-{
- int i;
-
- c->loops_per_jiffy = loops_per_jiffy;
-
- init_cpu_info(c);
-
- generic_identify(c);
+no_cpuid:
cpu_parse_topology(c);
if (this_cpu->c_identify)
^ permalink raw reply [flat|nested] 11+ messages in thread
* [tip: x86/cpu] x86/cpu: Initialize boot CPU cpuinfo defaults early
2026-09-16 19:52 ` [PATCH v3 2/5] x86/cpu: Initialize boot CPU cpuinfo defaults early Ihor Solodrai
@ 2026-09-17 2:00 ` tip-bot2 for Ihor Solodrai
0 siblings, 0 replies; 11+ messages in thread
From: tip-bot2 for Ihor Solodrai @ 2026-09-17 2:00 UTC (permalink / raw)
To: linux-tip-commits; +Cc: Ihor Solodrai, Borislav Petkov (AMD), x86, linux-kernel
The following commit has been merged into the x86/cpu branch of tip:
Commit-ID: 7a762b51a149b7bfe431a7571bc7df4beea52e5c
Gitweb: https://git.kernel.org/tip/7a762b51a149b7bfe431a7571bc7df4beea52e5c
Author: Ihor Solodrai <ihor.solodrai@linux.dev>
AuthorDate: Wed, 16 Sep 2026 12:52:00 -07:00
Committer: Borislav Petkov (AMD) <bp@alien8.de>
CommitterDate: Thu, 17 Sep 2026 01:57:26 +02:00
x86/cpu: Initialize boot CPU cpuinfo defaults early
early_identify_cpu() clears the capability array, the CPUID table and
extended_cpuid_level, but the architectural defaults for the rest of struct
cpuinfo_x86 are set only later, in identify_cpu().
Use the same defaults from the start, so that the boot CPU does not
depend on a later reset to end up with the right ones.
Signed-off-by: Ihor Solodrai <ihor.solodrai@linux.dev>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Link: https://patch.msgid.link/20260916195203.1099646-3-ihor.solodrai@linux.dev
---
arch/x86/kernel/cpu/common.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index 173748a..d1a949a 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -1814,16 +1814,15 @@ static void init_cpu_info(struct cpuinfo_x86 *c)
* Do minimum CPU detection early.
* Fields really needed: vendor, cpuid_level, family, model, mask,
* cache alignment.
- * The others are not touched to avoid unwanted side effects.
+ * The others are reset to their defaults here and only filled in later,
+ * by identify_cpu().
*
* WARNING: this function is only called on the boot CPU. Don't add code
* here that is supposed to run on all CPUs.
*/
static void __init early_identify_cpu(struct cpuinfo_x86 *c)
{
- memset(&c->x86_capability, 0, sizeof(c->x86_capability));
- memset(&c->cpuid, 0, sizeof(c->cpuid));
- c->extended_cpuid_level = 0;
+ init_cpu_info(c);
if (!cpuid_feature())
identify_cpu_without_cpuid(c);
^ permalink raw reply [flat|nested] 11+ messages in thread
* [tip: x86/cpu] x86/cpu: Factor init_cpu_info() out of identify_cpu()
2026-09-16 19:51 ` [PATCH v3 1/5] x86/cpu: Factor init_cpu_info() out of identify_cpu() Ihor Solodrai
@ 2026-09-17 2:00 ` tip-bot2 for Ihor Solodrai
0 siblings, 0 replies; 11+ messages in thread
From: tip-bot2 for Ihor Solodrai @ 2026-09-17 2:00 UTC (permalink / raw)
To: linux-tip-commits; +Cc: Ihor Solodrai, Borislav Petkov (AMD), x86, linux-kernel
The following commit has been merged into the x86/cpu branch of tip:
Commit-ID: 54a2882ab9f75ab8a77a4f113145d4d709d2387c
Gitweb: https://git.kernel.org/tip/54a2882ab9f75ab8a77a4f113145d4d709d2387c
Author: Ihor Solodrai <ihor.solodrai@linux.dev>
AuthorDate: Wed, 16 Sep 2026 12:51:59 -07:00
Committer: Borislav Petkov (AMD) <bp@alien8.de>
CommitterDate: Thu, 17 Sep 2026 01:54:28 +02:00
x86/cpu: Factor init_cpu_info() out of identify_cpu()
identify_cpu() unconditionally resets the struct cpuinfo_x86 fields to
their default values and clears the capability arrays with memset()
before rescanning the CPU to fill it in again.
However the boot CPU capabilities have already been scanned by
early_identify_cpu(), with interrupts disabled.
Introduce init_cpu_info() helper in preparation for letting the
callers decide whether the reset is needed.
No functional changes.
Signed-off-by: Ihor Solodrai <ihor.solodrai@linux.dev>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Link: https://patch.msgid.link/20260916195203.1099646-2-ihor.solodrai@linux.dev
---
arch/x86/kernel/cpu/common.c | 51 +++++++++++++++++++----------------
1 file changed, 28 insertions(+), 23 deletions(-)
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index 3716a6a..173748a 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -1784,6 +1784,32 @@ static void __init cpu_parse_early_param(void)
}
}
+static void init_cpu_info(struct cpuinfo_x86 *c)
+{
+ c->x86_cache_size = 0;
+ c->x86_vendor = X86_VENDOR_UNKNOWN;
+ c->x86_model = c->x86_stepping = 0; /* So far unknown... */
+ c->x86_vendor_id[0] = '\0'; /* Unset */
+ c->x86_model_id[0] = '\0'; /* Unset */
+#ifdef CONFIG_X86_64
+ c->x86_clflush_size = 64;
+ c->x86_phys_bits = 36;
+ c->x86_virt_bits = 48;
+#else
+ c->cpuid_level = -1; /* CPUID not detected */
+ c->x86_clflush_size = 32;
+ c->x86_phys_bits = 32;
+ c->x86_virt_bits = 32;
+#endif
+ c->x86_cache_alignment = c->x86_clflush_size;
+ memset(&c->x86_capability, 0, sizeof(c->x86_capability));
+ memset(&c->cpuid, 0, sizeof(c->cpuid));
+#ifdef CONFIG_X86_VMX_FEATURE_NAMES
+ memset(&c->vmx_capability, 0, sizeof(c->vmx_capability));
+#endif
+ c->extended_cpuid_level = 0;
+}
+
/*
* Do minimum CPU detection early.
* Fields really needed: vendor, cpuid_level, family, model, mask,
@@ -1968,8 +1994,6 @@ void check_null_seg_clears_base(struct cpuinfo_x86 *c)
static void generic_identify(struct cpuinfo_x86 *c)
{
- c->extended_cpuid_level = 0;
-
if (!cpuid_feature())
identify_cpu_without_cpuid(c);
@@ -2013,27 +2037,8 @@ static void identify_cpu(struct cpuinfo_x86 *c)
int i;
c->loops_per_jiffy = loops_per_jiffy;
- c->x86_cache_size = 0;
- c->x86_vendor = X86_VENDOR_UNKNOWN;
- c->x86_model = c->x86_stepping = 0; /* So far unknown... */
- c->x86_vendor_id[0] = '\0'; /* Unset */
- c->x86_model_id[0] = '\0'; /* Unset */
-#ifdef CONFIG_X86_64
- c->x86_clflush_size = 64;
- c->x86_phys_bits = 36;
- c->x86_virt_bits = 48;
-#else
- c->cpuid_level = -1; /* CPUID not detected */
- c->x86_clflush_size = 32;
- c->x86_phys_bits = 32;
- c->x86_virt_bits = 32;
-#endif
- c->x86_cache_alignment = c->x86_clflush_size;
- memset(&c->x86_capability, 0, sizeof(c->x86_capability));
- memset(&c->cpuid, 0, sizeof(c->cpuid));
-#ifdef CONFIG_X86_VMX_FEATURE_NAMES
- memset(&c->vmx_capability, 0, sizeof(c->vmx_capability));
-#endif
+
+ init_cpu_info(c);
generic_identify(c);
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2026-09-17 2:00 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-09-16 19:51 [PATCH v3 0/5] x86/cpu: Refactor identify_cpu() Ihor Solodrai
2026-09-16 19:51 ` [PATCH v3 1/5] x86/cpu: Factor init_cpu_info() out of identify_cpu() Ihor Solodrai
2026-09-17 2:00 ` [tip: x86/cpu] " tip-bot2 for Ihor Solodrai
2026-09-16 19:52 ` [PATCH v3 2/5] x86/cpu: Initialize boot CPU cpuinfo defaults early Ihor Solodrai
2026-09-17 2:00 ` [tip: x86/cpu] " tip-bot2 for Ihor Solodrai
2026-09-16 19:52 ` [PATCH v3 3/5] x86/cpu: Inline generic_identify() into identify_cpu() Ihor Solodrai
2026-09-17 2:00 ` [tip: x86/cpu] " tip-bot2 for Ihor Solodrai
2026-09-16 19:52 ` [PATCH v3 4/5] x86/cpu: Move 32-bit SEP setup " Ihor Solodrai
2026-09-17 2:00 ` [tip: x86/cpu] " tip-bot2 for Ihor Solodrai
2026-09-16 19:52 ` [PATCH v3 5/5] x86/cpu: Don't transiently clear the boot CPU's capabilities Ihor Solodrai
2026-09-17 2:00 ` [tip: x86/cpu] " tip-bot2 for Ihor Solodrai
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®