mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

Software stepping checks for the correct handler by iterating over a list of dynamically registered handlers and calling all of them until one handles the exception. This is the only generic way to handle software stepping handlers in arm64 as the exception does not provide an immediate that could be checked, contrary to software breakpoints. However, the registration mechanism is not exported and has only two current users : the KGDB stepping handler, and the uprobe single step handler. Given that one comes from user mode and the other from kernel mode, call the appropriate one by checking the source EL of the exception. Add a stand-in that returns DBG_HOOK_ERROR when the configuration options are not enabled. Remove `arch_init_uprobes()` as it is not useful anymore and is specific to arm64. Unify the naming of the handler to XXX_single_step_handler(), making it clear they are related. Signed-off-by: Ada Couprie Diaz <ada.coupriediaz@arm.com> Tested-by: Luis Claudio R. Goncalves <lgoncalv@redhat.com> Reviewed-by: Will Deacon <will@kernel.org> Acked-by: Mark Rutland <mark.rutland@arm.com> Link: https://lore.kernel.org/r/20250707114109.35672-5-ada.coupriediaz@arm.com Signed-off-by: Will Deacon <will@kernel.org>
42 lines
868 B
C
42 lines
868 B
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (C) 2014-2016 Pratyush Anand <panand@redhat.com>
|
|
*/
|
|
|
|
#ifndef _ASM_UPROBES_H
|
|
#define _ASM_UPROBES_H
|
|
|
|
#include <asm/debug-monitors.h>
|
|
#include <asm/insn.h>
|
|
#include <asm/probes.h>
|
|
|
|
#define UPROBE_SWBP_INSN cpu_to_le32(BRK64_OPCODE_UPROBES)
|
|
#define UPROBE_SWBP_INSN_SIZE AARCH64_INSN_SIZE
|
|
#define UPROBE_XOL_SLOT_BYTES AARCH64_INSN_SIZE
|
|
|
|
typedef __le32 uprobe_opcode_t;
|
|
|
|
struct arch_uprobe_task {
|
|
};
|
|
|
|
struct arch_uprobe {
|
|
union {
|
|
__le32 insn;
|
|
__le32 ixol;
|
|
};
|
|
struct arch_probe_insn api;
|
|
bool simulate;
|
|
};
|
|
|
|
int uprobe_brk_handler(struct pt_regs *regs, unsigned long esr);
|
|
#ifdef CONFIG_UPROBES
|
|
int uprobe_single_step_handler(struct pt_regs *regs, unsigned long esr);
|
|
#else
|
|
static inline int uprobe_single_step_handler(struct pt_regs *regs,
|
|
unsigned long esr)
|
|
{
|
|
return DBG_HOOK_ERROR;
|
|
}
|
|
#endif
|
|
|
|
#endif
|