mirror of https://gitee.com/openkylin/linux.git
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:
parent
b3341ae0ef
commit
f6f0c4362f
|
@ -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
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue