Merge tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 2 Mar 2023 22:57:53 +0000 (14:57 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 2 Mar 2023 22:57:53 +0000 (14:57 -0800)
Pull arm64 fixes from Catalin Marinas:

 - In copy_highpage(), only reset the tag of the destination pointer if
   KASAN_HW_TAGS is enabled so that user-space MTE does not interfere
   with KASAN_SW_TAGS (which relies on top-byte-ignore).

 - Remove warning if SME is detected without SVE, the kernel can cope
   with such configuration (though none in the field currently).

 - In cfi_handler(), pass the ESR_EL1 value to die() for consistency
   with other die() callers.

 - Disable HUGETLB_PAGE_OPTIMIZE_VMEMMAP on arm64 since the pte
   manipulation from the generic vmemmap_remap_pte() does not follow the
   required ARM break-before-make sequence (clear the pte, flush the
   TLBs, set the new pte). It may be re-enabled once this sequence is
   sorted.

 - Fix possible memory leak in the arm64 ACPI code if the SMCCC version
   and conduit checks fail.

 - Forbid CALL_OPS with CC_OPTIMIZE_FOR_SIZE since gcc ignores
  -falign-functions=N with -Os.

 - Don't pretend KASLR is enabled if offset < MIN_KIMG_ALIGN as no
   randomisation would actually take place.

* tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux:
  arm64: kaslr: don't pretend KASLR is enabled if offset < MIN_KIMG_ALIGN
  arm64: ftrace: forbid CALL_OPS with CC_OPTIMIZE_FOR_SIZE
  arm64: acpi: Fix possible memory leak of ffh_ctxt
  arm64: mm: hugetlb: Disable HUGETLB_PAGE_OPTIMIZE_VMEMMAP
  arm64: pass ESR_ELx to die() of cfi_handler
  arm64/fpsimd: Remove warning for SME without SVE
  arm64: Reset KASAN tag in copy_highpage with HW tags only

arch/arm64/Kconfig
arch/arm64/include/asm/memory.h
arch/arm64/kernel/acpi.c
arch/arm64/kernel/cpufeature.c
arch/arm64/kernel/fpsimd.c
arch/arm64/kernel/kaslr.c
arch/arm64/kernel/traps.c
arch/arm64/mm/copypage.c

index 27b2592..1023e89 100644 (file)
@@ -100,7 +100,6 @@ config ARM64
        select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT
        select ARCH_WANT_FRAME_POINTERS
        select ARCH_WANT_HUGE_PMD_SHARE if ARM64_4K_PAGES || (ARM64_16K_PAGES && !ARM64_VA_BITS_36)
-       select ARCH_WANT_HUGETLB_PAGE_OPTIMIZE_VMEMMAP
        select ARCH_WANT_LD_ORPHAN_WARN
        select ARCH_WANTS_NO_INSTR
        select ARCH_WANTS_THP_SWAP if ARM64_4K_PAGES
@@ -187,7 +186,8 @@ config ARM64
        select HAVE_DMA_CONTIGUOUS
        select HAVE_DYNAMIC_FTRACE
        select HAVE_DYNAMIC_FTRACE_WITH_CALL_OPS \
-               if (DYNAMIC_FTRACE_WITH_ARGS && !CFI_CLANG)
+               if (DYNAMIC_FTRACE_WITH_ARGS && !CFI_CLANG && \
+                   !CC_OPTIMIZE_FOR_SIZE)
        select FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY \
                if DYNAMIC_FTRACE_WITH_ARGS
        select HAVE_EFFICIENT_UNALIGNED_ACCESS
index 9dd08cd..78e5163 100644 (file)
 #include <linux/compiler.h>
 #include <linux/mmdebug.h>
 #include <linux/types.h>
+#include <asm/boot.h>
 #include <asm/bug.h>
 
 #if VA_BITS > 48
@@ -203,6 +204,16 @@ static inline unsigned long kaslr_offset(void)
        return kimage_vaddr - KIMAGE_VADDR;
 }
 
+static inline bool kaslr_enabled(void)
+{
+       /*
+        * The KASLR offset modulo MIN_KIMG_ALIGN is taken from the physical
+        * placement of the image rather than from the seed, so a displacement
+        * of less than MIN_KIMG_ALIGN means that no seed was provided.
+        */
+       return kaslr_offset() >= MIN_KIMG_ALIGN;
+}
+
 /*
  * Allow all memory at the discovery stage. We will clip it later.
  */
index 378453f..dba8fce 100644 (file)
@@ -435,10 +435,6 @@ int acpi_ffh_address_space_arch_setup(void *handler_ctxt, void **region_ctxt)
        enum arm_smccc_conduit conduit;
        struct acpi_ffh_data *ffh_ctxt;
 
-       ffh_ctxt = kzalloc(sizeof(*ffh_ctxt), GFP_KERNEL);
-       if (!ffh_ctxt)
-               return -ENOMEM;
-
        if (arm_smccc_get_version() < ARM_SMCCC_VERSION_1_2)
                return -EOPNOTSUPP;
 
@@ -448,6 +444,10 @@ int acpi_ffh_address_space_arch_setup(void *handler_ctxt, void **region_ctxt)
                return -EOPNOTSUPP;
        }
 
+       ffh_ctxt = kzalloc(sizeof(*ffh_ctxt), GFP_KERNEL);
+       if (!ffh_ctxt)
+               return -ENOMEM;
+
        if (conduit == SMCCC_CONDUIT_SMC) {
                ffh_ctxt->invoke_ffh_fn = __arm_smccc_smc;
                ffh_ctxt->invoke_ffh64_fn = arm_smccc_1_2_smc;
index 87687e9..2e3e551 100644 (file)
@@ -1633,7 +1633,7 @@ bool kaslr_requires_kpti(void)
                        return false;
        }
 
-       return kaslr_offset() > 0;
+       return kaslr_enabled();
 }
 
 static bool __meltdown_safe = true;
index 692dfef..9e7e50a 100644 (file)
@@ -2122,9 +2122,6 @@ static int __init fpsimd_init(void)
                pr_notice("Advanced SIMD is not implemented\n");
 
 
-       if (cpu_have_named_feature(SME) && !cpu_have_named_feature(SVE))
-               pr_notice("SME is implemented but not SVE\n");
-
        sve_sysctl_init();
        sme_sysctl_init();
 
index 325455d..e7477f2 100644 (file)
@@ -41,7 +41,7 @@ static int __init kaslr_init(void)
                return 0;
        }
 
-       if (!kaslr_offset()) {
+       if (!kaslr_enabled()) {
                pr_warn("KASLR disabled due to lack of seed\n");
                return 0;
        }
index 901dfd9..4a79ba1 100644 (file)
@@ -997,7 +997,7 @@ static int cfi_handler(struct pt_regs *regs, unsigned long esr)
 
        switch (report_cfi_failure(regs, regs->pc, &target, type)) {
        case BUG_TRAP_TYPE_BUG:
-               die("Oops - CFI", regs, 0);
+               die("Oops - CFI", regs, esr);
                break;
 
        case BUG_TRAP_TYPE_WARN:
index 8dd5a8f..4aadcfb 100644 (file)
@@ -22,7 +22,8 @@ void copy_highpage(struct page *to, struct page *from)
        copy_page(kto, kfrom);
 
        if (system_supports_mte() && page_mte_tagged(from)) {
-               page_kasan_tag_reset(to);
+               if (kasan_hw_tags_enabled())
+                       page_kasan_tag_reset(to);
                /* It's a new page, shouldn't have been tagged yet */
                WARN_ON_ONCE(!try_page_mte_tagging(to));
                mte_copy_page_tags(kto, kfrom);