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>
This commit is contained in:
parent
f70b3a2332
commit
a004393f45
@ -472,6 +472,7 @@ SYM_FUNC_START_LOCAL(__primary_switched)
|
|||||||
#endif
|
#endif
|
||||||
mov x0, x21 // pass FDT address in x0
|
mov x0, x21 // pass FDT address in x0
|
||||||
bl early_fdt_map // Try mapping the FDT early
|
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
|
bl init_feature_override // Parse cpu feature overrides
|
||||||
#ifdef CONFIG_RANDOMIZE_BASE
|
#ifdef CONFIG_RANDOMIZE_BASE
|
||||||
tst x23, ~(MIN_KIMG_ALIGN - 1) // already running randomized?
|
tst x23, ~(MIN_KIMG_ALIGN - 1) // already running randomized?
|
||||||
|
@ -201,16 +201,11 @@ static __init void __parse_cmdline(const char *cmdline, bool parse_aliases)
|
|||||||
} while (1);
|
} while (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static __init const u8 *get_bootargs_cmdline(void)
|
static __init const u8 *get_bootargs_cmdline(const void *fdt)
|
||||||
{
|
{
|
||||||
const u8 *prop;
|
const u8 *prop;
|
||||||
void *fdt;
|
|
||||||
int node;
|
int node;
|
||||||
|
|
||||||
fdt = get_early_fdt_ptr();
|
|
||||||
if (!fdt)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
node = fdt_path_offset(fdt, "/chosen");
|
node = fdt_path_offset(fdt, "/chosen");
|
||||||
if (node < 0)
|
if (node < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -222,9 +217,9 @@ static __init const u8 *get_bootargs_cmdline(void)
|
|||||||
return strlen(prop) ? prop : NULL;
|
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)
|
if (IS_ENABLED(CONFIG_CMDLINE_FORCE) || !prop)
|
||||||
__parse_cmdline(CONFIG_CMDLINE, true);
|
__parse_cmdline(CONFIG_CMDLINE, true);
|
||||||
@ -234,9 +229,9 @@ static __init void parse_cmdline(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Keep checkers quiet */
|
/* 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;
|
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++) {
|
for (i = 0; i < ARRAY_SIZE(regs); i++) {
|
||||||
if (regs[i]->override)
|
if (regs[i]->override)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user