]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.15-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 14 Nov 2022 09:24:46 +0000 (10:24 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 14 Nov 2022 09:24:46 +0000 (10:24 +0100)
added patches:
arm64-efi-fix-handling-of-misaligned-runtime-regions-and-drop-warning.patch
mips-jump_label-fix-compat-branch-range-check.patch

queue-5.15/arm64-efi-fix-handling-of-misaligned-runtime-regions-and-drop-warning.patch [new file with mode: 0644]
queue-5.15/mips-jump_label-fix-compat-branch-range-check.patch [new file with mode: 0644]
queue-5.15/series

diff --git a/queue-5.15/arm64-efi-fix-handling-of-misaligned-runtime-regions-and-drop-warning.patch b/queue-5.15/arm64-efi-fix-handling-of-misaligned-runtime-regions-and-drop-warning.patch
new file mode 100644 (file)
index 0000000..b1fc106
--- /dev/null
@@ -0,0 +1,117 @@
+From 9b9eaee9828fe98b030cf43ac50065a54a2f5d52 Mon Sep 17 00:00:00 2001
+From: Ard Biesheuvel <ardb@kernel.org>
+Date: Sun, 6 Nov 2022 15:53:54 +0100
+Subject: arm64: efi: Fix handling of misaligned runtime regions and drop warning
+
+From: Ard Biesheuvel <ardb@kernel.org>
+
+commit 9b9eaee9828fe98b030cf43ac50065a54a2f5d52 upstream.
+
+Currently, when mapping the EFI runtime regions in the EFI page tables,
+we complain about misaligned regions in a rather noisy way, using
+WARN().
+
+Not only does this produce a lot of irrelevant clutter in the log, it is
+factually incorrect, as misaligned runtime regions are actually allowed
+by the EFI spec as long as they don't require conflicting memory types
+within the same 64k page.
+
+So let's drop the warning, and tweak the code so that we
+- take both the start and end of the region into account when checking
+  for misalignment
+- only revert to RWX mappings for non-code regions if misaligned code
+  regions are also known to exist.
+
+Cc: <stable@vger.kernel.org>
+Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/arm64/kernel/efi.c |   52 +++++++++++++++++++++++++++++++-----------------
+ 1 file changed, 34 insertions(+), 18 deletions(-)
+
+--- a/arch/arm64/kernel/efi.c
++++ b/arch/arm64/kernel/efi.c
+@@ -12,6 +12,14 @@
+ #include <asm/efi.h>
++static bool region_is_misaligned(const efi_memory_desc_t *md)
++{
++      if (PAGE_SIZE == EFI_PAGE_SIZE)
++              return false;
++      return !PAGE_ALIGNED(md->phys_addr) ||
++             !PAGE_ALIGNED(md->num_pages << EFI_PAGE_SHIFT);
++}
++
+ /*
+  * Only regions of type EFI_RUNTIME_SERVICES_CODE need to be
+  * executable, everything else can be mapped with the XN bits
+@@ -25,14 +33,22 @@ static __init pteval_t create_mapping_pr
+       if (type == EFI_MEMORY_MAPPED_IO)
+               return PROT_DEVICE_nGnRE;
+-      if (WARN_ONCE(!PAGE_ALIGNED(md->phys_addr),
+-                    "UEFI Runtime regions are not aligned to 64 KB -- buggy firmware?"))
++      if (region_is_misaligned(md)) {
++              static bool __initdata code_is_misaligned;
++
+               /*
+-               * If the region is not aligned to the page size of the OS, we
+-               * can not use strict permissions, since that would also affect
+-               * the mapping attributes of the adjacent regions.
++               * Regions that are not aligned to the OS page size cannot be
++               * mapped with strict permissions, as those might interfere
++               * with the permissions that are needed by the adjacent
++               * region's mapping. However, if we haven't encountered any
++               * misaligned runtime code regions so far, we can safely use
++               * non-executable permissions for non-code regions.
+                */
+-              return pgprot_val(PAGE_KERNEL_EXEC);
++              code_is_misaligned |= (type == EFI_RUNTIME_SERVICES_CODE);
++
++              return code_is_misaligned ? pgprot_val(PAGE_KERNEL_EXEC)
++                                        : pgprot_val(PAGE_KERNEL);
++      }
+       /* R-- */
+       if ((attr & (EFI_MEMORY_XP | EFI_MEMORY_RO)) ==
+@@ -63,19 +79,16 @@ int __init efi_create_mapping(struct mm_
+       bool page_mappings_only = (md->type == EFI_RUNTIME_SERVICES_CODE ||
+                                  md->type == EFI_RUNTIME_SERVICES_DATA);
+-      if (!PAGE_ALIGNED(md->phys_addr) ||
+-          !PAGE_ALIGNED(md->num_pages << EFI_PAGE_SHIFT)) {
+-              /*
+-               * If the end address of this region is not aligned to page
+-               * size, the mapping is rounded up, and may end up sharing a
+-               * page frame with the next UEFI memory region. If we create
+-               * a block entry now, we may need to split it again when mapping
+-               * the next region, and support for that is going to be removed
+-               * from the MMU routines. So avoid block mappings altogether in
+-               * that case.
+-               */
++      /*
++       * If this region is not aligned to the page size used by the OS, the
++       * mapping will be rounded outwards, and may end up sharing a page
++       * frame with an adjacent runtime memory region. Given that the page
++       * table descriptor covering the shared page will be rewritten when the
++       * adjacent region gets mapped, we must avoid block mappings here so we
++       * don't have to worry about splitting them when that happens.
++       */
++      if (region_is_misaligned(md))
+               page_mappings_only = true;
+-      }
+       create_pgd_mapping(mm, md->phys_addr, md->virt_addr,
+                          md->num_pages << EFI_PAGE_SHIFT,
+@@ -102,6 +115,9 @@ int __init efi_set_mapping_permissions(s
+       BUG_ON(md->type != EFI_RUNTIME_SERVICES_CODE &&
+              md->type != EFI_RUNTIME_SERVICES_DATA);
++      if (region_is_misaligned(md))
++              return 0;
++
+       /*
+        * Calling apply_to_page_range() is only safe on regions that are
+        * guaranteed to be mapped down to pages. Since we are only called
diff --git a/queue-5.15/mips-jump_label-fix-compat-branch-range-check.patch b/queue-5.15/mips-jump_label-fix-compat-branch-range-check.patch
new file mode 100644 (file)
index 0000000..e38bb8a
--- /dev/null
@@ -0,0 +1,36 @@
+From 64ac0befe75bdfaffc396c2b4a0ed5ae6920eeee Mon Sep 17 00:00:00 2001
+From: Jiaxun Yang <jiaxun.yang@flygoat.com>
+Date: Thu, 3 Nov 2022 15:10:53 +0000
+Subject: MIPS: jump_label: Fix compat branch range check
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Jiaxun Yang <jiaxun.yang@flygoat.com>
+
+commit 64ac0befe75bdfaffc396c2b4a0ed5ae6920eeee upstream.
+
+Cast upper bound of branch range to long to do signed compare,
+avoid negative offset trigger this warning.
+
+Fixes: 9b6584e35f40 ("MIPS: jump_label: Use compact branches for >= r6")
+Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
+Cc: stable@vger.kernel.org
+Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
+Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/mips/kernel/jump_label.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/arch/mips/kernel/jump_label.c
++++ b/arch/mips/kernel/jump_label.c
+@@ -56,7 +56,7 @@ void arch_jump_label_transform(struct ju
+                        * The branch offset must fit in the instruction's 26
+                        * bit field.
+                        */
+-                      WARN_ON((offset >= BIT(25)) ||
++                      WARN_ON((offset >= (long)BIT(25)) ||
+                               (offset < -(long)BIT(25)));
+                       insn.j_format.opcode = bc6_op;
index 26a15465950cdbf6ba8228da8b637d13b360acb9..1a721ed5edb9e8b32829b2bfaf72def53cb7ab5d 100644 (file)
@@ -79,3 +79,5 @@ net-macvlan-fix-memory-leaks-of-macvlan_common_newli.patch
 riscv-process-fix-kernel-info-leakage.patch
 riscv-vdso-fix-build-with-llvm.patch
 riscv-fix-reserved-memory-setup.patch
+arm64-efi-fix-handling-of-misaligned-runtime-regions-and-drop-warning.patch
+mips-jump_label-fix-compat-branch-range-check.patch