mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-05 18:14:07 +08:00
6cf61e061e
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()
47 lines
918 B
C
47 lines
918 B
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* Low-level idle sequences
|
|
*/
|
|
|
|
#include <linux/cpu.h>
|
|
#include <linux/irqflags.h>
|
|
|
|
#include <asm/barrier.h>
|
|
#include <asm/cpuidle.h>
|
|
#include <asm/cpufeature.h>
|
|
#include <asm/sysreg.h>
|
|
|
|
/*
|
|
* 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();
|
|
}
|