diff options
Diffstat (limited to 'arch/arm/kernel/kprobes-thumb.c')
-rw-r--r-- | arch/arm/kernel/kprobes-thumb.c | 16 |
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 | ||
36 | static 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 | |||
43 | static 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 | |||
36 | enum kprobe_insn __kprobes | 50 | enum kprobe_insn __kprobes |
37 | thumb16_kprobe_decode_insn(kprobe_opcode_t insn, struct arch_specific_insn *asi) | 51 | thumb16_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) | |||
43 | enum kprobe_insn __kprobes | 58 | enum kprobe_insn __kprobes |
44 | thumb32_kprobe_decode_insn(kprobe_opcode_t insn, struct arch_specific_insn *asi) | 59 | thumb32_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 | } |