From: Will Deacon Date: Thu, 24 Jun 2021 13:01:55 +0000 (+0100) Subject: Merge branch 'for-next/entry' into for-next/core X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=6cf61e061e8e3d9c00fb49373196ed5f03235285;p=linux.git Merge branch 'for-next/entry' into for-next/core 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() --- 6cf61e061e8e3d9c00fb49373196ed5f03235285 diff --cc arch/arm64/kernel/idle.c index 0000000000000,45c79204dc40c..a2cfbacec2bbe mode 000000,100644..100644 --- a/arch/arm64/kernel/idle.c +++ b/arch/arm64/kernel/idle.c @@@ -1,0 -1,69 +1,46 @@@ + // SPDX-License-Identifier: GPL-2.0-only + /* + * Low-level idle sequences + */ + + #include + #include + -#include + #include ++#include + #include + #include + -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); -} - + /* + * 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) + { - if (system_uses_irq_prio_masking()) - __cpu_do_idle_irqprio(); - else - __cpu_do_idle(); ++ 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(); + } diff --cc arch/arm64/kernel/process.c index 3925ec3128ec0,72c5d80f03fa8..6b8b4b3e357a9 --- a/arch/arm64/kernel/process.c +++ b/arch/arm64/kernel/process.c @@@ -46,9 -45,9 +45,8 @@@ #include #include -#include #include #include - #include #include #include #include