Commit a004393f authored by Ard Biesheuvel's avatar Ard Biesheuvel Committed by Will Deacon
Browse files

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: default avatarArd Biesheuvel <ardb@kernel.org>
Link: https://lore.kernel.org/r/20220624150651.1358849-16-ardb@kernel.org


Signed-off-by: default avatarWill Deacon <will@kernel.org>
parent f70b3a23
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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?
+6 −11
Original line number Diff line number Diff line
@@ -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)