]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.9-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 1 Sep 2022 12:10:08 +0000 (14:10 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 1 Sep 2022 12:10:08 +0000 (14:10 +0200)
added patches:
arm64-map-fdt-as-rw-for-early_init_dt_scan.patch

queue-4.9/arm64-map-fdt-as-rw-for-early_init_dt_scan.patch [new file with mode: 0644]
queue-4.9/series

diff --git a/queue-4.9/arm64-map-fdt-as-rw-for-early_init_dt_scan.patch b/queue-4.9/arm64-map-fdt-as-rw-for-early_init_dt_scan.patch
new file mode 100644 (file)
index 0000000..9a3afa9
--- /dev/null
@@ -0,0 +1,116 @@
+From e112b032a72c78f15d0c803c5dc6be444c2e6c66 Mon Sep 17 00:00:00 2001
+From: Hsin-Yi Wang <hsinyi@chromium.org>
+Date: Fri, 23 Aug 2019 14:24:50 +0800
+Subject: arm64: map FDT as RW for early_init_dt_scan()
+
+From: Hsin-Yi Wang <hsinyi@chromium.org>
+
+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 <hsinyi@chromium.org>
+Reviewed-by: Stephen Boyd <swboyd@chromium.org>
+Reviewed-by: Mike Rapoport <rppt@linux.ibm.com>
+Signed-off-by: Will Deacon <will@kernel.org>
+[mkbestas: fixed trivial conflicts for 4.9 backport]
+Signed-off-by: Michael Bestas <mkbestas@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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
+@@ -90,7 +90,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 allow_block_mappings);
+-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);
+ #endif        /* !__ASSEMBLY__ */
+ #endif
+--- 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
+@@ -178,7 +178,11 @@ 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);
++
++      if (dt_virt)
++              memblock_reserve(dt_phys, size);
+       if (!dt_virt || !early_init_dt_scan(dt_virt)) {
+               pr_crit("\n"
+@@ -191,6 +195,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);
++
+       dump_stack_set_arch_desc("%s (DT)", of_flat_dt_get_machine_name());
+ }
+--- a/arch/arm64/mm/mmu.c
++++ b/arch/arm64/mm/mmu.c
+@@ -718,7 +718,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;
+@@ -771,19 +771,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)
+ {
+       /*
index df38e5f1623796a42dca0aa1432f2447245f4073..951a5f3a1f3e66fc64e245ebfdc077ab1f485b30 100644 (file)
@@ -24,3 +24,4 @@ media-pvrusb2-fix-memory-leak-in-pvr_probe.patch
 hid-hidraw-fix-memory-leak-in-hidraw_release.patch
 fbdev-fb_pm2fb-avoid-potential-divide-by-zero-error.patch
 ftrace-fix-null-pointer-dereference-in-is_ftrace_trampoline-when-ftrace-is-dead.patch
+arm64-map-fdt-as-rw-for-early_init_dt_scan.patch