[RFC PATCH 3/8] arm64: head: take KASLR seed passed via x1 into account
Ard Biesheuvel
ardb at kernel.org
Fri Mar 4 09:56:52 PST 2022
If the kernel was entered with the MMU on, use the value passed via
register x1 as the seed for virtual randomization rather than the one
passed via the /chosen/kaslr-seed DT property. This removes the need to
map and unmap the kernel just to access the DT.
Note that kaslr_early_init() still needs to be called exactly once in
this case, to set the other KASLR related state, so ensure that this
happens when called with the MMU on.
Signed-off-by: Ard Biesheuvel <ardb at kernel.org>
---
arch/arm64/kernel/head.S | 28 ++++++++++++++++++--
1 file changed, 26 insertions(+), 2 deletions(-)
diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S
index bec9c1483584..0726ce0d6fd4 100644
--- a/arch/arm64/kernel/head.S
+++ b/arch/arm64/kernel/head.S
@@ -91,10 +91,9 @@
*/
SYM_CODE_START(primary_entry)
bl record_mmu_state
+ bl record_kaslr_offset
bl preserve_boot_args
bl init_kernel_el // w0=cpu_boot_mode
- adrp x23, __PHYS_OFFSET
- and x23, x23, MIN_KIMG_ALIGN - 1 // KASLR offset, defaults to 0
bl set_cpu_boot_mode_flag
bl __create_page_tables
/*
@@ -117,6 +116,29 @@ SYM_CODE_START_LOCAL(record_mmu_state)
ret
SYM_CODE_END(record_mmu_state)
+SYM_CODE_START_LOCAL(record_kaslr_offset)
+ adrp x23, __PHYS_OFFSET
+ and x23, x23, MIN_KIMG_ALIGN - 1 // KASLR offset, defaults to 0
+ cbz x25, 0f // skip if MMU is disabled
+#ifdef CONFIG_RANDOMIZE_BASE
+ /*
+ * Calculate the virtual randomization that will be applied based on
+ * the KASLR seed passed via x1, if provided.
+ */
+ and x4, x1, ~(MIN_KIMG_ALIGN - 1)
+ and x4, x4, #(1 << (VA_BITS_MIN - 2)) - 1
+ mov x5, #1 << (VA_BITS_MIN - 3)
+ add x4, x4, x5
+#if !defined(CONFIG_KASAN_VMALLOC) && \
+ (defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS))
+ and x4, x4, #(1 << 31) - 1 // limit to 2G
+#endif
+ orr x23, x23, x4
+ mov x1, xzr // wipe the seed from x1
+#endif
+0: ret
+SYM_CODE_END(record_kaslr_offset)
+
/*
* Preserve the arguments passed by the bootloader in x0 .. x3
*/
@@ -467,8 +489,10 @@ SYM_FUNC_START_LOCAL(__primary_switched)
bl init_feature_override // Parse cpu feature overrides
#ifdef CONFIG_RANDOMIZE_BASE
tst x23, ~(MIN_KIMG_ALIGN - 1) // already running randomized?
+ ccmp x25, #1, #4, ne // and we booted with the MMU off?
b.ne 0f
bl kaslr_early_init // parse FDT for KASLR options
+ cbnz x25, 0f // MMU was on?
cbz x0, 0f // KASLR disabled? just proceed
orr x23, x23, x0 // record KASLR offset
ldp x29, x30, [sp], #16 // we must enable KASLR, return
--
2.30.2
More information about the linux-arm-kernel
mailing list