arm64: probes: Move magic BRK values into brk-imm.h
kprobes and uprobes reserve some BRK immediates for installing their probes. Define these along with the other reservations in brk-imm.h and rename the ESR definitions to be consistent with the others that we already have. Reviewed-by: Mark Rutland <mark.rutland@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com>
This commit is contained in:
@@ -11,6 +11,8 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* #imm16 values used for BRK instruction generation
|
* #imm16 values used for BRK instruction generation
|
||||||
|
* 0x004: for installing kprobes
|
||||||
|
* 0x005: for installing uprobes
|
||||||
* Allowed values for kgdb are 0x400 - 0x7ff
|
* Allowed values for kgdb are 0x400 - 0x7ff
|
||||||
* 0x100: for triggering a fault on purpose (reserved)
|
* 0x100: for triggering a fault on purpose (reserved)
|
||||||
* 0x400: for dynamic BRK instruction
|
* 0x400: for dynamic BRK instruction
|
||||||
@@ -18,6 +20,8 @@
|
|||||||
* 0x800: kernel-mode BUG() and WARN() traps
|
* 0x800: kernel-mode BUG() and WARN() traps
|
||||||
* 0x9xx: tag-based KASAN trap (allowed values 0x900 - 0x9ff)
|
* 0x9xx: tag-based KASAN trap (allowed values 0x900 - 0x9ff)
|
||||||
*/
|
*/
|
||||||
|
#define KPROBES_BRK_IMM 0x004
|
||||||
|
#define UPROBES_BRK_IMM 0x005
|
||||||
#define FAULT_BRK_IMM 0x100
|
#define FAULT_BRK_IMM 0x100
|
||||||
#define KGDB_DYN_DBG_BRK_IMM 0x400
|
#define KGDB_DYN_DBG_BRK_IMM 0x400
|
||||||
#define KGDB_COMPILED_DBG_BRK_IMM 0x401
|
#define KGDB_COMPILED_DBG_BRK_IMM 0x401
|
||||||
|
|||||||
@@ -65,12 +65,9 @@
|
|||||||
#define CACHE_FLUSH_IS_SAFE 1
|
#define CACHE_FLUSH_IS_SAFE 1
|
||||||
|
|
||||||
/* kprobes BRK opcodes with ESR encoding */
|
/* kprobes BRK opcodes with ESR encoding */
|
||||||
#define BRK64_ESR_MASK 0xFFFF
|
#define BRK64_OPCODE_KPROBES (AARCH64_BREAK_MON | (KPROBES_BRK_IMM << 5))
|
||||||
#define BRK64_ESR_KPROBES 0x0004
|
|
||||||
#define BRK64_OPCODE_KPROBES (AARCH64_BREAK_MON | (BRK64_ESR_KPROBES << 5))
|
|
||||||
/* uprobes BRK opcodes with ESR encoding */
|
/* uprobes BRK opcodes with ESR encoding */
|
||||||
#define BRK64_ESR_UPROBES 0x0005
|
#define BRK64_OPCODE_UPROBES (AARCH64_BREAK_MON | (UPROBES_BRK_IMM << 5))
|
||||||
#define BRK64_OPCODE_UPROBES (AARCH64_BREAK_MON | (BRK64_ESR_UPROBES << 5))
|
|
||||||
|
|
||||||
/* AArch32 */
|
/* AArch32 */
|
||||||
#define DBG_ESR_EVT_BKPT 0x4
|
#define DBG_ESR_EVT_BKPT 0x4
|
||||||
|
|||||||
@@ -156,9 +156,7 @@
|
|||||||
ESR_ELx_WFx_ISS_WFI)
|
ESR_ELx_WFx_ISS_WFI)
|
||||||
|
|
||||||
/* BRK instruction trap from AArch64 state */
|
/* BRK instruction trap from AArch64 state */
|
||||||
#define ESR_ELx_VAL_BRK64(imm) \
|
#define ESR_ELx_BRK64_ISS_COMMENT_MASK 0xffff
|
||||||
((ESR_ELx_EC_BRK64 << ESR_ELx_EC_SHIFT) | ESR_ELx_IL | \
|
|
||||||
((imm) & 0xffff))
|
|
||||||
|
|
||||||
/* ISS field definitions for System instruction traps */
|
/* ISS field definitions for System instruction traps */
|
||||||
#define ESR_ELx_SYS64_ISS_RES0_SHIFT 22
|
#define ESR_ELx_SYS64_ISS_RES0_SHIFT 22
|
||||||
|
|||||||
@@ -317,7 +317,7 @@ static int call_break_hook(struct pt_regs *regs, unsigned int esr)
|
|||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
list_for_each_entry_rcu(hook, list, node) {
|
list_for_each_entry_rcu(hook, list, node) {
|
||||||
unsigned int comment = esr & BRK64_ESR_MASK;
|
unsigned int comment = esr & ESR_ELx_BRK64_ISS_COMMENT_MASK;
|
||||||
|
|
||||||
if ((comment & ~hook->mask) == hook->imm)
|
if ((comment & ~hook->mask) == hook->imm)
|
||||||
fn = hook->fn;
|
fn = hook->fn;
|
||||||
|
|||||||
@@ -470,7 +470,7 @@ kprobe_breakpoint_handler(struct pt_regs *regs, unsigned int esr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static struct break_hook kprobes_break_hook = {
|
static struct break_hook kprobes_break_hook = {
|
||||||
.imm = BRK64_ESR_KPROBES,
|
.imm = KPROBES_BRK_IMM,
|
||||||
.fn = kprobe_breakpoint_handler,
|
.fn = kprobe_breakpoint_handler,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -191,7 +191,7 @@ static int uprobe_single_step_handler(struct pt_regs *regs,
|
|||||||
|
|
||||||
/* uprobe breakpoint handler hook */
|
/* uprobe breakpoint handler hook */
|
||||||
static struct break_hook uprobes_break_hook = {
|
static struct break_hook uprobes_break_hook = {
|
||||||
.imm = BRK64_ESR_UPROBES,
|
.imm = UPROBES_BRK_IMM,
|
||||||
.fn = uprobe_breakpoint_handler,
|
.fn = uprobe_breakpoint_handler,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1024,7 +1024,7 @@ int __init early_brk64(unsigned long addr, unsigned int esr,
|
|||||||
struct pt_regs *regs)
|
struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_KASAN_SW_TAGS
|
#ifdef CONFIG_KASAN_SW_TAGS
|
||||||
unsigned int comment = esr & BRK64_ESR_MASK;
|
unsigned int comment = esr & ESR_ELx_BRK64_ISS_COMMENT_MASK;
|
||||||
|
|
||||||
if ((comment & ~KASAN_BRK_MASK) == KASAN_BRK_IMM)
|
if ((comment & ~KASAN_BRK_MASK) == KASAN_BRK_IMM)
|
||||||
return kasan_handler(regs, esr) != DBG_HOOK_HANDLED;
|
return kasan_handler(regs, esr) != DBG_HOOK_HANDLED;
|
||||||
|
|||||||
Reference in New Issue
Block a user