diff options
| author | Ard Biesheuvel <ardb@kernel.org> | 2022-06-24 17:06:45 +0200 | 
|---|---|---|
| committer | Will Deacon <will@kernel.org> | 2022-06-24 17:18:10 +0100 | 
| commit | a004393f45d9a55e55d76f252914bdddffdde204 (patch) | |
| tree | ed02beb9a7def334f64a249636f5c72e2d7443b2 | |
| parent | f70b3a23324a2d31efb83cc01302acb343e4ec1b (diff) | |
arm64: idreg-override: use early FDT mapping in ID map
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>
| -rw-r--r-- | arch/arm64/kernel/head.S | 1 | ||||
| -rw-r--r-- | arch/arm64/kernel/idreg-override.c | 17 | 
2 files changed, 7 insertions, 11 deletions
diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S index 8283ff848328..64ebff634b83 100644 --- a/arch/arm64/kernel/head.S +++ b/arch/arm64/kernel/head.S @@ -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? diff --git a/arch/arm64/kernel/idreg-override.c b/arch/arm64/kernel/idreg-override.c index 8a2ceb591686..f92836e196e5 100644 --- a/arch/arm64/kernel/idreg-override.c +++ b/arch/arm64/kernel/idreg-override.c @@ -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)  | 
