Merge branch 'for-next/entry' into for-next/core
authorWill Deacon <will@kernel.org>
Thu, 24 Jun 2021 13:01:55 +0000 (14:01 +0100)
committerWill Deacon <will@kernel.org>
Thu, 24 Jun 2021 13:01:55 +0000 (14:01 +0100)
The never-ending entry.S refactoring continues, putting us in a much
better place wrt compiler instrumentation whilst moving more of the code
into C.

* for-next/entry:
  arm64: idle: don't instrument idle code with KCOV
  arm64: entry: don't instrument entry code with KCOV
  arm64: entry: make NMI entry/exit functions static
  arm64: entry: split SDEI entry
  arm64: entry: split bad stack entry
  arm64: entry: fold el1_inv() into el1h_64_sync_handler()
  arm64: entry: handle all vectors with C
  arm64: entry: template the entry asm functions
  arm64: entry: improve bad_mode()
  arm64: entry: move bad_mode() to entry-common.c
  arm64: entry: consolidate EL1 exception returns
  arm64: entry: organise entry vectors consistently
  arm64: entry: organise entry handlers consistently
  arm64: entry: convert IRQ+FIQ handlers to C
  arm64: entry: add a call_on_irq_stack helper
  arm64: entry: move NMI preempt logic to C
  arm64: entry: move arm64_preempt_schedule_irq to entry-common.c
  arm64: entry: convert SError handlers to C
  arm64: entry: unmask IRQ+FIQ after EL0 handling
  arm64: remove redundant local_daif_mask() in bad_mode()

1  2 
arch/arm64/include/asm/processor.h
arch/arm64/include/asm/sdei.h
arch/arm64/kernel/entry.S
arch/arm64/kernel/idle.c
arch/arm64/kernel/process.c
arch/arm64/kernel/sdei.c

Simple merge
Simple merge
Simple merge
index 0000000000000000000000000000000000000000,45c79204dc40ccaa2ac658d01317ba1b51315cf7..a2cfbacec2bbe0add6dc13f88822719efb193720
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,69 +1,46 @@@
 -#include <asm/arch_gicv3.h>
+ // SPDX-License-Identifier: GPL-2.0-only
+ /*
+  * Low-level idle sequences
+  */
+ #include <linux/cpu.h>
+ #include <linux/irqflags.h>
 -static void noinstr __cpu_do_idle(void)
 -{
 -      dsb(sy);
 -      wfi();
 -}
 -
 -static void noinstr __cpu_do_idle_irqprio(void)
 -{
 -      unsigned long pmr;
 -      unsigned long daif_bits;
 -
 -      daif_bits = read_sysreg(daif);
 -      write_sysreg(daif_bits | PSR_I_BIT | PSR_F_BIT, daif);
 -
 -      /*
 -       * Unmask PMR before going idle to make sure interrupts can
 -       * be raised.
 -       */
 -      pmr = gic_read_pmr();
 -      gic_write_pmr(GIC_PRIO_IRQON | GIC_PRIO_PSR_I_SET);
 -
 -      __cpu_do_idle();
 -
 -      gic_write_pmr(pmr);
 -      write_sysreg(daif_bits, daif);
 -}
 -
+ #include <asm/barrier.h>
++#include <asm/cpuidle.h>
+ #include <asm/cpufeature.h>
+ #include <asm/sysreg.h>
 -      if (system_uses_irq_prio_masking())
 -              __cpu_do_idle_irqprio();
 -      else
 -              __cpu_do_idle();
+ /*
+  *    cpu_do_idle()
+  *
+  *    Idle the processor (wait for interrupt).
+  *
+  *    If the CPU supports priority masking we must do additional work to
+  *    ensure that interrupts are not masked at the PMR (because the core will
+  *    not wake up if we block the wake up signal in the interrupt controller).
+  */
+ void noinstr cpu_do_idle(void)
+ {
++      struct arm_cpuidle_irq_context context;
++
++      arm_cpuidle_save_irq_context(&context);
++
++      dsb(sy);
++      wfi();
++
++      arm_cpuidle_restore_irq_context(&context);
+ }
+ /*
+  * This is our default idle handler.
+  */
+ void noinstr arch_cpu_idle(void)
+ {
+       /*
+        * This should do all the clock switching and wait for interrupt
+        * tricks
+        */
+       cpu_do_idle();
+       raw_local_irq_enable();
+ }
index 3925ec3128ec03c037243244dd3d9da22038db12,72c5d80f03fa845c02727782c3921c150a302cca..6b8b4b3e357a9c75e1de14e249020c4886fab9e7
@@@ -46,9 -45,9 +45,8 @@@
  #include <linux/prctl.h>
  
  #include <asm/alternative.h>
 -#include <asm/arch_gicv3.h>
  #include <asm/compat.h>
  #include <asm/cpufeature.h>
- #include <asm/cpuidle.h>
  #include <asm/cacheflush.h>
  #include <asm/exec.h>
  #include <asm/fpsimd.h>
Simple merge