arm64: head: Run feature override detection before mapping the kernel
authorArd Biesheuvel <ardb@kernel.org>
Wed, 14 Feb 2024 12:28:54 +0000 (13:28 +0100)
committerCatalin Marinas <catalin.marinas@arm.com>
Fri, 16 Feb 2024 12:42:30 +0000 (12:42 +0000)
To permit the feature overrides to be taken into account before the
KASLR init code runs and the kernel mapping is created, move the
detection code to an earlier stage in the boot.

In a subsequent patch, this will be taken advantage of by merging the
preliminary and permanent mappings of the kernel text and data into a
single one that gets created and relocated before start_kernel() is
called.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Link: https://lore.kernel.org/r/20240214122845.2033971-53-ardb+git@google.com
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm64/kernel/head.S
arch/arm64/kernel/vmlinux.lds.S

index 2af518161f3a613be5d6207ad4ec8880635fdc8c..865ecc1f825571065b996fdf800c0a118f721d04 100644 (file)
@@ -375,9 +375,9 @@ SYM_FUNC_START_LOCAL(create_idmap)
 
        map_memory x0, x1, x3, x6, x7, x3, IDMAP_PGD_ORDER, x10, x11, x12, x13, x14, EXTRA_SHIFT
 
-       /* Remap BSS and the kernel page tables r/w in the ID map */
+       /* Remap [.init].data, BSS and the kernel page tables r/w in the ID map */
        adrp    x1, _text
-       adrp    x2, __bss_start
+       adrp    x2, __initdata_begin
        adrp    x3, _end
        bic     x4, x2, #SWAPPER_BLOCK_SIZE - 1
        mov_q   x5, SWAPPER_RW_MMUFLAGS
@@ -491,9 +491,6 @@ SYM_FUNC_START_LOCAL(__primary_switched)
 #if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS)
        bl      kasan_early_init
 #endif
-       mov     x0, x20                         // pass the full boot status
-       mov     x1, x22                         // pass the low FDT mapping
-       bl      __pi_init_feature_override      // Parse cpu feature overrides
 #ifdef CONFIG_UNWIND_PATCH_PAC_INTO_SCS
        bl      scs_patch_vmlinux
 #endif
@@ -772,12 +769,16 @@ SYM_FUNC_START_LOCAL(__primary_switch)
        bl      __pi_memset
        dsb     ishst                           // Make zero page visible to PTW
 
-#ifdef CONFIG_RELOCATABLE
-       adrp    x23, KERNEL_START
-       and     x23, x23, MIN_KIMG_ALIGN - 1
        adrp    x1, early_init_stack
        mov     sp, x1
        mov     x29, xzr
+       mov     x0, x20                         // pass the full boot status
+       mov     x1, x22                         // pass the low FDT mapping
+       bl      __pi_init_feature_override      // Parse cpu feature overrides
+
+#ifdef CONFIG_RELOCATABLE
+       adrp    x23, KERNEL_START
+       and     x23, x23, MIN_KIMG_ALIGN - 1
 #ifdef CONFIG_RANDOMIZE_BASE
        mov     x0, x22
        bl      __pi_kaslr_early_init
index 8a3c6aacc3555e6a9577662d89ce29ec4a3fc2e2..3afb4223a5e853615217fe9e450fff4329736760 100644 (file)
@@ -320,10 +320,8 @@ SECTIONS
        init_pg_end = .;
        /* end of zero-init region */
 
-#ifdef CONFIG_RELOCATABLE
-       . += SZ_4K;             /* stack for the early relocation code */
+       . += SZ_4K;             /* stack for the early C runtime */
        early_init_stack = .;
-#endif
 
        . = ALIGN(SEGMENT_ALIGN);
        __pecoff_data_size = ABSOLUTE(. - __initdata_begin);