Merge tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64...
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 26 Apr 2021 17:25:03 +0000 (10:25 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 26 Apr 2021 17:25:03 +0000 (10:25 -0700)
Pull arm64 updates from Catalin Marinas:

 - MTE asynchronous support for KASan. Previously only synchronous
   (slower) mode was supported. Asynchronous is faster but does not
   allow precise identification of the illegal access.

 - Run kernel mode SIMD with softirqs disabled. This allows using NEON
   in softirq context for crypto performance improvements. The
   conditional yield support is modified to take softirqs into account
   and reduce the latency.

 - Preparatory patches for Apple M1: handle CPUs that only have the VHE
   mode available (host kernel running at EL2), add FIQ support.

 - arm64 perf updates: support for HiSilicon PA and SLLC PMU drivers,
   new functions for the HiSilicon HHA and L3C PMU, cleanups.

 - Re-introduce support for execute-only user permissions but only when
   the EPAN (Enhanced Privileged Access Never) architecture feature is
   available.

 - Disable fine-grained traps at boot and improve the documented boot
   requirements.

 - Support CONFIG_KASAN_VMALLOC on arm64 (only with KASAN_GENERIC).

 - Add hierarchical eXecute Never permissions for all page tables.

 - Add arm64 prctl(PR_PAC_{SET,GET}_ENABLED_KEYS) allowing user programs
   to control which PAC keys are enabled in a particular task.

 - arm64 kselftests for BTI and some improvements to the MTE tests.

 - Minor improvements to the compat vdso and sigpage.

 - Miscellaneous cleanups.

* tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux: (86 commits)
  arm64/sve: Add compile time checks for SVE hooks in generic functions
  arm64/kernel/probes: Use BUG_ON instead of if condition followed by BUG.
  arm64: pac: Optimize kernel entry/exit key installation code paths
  arm64: Introduce prctl(PR_PAC_{SET,GET}_ENABLED_KEYS)
  arm64: mte: make the per-task SCTLR_EL1 field usable elsewhere
  arm64/sve: Remove redundant system_supports_sve() tests
  arm64: fpsimd: run kernel mode NEON with softirqs disabled
  arm64: assembler: introduce wxN aliases for wN registers
  arm64: assembler: remove conditional NEON yield macros
  kasan, arm64: tests supports for HW_TAGS async mode
  arm64: mte: Report async tag faults before suspend
  arm64: mte: Enable async tag check fault
  arm64: mte: Conditionally compile mte_enable_kernel_*()
  arm64: mte: Enable TCO in functions that can read beyond buffer limits
  kasan: Add report for async mode
  arm64: mte: Drop arch_enable_tagging()
  kasan: Add KASAN mode kernel parameter
  arm64: mte: Add asynchronous mode support
  arm64: Get rid of CONFIG_ARM64_VHE
  arm64: Cope with CPUs stuck in VHE mode
  ...

16 files changed:
1  2 
Documentation/admin-guide/kernel-parameters.txt
arch/arm64/Kconfig
arch/arm64/crypto/aes-modes.S
arch/arm64/include/asm/cpucaps.h
arch/arm64/include/asm/processor.h
arch/arm64/include/asm/word-at-a-time.h
arch/arm64/kernel/cpufeature.c
arch/arm64/kernel/entry.S
arch/arm64/kernel/probes/kprobes.c
arch/arm64/kernel/process.c
arch/arm64/kernel/stacktrace.c
arch/arm64/mm/mmu.c
include/linux/cpuhotplug.h
include/linux/irq.h
include/linux/kasan.h
mm/kasan/kasan.h

Simple merge
Simple merge
@@@ -66,8 -66,8 +66,9 @@@
  #define ARM64_WORKAROUND_1508412              58
  #define ARM64_HAS_LDAPR                               59
  #define ARM64_KVM_PROTECTED_MODE              60
 -#define ARM64_HAS_EPAN                                61
 +#define ARM64_WORKAROUND_NVIDIA_CARMEL_CNP    61
++#define ARM64_HAS_EPAN                                62
  
--#define ARM64_NCAPS                           62
++#define ARM64_NCAPS                           63
  
  #endif /* __ASM_CPUCAPS_H */
Simple merge
@@@ -53,8 -53,10 +53,10 @@@ static inline unsigned long find_zero(u
   */
  static inline unsigned long load_unaligned_zeropad(const void *addr)
  {
 -      unsigned long ret, offset;
 +      unsigned long ret, tmp;
  
+       __uaccess_enable_tco_async();
        /* Load word from unaligned pointer addr */
        asm(
        "1:     ldr     %0, %3\n"
        "       b       2b\n"
        "       .popsection\n"
        _ASM_EXTABLE(1b, 3b)
 -      : "=&r" (ret), "=&r" (offset)
 +      : "=&r" (ret), "=&r" (tmp)
        : "r" (addr), "Q" (*(unsigned long *)addr));
  
+       __uaccess_disable_tco_async();
        return ret;
  }
  
Simple merge
@@@ -246,10 -244,32 +246,32 @@@ alternative_else_nop_endi
        disable_step_tsk x19, x20
  
        /* Check for asynchronous tag check faults in user space */
 -      check_mte_async_tcf x19, x22
 +      check_mte_async_tcf x22, x23
        apply_ssbd 1, x22, x23
  
-       ptrauth_keys_install_kernel tsk, x20, x22, x23
+ #ifdef CONFIG_ARM64_PTR_AUTH
+ alternative_if ARM64_HAS_ADDRESS_AUTH
+       /*
+        * Enable IA for in-kernel PAC if the task had it disabled. Although
+        * this could be implemented with an unconditional MRS which would avoid
+        * a load, this was measured to be slower on Cortex-A75 and Cortex-A76.
+        *
+        * Install the kernel IA key only if IA was enabled in the task. If IA
+        * was disabled on kernel exit then we would have left the kernel IA
+        * installed so there is no need to install it again.
+        */
+       ldr     x0, [tsk, THREAD_SCTLR_USER]
+       tbz     x0, SCTLR_ELx_ENIA_SHIFT, 1f
+       __ptrauth_keys_install_kernel_nosync tsk, x20, x22, x23
+       b       2f
+ 1:
+       mrs     x0, sctlr_el1
+       orr     x0, x0, SCTLR_ELx_ENIA
+       msr     sctlr_el1, x0
+ 2:
+       isb
+ alternative_else_nop_endif
+ #endif
  
        mte_set_kernel_gcr x22, x23
  
@@@ -264,15 -264,12 +264,14 @@@ int __kprobes kprobe_fault_handler(stru
                 * normal page fault.
                 */
                instruction_pointer_set(regs, (unsigned long) cur->addr);
-               if (!instruction_pointer(regs))
-                       BUG();
+               BUG_ON(!instruction_pointer(regs));
  
 -              if (kcb->kprobe_status == KPROBE_REENTER)
 +              if (kcb->kprobe_status == KPROBE_REENTER) {
                        restore_previous_kprobe(kcb);
 -              else
 +              } else {
 +                      kprobes_restore_local_irqflag(kcb, regs);
                        reset_current_kprobe();
 +              }
  
                break;
        case KPROBE_HIT_ACTIVE:
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge