arm64: Trap WFI executed in userspace
It recently came to light that userspace can execute WFI, and that the arm64 kernel doesn't trap this event. This sounds rather benign, but the kernel should decide when it wants to wait for an interrupt, and not userspace. Let's trap WFI and immediately return after having skipped the instruction. This effectively makes WFI a rather expensive NOP. Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
This commit is contained in:

committed by
Catalin Marinas

parent
ee91176120
commit
c219bc4e92
@@ -508,6 +508,11 @@ static void mrs_handler(unsigned int esr, struct pt_regs *regs)
|
||||
force_signal_inject(SIGILL, ILL_ILLOPC, regs->pc);
|
||||
}
|
||||
|
||||
static void wfi_handler(unsigned int esr, struct pt_regs *regs)
|
||||
{
|
||||
arm64_skip_faulting_instruction(regs, AARCH64_INSN_SIZE);
|
||||
}
|
||||
|
||||
struct sys64_hook {
|
||||
unsigned int esr_mask;
|
||||
unsigned int esr_val;
|
||||
@@ -544,6 +549,12 @@ static struct sys64_hook sys64_hooks[] = {
|
||||
.esr_val = ESR_ELx_SYS64_ISS_SYS_MRS_OP_VAL,
|
||||
.handler = mrs_handler,
|
||||
},
|
||||
{
|
||||
/* Trap WFI instructions executed in userspace */
|
||||
.esr_mask = ESR_ELx_WFx_MASK,
|
||||
.esr_val = ESR_ELx_WFx_WFI_VAL,
|
||||
.handler = wfi_handler,
|
||||
},
|
||||
{},
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user