aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel/kprobes-arm.c
diff options
context:
space:
mode:
authorJon Medhurst <tixy@yxit.co.uk>2011-06-09 07:11:27 -0400
committerTixy <tixy@medhuaa1.miniserver.com>2011-07-13 13:32:42 -0400
commitc6a7d97d57ef41477a85f4c0f48ea5243132ee1f (patch)
tree8803e688ba6c016e9f05de460d2571576fed2da8 /arch/arm/kernel/kprobes-arm.c
parent3b26945597d5eff5d428a268c9d109338fce801e (diff)
ARM: kprobes: Add hooks to override singlestep()
When a probe fires we must single-step the instruction which was replaced by a breakpoint. As the steps to do this vary between ARM and Thumb instructions we need a way to customise single-stepping. This is done by adding a new hook called insn_singlestep to arch_specific_insn which is initialised by the instruction decoding functions. These single-step hooks must update PC and call the instruction handler. For Thumb instructions an additional step of updating ITSTATE is needed. We do this after calling the handler because some handlers will need to test if they are running in an IT block. Signed-off-by: Jon Medhurst <tixy@yxit.co.uk> Acked-by: Nicolas Pitre <nicolas.pitre@linaro.org>
Diffstat (limited to 'arch/arm/kernel/kprobes-arm.c')
-rw-r--r--arch/arm/kernel/kprobes-arm.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/arch/arm/kernel/kprobes-arm.c b/arch/arm/kernel/kprobes-arm.c
index 0262b29163d1..a1143e86a09a 100644
--- a/arch/arm/kernel/kprobes-arm.c
+++ b/arch/arm/kernel/kprobes-arm.c
@@ -1494,6 +1494,12 @@ space_cccc_11xx(kprobe_opcode_t insn, struct arch_specific_insn *asi)
1494 return INSN_REJECTED; 1494 return INSN_REJECTED;
1495} 1495}
1496 1496
1497static void __kprobes arm_singlestep(struct kprobe *p, struct pt_regs *regs)
1498{
1499 regs->ARM_pc += 4;
1500 p->ainsn.insn_handler(p, regs);
1501}
1502
1497/* Return: 1503/* Return:
1498 * INSN_REJECTED If instruction is one not allowed to kprobe, 1504 * INSN_REJECTED If instruction is one not allowed to kprobe,
1499 * INSN_GOOD If instruction is supported and uses instruction slot, 1505 * INSN_GOOD If instruction is supported and uses instruction slot,
@@ -1509,6 +1515,7 @@ space_cccc_11xx(kprobe_opcode_t insn, struct arch_specific_insn *asi)
1509enum kprobe_insn __kprobes 1515enum kprobe_insn __kprobes
1510arm_kprobe_decode_insn(kprobe_opcode_t insn, struct arch_specific_insn *asi) 1516arm_kprobe_decode_insn(kprobe_opcode_t insn, struct arch_specific_insn *asi)
1511{ 1517{
1518 asi->insn_singlestep = arm_singlestep;
1512 asi->insn_check_cc = kprobe_condition_checks[insn>>28]; 1519 asi->insn_check_cc = kprobe_condition_checks[insn>>28];
1513 asi->insn[1] = KPROBE_RETURN_INSTRUCTION; 1520 asi->insn[1] = KPROBE_RETURN_INSTRUCTION;
1514 1521