[PATCH v11 11/15] x86/mm: Initialize LAM_SUP
From: Maciej Wieczor-Retman
Date: Tue Mar 10 2026 - 14:00:06 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 cbf7647a25d8..253667acd8a5 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