lkml.org 
[lkml]   [2019]   [Aug]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v9 1/3] arm64: map FDT as RW for early_init_dt_scan()
    Date
    Currently in arm64, FDT is mapped to RO before it's passed to
    early_init_dt_scan(). However, there might be some codes
    (eg. commit "fdt: add support for rng-seed") that need to modify FDT
    during init. Map FDT to RO after early fixups are done.

    Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org>
    Reviewed-by: Stephen Boyd <swboyd@chromium.org>
    Reviewed-by: Mike Rapoport <rppt@linux.ibm.com>
    ---
    No change since v7.
    ---
    arch/arm64/include/asm/mmu.h | 2 +-
    arch/arm64/kernel/kaslr.c | 5 +----
    arch/arm64/kernel/setup.c | 9 ++++++++-
    arch/arm64/mm/mmu.c | 15 +--------------
    4 files changed, 11 insertions(+), 20 deletions(-)

    diff --git a/arch/arm64/include/asm/mmu.h b/arch/arm64/include/asm/mmu.h
    index fd6161336653..f217e3292919 100644
    --- a/arch/arm64/include/asm/mmu.h
    +++ b/arch/arm64/include/asm/mmu.h
    @@ -126,7 +126,7 @@ extern void init_mem_pgprot(void);
    extern void create_pgd_mapping(struct mm_struct *mm, phys_addr_t phys,
    unsigned long virt, phys_addr_t size,
    pgprot_t prot, bool page_mappings_only);
    -extern void *fixmap_remap_fdt(phys_addr_t dt_phys);
    +extern void *fixmap_remap_fdt(phys_addr_t dt_phys, int *size, pgprot_t prot);
    extern void mark_linear_text_alias_ro(void);

    #define INIT_MM_CONTEXT(name) \
    diff --git a/arch/arm64/kernel/kaslr.c b/arch/arm64/kernel/kaslr.c
    index 5a59f7567f9c..416f537bf614 100644
    --- a/arch/arm64/kernel/kaslr.c
    +++ b/arch/arm64/kernel/kaslr.c
    @@ -62,9 +62,6 @@ static __init const u8 *kaslr_get_cmdline(void *fdt)
    return default_cmdline;
    }

    -extern void *__init __fixmap_remap_fdt(phys_addr_t dt_phys, int *size,
    - pgprot_t prot);
    -
    /*
    * This routine will be executed with the kernel mapped at its default virtual
    * address, and if it returns successfully, the kernel will be remapped, and
    @@ -93,7 +90,7 @@ u64 __init kaslr_early_init(u64 dt_phys)
    * attempt at mapping the FDT in setup_machine()
    */
    early_fixmap_init();
    - fdt = __fixmap_remap_fdt(dt_phys, &size, PAGE_KERNEL);
    + fdt = fixmap_remap_fdt(dt_phys, &size, PAGE_KERNEL);
    if (!fdt)
    return 0;

    diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
    index 57ff38600828..56f664561754 100644
    --- a/arch/arm64/kernel/setup.c
    +++ b/arch/arm64/kernel/setup.c
    @@ -170,9 +170,13 @@ static void __init smp_build_mpidr_hash(void)

    static void __init setup_machine_fdt(phys_addr_t dt_phys)
    {
    - void *dt_virt = fixmap_remap_fdt(dt_phys);
    + int size;
    + void *dt_virt = fixmap_remap_fdt(dt_phys, &size, PAGE_KERNEL);
    const char *name;

    + if (dt_virt)
    + memblock_reserve(dt_phys, size);
    +
    if (!dt_virt || !early_init_dt_scan(dt_virt)) {
    pr_crit("\n"
    "Error: invalid device tree blob at physical address %pa (virtual address 0x%p)\n"
    @@ -184,6 +188,9 @@ static void __init setup_machine_fdt(phys_addr_t dt_phys)
    cpu_relax();
    }

    + /* Early fixups are done, map the FDT as read-only now */
    + fixmap_remap_fdt(dt_phys, &size, PAGE_KERNEL_RO);
    +
    name = of_flat_dt_get_machine_name();
    if (!name)
    return;
    diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c
    index e67bab4d613e..1586d7fbf26a 100644
    --- a/arch/arm64/mm/mmu.c
    +++ b/arch/arm64/mm/mmu.c
    @@ -877,7 +877,7 @@ void __set_fixmap(enum fixed_addresses idx,
    }
    }

    -void *__init __fixmap_remap_fdt(phys_addr_t dt_phys, int *size, pgprot_t prot)
    +void *__init fixmap_remap_fdt(phys_addr_t dt_phys, int *size, pgprot_t prot)
    {
    const u64 dt_virt_base = __fix_to_virt(FIX_FDT);
    int offset;
    @@ -930,19 +930,6 @@ void *__init __fixmap_remap_fdt(phys_addr_t dt_phys, int *size, pgprot_t prot)
    return dt_virt;
    }

    -void *__init fixmap_remap_fdt(phys_addr_t dt_phys)
    -{
    - void *dt_virt;
    - int size;
    -
    - dt_virt = __fixmap_remap_fdt(dt_phys, &size, PAGE_KERNEL_RO);
    - if (!dt_virt)
    - return NULL;
    -
    - memblock_reserve(dt_phys, size);
    - return dt_virt;
    -}
    -
    int __init arch_ioremap_p4d_supported(void)
    {
    return 0;
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-08-22 09:16    [W:5.510 / U:0.060 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site