aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel/kprobes-thumb.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/kernel/kprobes-thumb.c')
-rw-r--r--arch/arm/kernel/kprobes-thumb.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/arch/arm/kernel/kprobes-thumb.c b/arch/arm/kernel/kprobes-thumb.c
index 24a188b1601..973c3eb1243 100644
--- a/arch/arm/kernel/kprobes-thumb.c
+++ b/arch/arm/kernel/kprobes-thumb.c
@@ -33,9 +33,24 @@ static unsigned long __kprobes thumb_check_cc(unsigned long cpsr)
33 return true; 33 return true;
34} 34}
35 35
36static void __kprobes thumb16_singlestep(struct kprobe *p, struct pt_regs *regs)
37{
38 regs->ARM_pc += 2;
39 p->ainsn.insn_handler(p, regs);
40 regs->ARM_cpsr = it_advance(regs->ARM_cpsr);
41}
42
43static void __kprobes thumb32_singlestep(struct kprobe *p, struct pt_regs *regs)
44{
45 regs->ARM_pc += 4;
46 p->ainsn.insn_handler(p, regs);
47 regs->ARM_cpsr = it_advance(regs->ARM_cpsr);
48}
49
36enum kprobe_insn __kprobes 50enum kprobe_insn __kprobes
37thumb16_kprobe_decode_insn(kprobe_opcode_t insn, struct arch_specific_insn *asi) 51thumb16_kprobe_decode_insn(kprobe_opcode_t insn, struct arch_specific_insn *asi)
38{ 52{
53 asi->insn_singlestep = thumb16_singlestep;
39 asi->insn_check_cc = thumb_check_cc; 54 asi->insn_check_cc = thumb_check_cc;
40 return INSN_REJECTED; 55 return INSN_REJECTED;
41} 56}
@@ -43,6 +58,7 @@ thumb16_kprobe_decode_insn(kprobe_opcode_t insn, struct arch_specific_insn *asi)
43enum kprobe_insn __kprobes 58enum kprobe_insn __kprobes
44thumb32_kprobe_decode_insn(kprobe_opcode_t insn, struct arch_specific_insn *asi) 59thumb32_kprobe_decode_insn(kprobe_opcode_t insn, struct arch_specific_insn *asi)
45{ 60{
61 asi->insn_singlestep = thumb32_singlestep;
46 asi->insn_check_cc = thumb_check_cc; 62 asi->insn_check_cc = thumb_check_cc;
47 return INSN_REJECTED; 63 return INSN_REJECTED;
48} 64}