arm64: Extract early FDT mapping from kaslr_early_init()
authorMarc Zyngier <maz@kernel.org>
Mon, 8 Feb 2021 09:57:21 +0000 (09:57 +0000)
committerWill Deacon <will@kernel.org>
Tue, 9 Feb 2021 13:47:50 +0000 (13:47 +0000)
As we want to parse more options very early in the kernel lifetime,
let's always map the FDT early. This is achieved by moving that
code out of kaslr_early_init().

No functional change expected.

Signed-off-by: Marc Zyngier <maz@kernel.org>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Acked-by: David Brazdil <dbrazdil@google.com>
Link: https://lore.kernel.org/r/20210208095732.3267263-13-maz@kernel.org
[will: Ensue KASAN is enabled before running C code]
Signed-off-by: Will Deacon <will@kernel.org>
arch/arm64/include/asm/setup.h [new file with mode: 0644]
arch/arm64/kernel/head.S
arch/arm64/kernel/kaslr.c
arch/arm64/kernel/setup.c

diff --git a/arch/arm64/include/asm/setup.h b/arch/arm64/include/asm/setup.h
new file mode 100644 (file)
index 0000000..d332061
--- /dev/null
@@ -0,0 +1,11 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#ifndef __ARM64_ASM_SETUP_H
+#define __ARM64_ASM_SETUP_H
+
+#include <uapi/asm/setup.h>
+
+void *get_early_fdt_ptr(void);
+void early_fdt_map(u64 dt_phys);
+
+#endif
index 2c1b8ff..070d1c6 100644 (file)
@@ -436,10 +436,11 @@ SYM_FUNC_START_LOCAL(__primary_switched)
 #if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS)
        bl      kasan_early_init
 #endif
+       mov     x0, x21                         // pass FDT address in x0
+       bl      early_fdt_map                   // Try mapping the FDT early
 #ifdef CONFIG_RANDOMIZE_BASE
        tst     x23, ~(MIN_KIMG_ALIGN - 1)      // already running randomized?
        b.ne    0f
-       mov     x0, x21                         // pass FDT address in x0
        bl      kaslr_early_init                // parse FDT for KASLR options
        cbz     x0, 0f                          // KASLR disabled? just proceed
        orr     x23, x23, x0                    // record KASLR offset
index 1c74c45..5fc86e7 100644 (file)
@@ -19,6 +19,7 @@
 #include <asm/memory.h>
 #include <asm/mmu.h>
 #include <asm/sections.h>
+#include <asm/setup.h>
 
 enum kaslr_status {
        KASLR_ENABLED,
@@ -92,12 +93,11 @@ out:
  * containing function pointers) to be reinitialized, and zero-initialized
  * .bss variables will be reset to 0.
  */
-u64 __init kaslr_early_init(u64 dt_phys)
+u64 __init kaslr_early_init(void)
 {
        void *fdt;
        u64 seed, offset, mask, module_range;
        unsigned long raw;
-       int size;
 
        /*
         * Set a reasonable default for module_alloc_base in case
@@ -111,8 +111,7 @@ u64 __init kaslr_early_init(u64 dt_phys)
         * and proceed with KASLR disabled. We will make another
         * attempt at mapping the FDT in setup_machine()
         */
-       early_fixmap_init();
-       fdt = fixmap_remap_fdt(dt_phys, &size, PAGE_KERNEL);
+       fdt = get_early_fdt_ptr();
        if (!fdt) {
                kaslr_status = KASLR_DISABLED_FDT_REMAP;
                return 0;
index c18aacd..61845c0 100644 (file)
@@ -168,6 +168,21 @@ static void __init smp_build_mpidr_hash(void)
                pr_warn("Large number of MPIDR hash buckets detected\n");
 }
 
+static void *early_fdt_ptr __initdata;
+
+void __init *get_early_fdt_ptr(void)
+{
+       return early_fdt_ptr;
+}
+
+asmlinkage void __init early_fdt_map(u64 dt_phys)
+{
+       int fdt_size;
+
+       early_fixmap_init();
+       early_fdt_ptr = fixmap_remap_fdt(dt_phys, &fdt_size, PAGE_KERNEL);
+}
+
 static void __init setup_machine_fdt(phys_addr_t dt_phys)
 {
        int size;