arm64: Extract early FDT mapping from kaslr_early_init()

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>
This commit is contained in:
Marc Zyngier 2021-02-08 09:57:21 +00:00 committed by Will Deacon
parent b3341ae0ef
commit f6f0c4362f
4 changed files with 31 additions and 5 deletions

View File

@ -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

View File

@ -436,10 +436,11 @@ SYM_FUNC_START_LOCAL(__primary_switched)
#if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS) #if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS)
bl kasan_early_init bl kasan_early_init
#endif #endif
mov x0, x21 // pass FDT address in x0
bl early_fdt_map // Try mapping the FDT early
#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?
b.ne 0f b.ne 0f
mov x0, x21 // pass FDT address in x0
bl kaslr_early_init // parse FDT for KASLR options bl kaslr_early_init // parse FDT for KASLR options
cbz x0, 0f // KASLR disabled? just proceed cbz x0, 0f // KASLR disabled? just proceed
orr x23, x23, x0 // record KASLR offset orr x23, x23, x0 // record KASLR offset

View File

@ -19,6 +19,7 @@
#include <asm/memory.h> #include <asm/memory.h>
#include <asm/mmu.h> #include <asm/mmu.h>
#include <asm/sections.h> #include <asm/sections.h>
#include <asm/setup.h>
enum kaslr_status { enum kaslr_status {
KASLR_ENABLED, KASLR_ENABLED,
@ -92,12 +93,11 @@ static __init bool is_kaslr_disabled_cmdline(void *fdt)
* containing function pointers) to be reinitialized, and zero-initialized * containing function pointers) to be reinitialized, and zero-initialized
* .bss variables will be reset to 0. * .bss variables will be reset to 0.
*/ */
u64 __init kaslr_early_init(u64 dt_phys) u64 __init kaslr_early_init(void)
{ {
void *fdt; void *fdt;
u64 seed, offset, mask, module_range; u64 seed, offset, mask, module_range;
unsigned long raw; unsigned long raw;
int size;
/* /*
* Set a reasonable default for module_alloc_base in case * 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 * and proceed with KASLR disabled. We will make another
* attempt at mapping the FDT in setup_machine() * attempt at mapping the FDT in setup_machine()
*/ */
early_fixmap_init(); fdt = get_early_fdt_ptr();
fdt = fixmap_remap_fdt(dt_phys, &size, PAGE_KERNEL);
if (!fdt) { if (!fdt) {
kaslr_status = KASLR_DISABLED_FDT_REMAP; kaslr_status = KASLR_DISABLED_FDT_REMAP;
return 0; return 0;

View File

@ -168,6 +168,21 @@ static void __init smp_build_mpidr_hash(void)
pr_warn("Large number of MPIDR hash buckets detected\n"); 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) static void __init setup_machine_fdt(phys_addr_t dt_phys)
{ {
int size; int size;