[PATCH v12 11/15] x86/mm: Initialize LAM_SUP

From: Maciej Wieczor-Retman

Date: Mon Mar 30 2026 - 10:46:04 EST


From: Maciej Wieczor-Retman <maciej.wieczor-retman@xxxxxxxxx>

To make use of KASAN's tag based mode on x86, Linear Address Masking
(LAM) needs to be enabled. To do a bit in CR4 has to be set.

When launching secondary CPUs the LAM CR4 bit needs to be added to a
mask in head_64.S. Bits that are not part of that mask are cleared when
secondary CPUs are getting enabled by the primary one.

Signed-off-by: Maciej Wieczor-Retman <maciej.wieczor-retman@xxxxxxxxx>
Acked-by: Alexander Potapenko <glider@xxxxxxxxxx>
---
Changelog v11:
- Redo the patch message according to Dave's suggestions.

Changelog v9:
- Rename patch title so it fits the tip standards.

Changelog v7:
- Add Alexander's acked-by tag.

Changelog v6:
- boot_cpu_has() -> cpu_feature_enabled()

arch/x86/kernel/head_64.S | 3 +++
arch/x86/mm/init.c | 3 +++
2 files changed, 6 insertions(+)

diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S
index 7ed5520dd52e..87d1c08fd932 100644
--- a/arch/x86/kernel/head_64.S
+++ b/arch/x86/kernel/head_64.S
@@ -209,6 +209,9 @@ SYM_INNER_LABEL(common_startup_64, SYM_L_LOCAL)
* there will be no global TLB entries after the execution."
*/
movl $(X86_CR4_PAE | X86_CR4_LA57), %edx
+#ifdef CONFIG_ADDRESS_MASKING
+ orl $X86_CR4_LAM_SUP, %edx
+#endif
#ifdef CONFIG_X86_MCE
/*
* Preserve CR4.MCE if the kernel will enable #MC support.
diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c
index fb67217fddcd..11804ccf2fbb 100644
--- a/arch/x86/mm/init.c
+++ b/arch/x86/mm/init.c
@@ -763,6 +763,9 @@ void __init init_mem_mapping(void)
probe_page_size_mask();
setup_pcid();

+ if (cpu_feature_enabled(X86_FEATURE_LAM) && IS_ENABLED(CONFIG_KASAN_SW_TAGS))
+ cr4_set_bits_and_update_boot(X86_CR4_LAM_SUP);
+
#ifdef CONFIG_X86_64
end = max_pfn << PAGE_SHIFT;
#else
--
2.53.0