From fbdbb7bfad0106c272e9eaee97dbddcd951a6df8 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 1 Sep 2022 12:01:44 +0200 Subject: [PATCH] 4.19-stable patches added patches: arm64-map-fdt-as-rw-for-early_init_dt_scan.patch --- ...map-fdt-as-rw-for-early_init_dt_scan.patch | 118 ++++++++++++++++++ queue-4.19/series | 1 + 2 files changed, 119 insertions(+) create mode 100644 queue-4.19/arm64-map-fdt-as-rw-for-early_init_dt_scan.patch diff --git a/queue-4.19/arm64-map-fdt-as-rw-for-early_init_dt_scan.patch b/queue-4.19/arm64-map-fdt-as-rw-for-early_init_dt_scan.patch new file mode 100644 index 00000000000..d1ea26438ef --- /dev/null +++ b/queue-4.19/arm64-map-fdt-as-rw-for-early_init_dt_scan.patch @@ -0,0 +1,118 @@ +From e112b032a72c78f15d0c803c5dc6be444c2e6c66 Mon Sep 17 00:00:00 2001 +From: Hsin-Yi Wang +Date: Fri, 23 Aug 2019 14:24:50 +0800 +Subject: arm64: map FDT as RW for early_init_dt_scan() + +From: Hsin-Yi Wang + +commit e112b032a72c78f15d0c803c5dc6be444c2e6c66 upstream. + +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 +Reviewed-by: Stephen Boyd +Reviewed-by: Mike Rapoport +Signed-off-by: Will Deacon +[mkbestas: fixed trivial conflicts for 4.19 backport] +Signed-off-by: Michael Bestas +Signed-off-by: Greg Kroah-Hartman +--- + 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(-) + +--- a/arch/arm64/include/asm/mmu.h ++++ b/arch/arm64/include/asm/mmu.h +@@ -98,7 +98,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); + + #endif /* !__ASSEMBLY__ */ +--- a/arch/arm64/kernel/kaslr.c ++++ b/arch/arm64/kernel/kaslr.c +@@ -65,9 +65,6 @@ out: + 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 +@@ -96,7 +93,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; + +--- a/arch/arm64/kernel/setup.c ++++ b/arch/arm64/kernel/setup.c +@@ -183,9 +183,13 @@ static void __init smp_build_mpidr_hash( + + 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" +@@ -197,6 +201,9 @@ static void __init setup_machine_fdt(phy + 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; +--- a/arch/arm64/mm/mmu.c ++++ b/arch/arm64/mm/mmu.c +@@ -859,7 +859,7 @@ void __set_fixmap(enum fixed_addresses i + } + } + +-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; +@@ -912,19 +912,6 @@ void *__init __fixmap_remap_fdt(phys_add + 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_pud_supported(void) + { + /* diff --git a/queue-4.19/series b/queue-4.19/series index 03fe50f2721..f332d9a16a9 100644 --- a/queue-4.19/series +++ b/queue-4.19/series @@ -35,3 +35,4 @@ mm-hugetlb-fix-hugetlb-not-supporting-softdirty-tracking.patch md-call-__md_stop_writes-in-md_stop.patch scsi-storvsc-remove-wq_mem_reclaim-from-storvsc_error_wq.patch mm-force-tlb-flush-for-pfnmap-mappings-before-unlink_file_vma.patch +arm64-map-fdt-as-rw-for-early_init_dt_scan.patch -- 2.47.2