arm64: idreg-override: use early FDT mapping in ID map
authorArd Biesheuvel <ardb@kernel.org>
Fri, 24 Jun 2022 15:06:45 +0000 (17:06 +0200)
committerWill Deacon <will@kernel.org>
Fri, 24 Jun 2022 16:18:10 +0000 (17:18 +0100)
Instead of calling into the kernel to map the FDT into the kernel page
tables before even calling start_kernel(), let's switch to the initial,
temporary mapping of the device tree that has been added to the ID map.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Link: https://lore.kernel.org/r/20220624150651.1358849-16-ardb@kernel.org
Signed-off-by: Will Deacon <will@kernel.org>
arch/arm64/kernel/head.S
arch/arm64/kernel/idreg-override.c

index 8283ff848328175c507d041f0c319fad5166758c..64ebff634b83f3bdf5ace6cf44e902b00ab91f33 100644 (file)
@@ -472,6 +472,7 @@ SYM_FUNC_START_LOCAL(__primary_switched)
 #endif
        mov     x0, x21                         // pass FDT address in x0
        bl      early_fdt_map                   // Try mapping the FDT early
+       mov     x0, x22                         // pass FDT address in x0
        bl      init_feature_override           // Parse cpu feature overrides
 #ifdef CONFIG_RANDOMIZE_BASE
        tst     x23, ~(MIN_KIMG_ALIGN - 1)      // already running randomized?
index 8a2ceb591686398f78ce4d3ff6331be820514bb8..f92836e196e5872dcf8d76f461e0bf753d229106 100644 (file)
@@ -201,16 +201,11 @@ static __init void __parse_cmdline(const char *cmdline, bool parse_aliases)
        } while (1);
 }
 
-static __init const u8 *get_bootargs_cmdline(void)
+static __init const u8 *get_bootargs_cmdline(const void *fdt)
 {
        const u8 *prop;
-       void *fdt;
        int node;
 
-       fdt = get_early_fdt_ptr();
-       if (!fdt)
-               return NULL;
-
        node = fdt_path_offset(fdt, "/chosen");
        if (node < 0)
                return NULL;
@@ -222,9 +217,9 @@ static __init const u8 *get_bootargs_cmdline(void)
        return strlen(prop) ? prop : NULL;
 }
 
-static __init void parse_cmdline(void)
+static __init void parse_cmdline(const void *fdt)
 {
-       const u8 *prop = get_bootargs_cmdline();
+       const u8 *prop = get_bootargs_cmdline(fdt);
 
        if (IS_ENABLED(CONFIG_CMDLINE_FORCE) || !prop)
                __parse_cmdline(CONFIG_CMDLINE, true);
@@ -234,9 +229,9 @@ static __init void parse_cmdline(void)
 }
 
 /* Keep checkers quiet */
-void init_feature_override(void);
+void init_feature_override(const void *fdt);
 
-asmlinkage void __init init_feature_override(void)
+asmlinkage void __init init_feature_override(const void *fdt)
 {
        int i;
 
@@ -247,7 +242,7 @@ asmlinkage void __init init_feature_override(void)
                }
        }
 
-       parse_cmdline();
+       parse_cmdline(fdt);
 
        for (i = 0; i < ARRAY_SIZE(regs); i++) {
                if (regs[i]->override)