]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
arm64: head: move memstart_offset_seed handling to C code
authorArd Biesheuvel <ardb@kernel.org>
Wed, 14 Feb 2024 12:29:01 +0000 (13:29 +0100)
committerCatalin Marinas <catalin.marinas@arm.com>
Fri, 16 Feb 2024 12:42:32 +0000 (12:42 +0000)
Now that we can set BSS variables from the early code running from the
ID map, we can set memstart_offset_seed directly from the C code that
derives the value instead of passing it back and forth between C and asm
code.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Link: https://lore.kernel.org/r/20240214122845.2033971-60-ardb+git@google.com
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm64/kernel/head.S
arch/arm64/kernel/image-vars.h
arch/arm64/kernel/pi/kaslr_early.c

index b320702032a7e0750807434ee997d133ccf3de62..aa7766dc64d9f5ec00c7e4caa888665e5ea5620f 100644 (file)
@@ -82,7 +82,6 @@
         *  x21        primary_entry() .. start_kernel()        FDT pointer passed at boot in x0
         *  x22        create_idmap() .. start_kernel()         ID map VA of the DT blob
         *  x23        __primary_switch()                       physical misalignment/KASLR offset
-        *  x24        __primary_switch()                       linear map KASLR seed
         *  x25        primary_entry() .. start_kernel()        supported VA size
         *  x28        create_idmap()                           callee preserved temp register
         */
@@ -483,11 +482,6 @@ SYM_FUNC_START_LOCAL(__primary_switched)
        str     x25, [x8]                       // ... observes the correct value
        dc      civac, x8                       // Make visible to booting secondaries
 #endif
-
-#ifdef CONFIG_RANDOMIZE_BASE
-       adrp    x5, memstart_offset_seed        // Save KASLR linear map seed
-       strh    w24, [x5, :lo12:memstart_offset_seed]
-#endif
 #if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS)
        bl      kasan_early_init
 #endif
@@ -779,7 +773,6 @@ SYM_FUNC_START_LOCAL(__primary_switch)
 #ifdef CONFIG_RANDOMIZE_BASE
        mov     x0, x22
        bl      __pi_kaslr_early_init
-       and     x24, x0, #SZ_2M - 1             // capture memstart offset seed
        bic     x0, x0, #SZ_2M - 1
        orr     x23, x23, x0                    // record kernel offset
 #endif
index eacc3d167733dfb8419aedda140150d52b034247..8d96052079e84dda117b073c2b584ed11f2304b6 100644 (file)
@@ -46,6 +46,7 @@ PROVIDE(__pi_id_aa64smfr0_override    = id_aa64smfr0_override);
 PROVIDE(__pi_id_aa64zfr0_override      = id_aa64zfr0_override);
 PROVIDE(__pi_arm64_sw_feature_override = arm64_sw_feature_override);
 PROVIDE(__pi__ctype                    = _ctype);
+PROVIDE(__pi_memstart_offset_seed      = memstart_offset_seed);
 
 #ifdef CONFIG_KVM
 
index f2305e276ec368039cb752ca106a5d05939e1579..eeecee7ffd6fa12559bfbbd112117649bd3d6660 100644 (file)
@@ -16,6 +16,8 @@
 #include <asm/memory.h>
 #include <asm/pgtable.h>
 
+extern u16 memstart_offset_seed;
+
 static u64 __init get_kaslr_seed(void *fdt)
 {
        static char const chosen_str[] __initconst = "chosen";
@@ -51,6 +53,8 @@ asmlinkage u64 __init kaslr_early_init(void *fdt)
                        return 0;
        }
 
+       memstart_offset_seed = seed & U16_MAX;
+
        /*
         * OK, so we are proceeding with KASLR enabled. Calculate a suitable
         * kernel image offset from the seed. Let's place the kernel in the