diff options
Diffstat (limited to 'arch/arm/kernel/kprobes-arm.c')
-rw-r--r-- | arch/arm/kernel/kprobes-arm.c | 7 |
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 | ||
1497 | static 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) | |||
1509 | enum kprobe_insn __kprobes | 1515 | enum kprobe_insn __kprobes |
1510 | arm_kprobe_decode_insn(kprobe_opcode_t insn, struct arch_specific_insn *asi) | 1516 | arm_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 | ||