[PATCH v16 25/38] x86/boot: Slight refactor of the 5 level paging logic
From: Ross Philipson
Date: Fri May 15 2026 - 17:24:21 EST
From: Ard Biesheuvel <ardb@xxxxxxxxxx>
In preparation for adding Secure Launch support, which will require that
the number of paging levels remains untouched, tweak the logic slightly
so that the slaunch check can be inserted easily.
No functional change intended.
Signed-off-by: Ard Biesheuvel <ardb@xxxxxxxxxx>
Signed-off-by: Ross Philipson <ross.philipson@xxxxxxxxx>
---
arch/x86/boot/compressed/pgtable_64.c | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/arch/x86/boot/compressed/pgtable_64.c b/arch/x86/boot/compressed/pgtable_64.c
index 0e89e197e112..3e9d651da73e 100644
--- a/arch/x86/boot/compressed/pgtable_64.c
+++ b/arch/x86/boot/compressed/pgtable_64.c
@@ -102,6 +102,7 @@ static unsigned long find_trampoline_placement(void)
asmlinkage void configure_5level_paging(struct boot_params *bp, void *pgtable)
{
+ bool l5_enabled = native_read_cr4() & X86_CR4_LA57;
void (*toggle_la57)(void *cr3);
bool l5_required = false;
@@ -118,10 +119,12 @@ asmlinkage void configure_5level_paging(struct boot_params *bp, void *pgtable)
* + CPUID leaf 7 is supported
* + the leaf has the feature bit set
*/
- if (!cmdline_find_option_bool("no5lvl") &&
- native_cpuid_eax(0) >= 7 && (native_cpuid_ecx(7) & BIT(16))) {
- l5_required = true;
+ if (native_cpuid_eax(0) < 7 || !(native_cpuid_ecx(7) & BIT(16)))
+ return;
+
+ l5_required = !cmdline_find_option_bool("no5lvl");
+ if (l5_required) {
/* Initialize variables for 5-level paging */
__pgtable_l5_enabled = 1;
pgdir_shift = 48;
@@ -132,7 +135,7 @@ asmlinkage void configure_5level_paging(struct boot_params *bp, void *pgtable)
* The trampoline will not be used if the paging mode is already set to
* the desired one.
*/
- if (l5_required == !!(native_read_cr4() & X86_CR4_LA57))
+ if (l5_required == l5_enabled)
return;
trampoline_32bit = (unsigned long *)find_trampoline_placement();
--
2.47.3