30 #include <linux/ptrace.h>
32 #include <linux/module.h>
34 #include <linux/slab.h>
35 #include <asm/cacheflush.h>
37 #include <asm/uaccess.h>
39 #ifdef CONFIG_PPC_ADV_DEBUG_REGS
40 #define MSR_SINGLESTEP (MSR_DE)
42 #define MSR_SINGLESTEP (MSR_SE)
55 if ((
unsigned long)p->
addr & 0x03) {
56 printk(
"Attempt to register kprobe at an unaligned address\n");
59 printk(
"Cannot register a kprobe on rfi/rfid or mtmsr[d]\n");
66 p->
ainsn.insn = get_insn_slot();
79 p->
ainsn.boostable = 0;
100 free_insn_slot(p->
ainsn.insn, 0);
113 #ifdef CONFIG_PPC_ADV_DEBUG_REGS
114 regs->
msr &= ~MSR_CE;
115 mtspr(SPRN_DBCR0,
mfspr(SPRN_DBCR0) | DBCR0_IC | DBCR0_IDM);
116 #ifdef CONFIG_PPC_47x
134 kcb->
prev_kprobe.saved_msr = kcb->kprobe_saved_msr;
141 kcb->kprobe_saved_msr = kcb->
prev_kprobe.saved_msr;
148 kcb->kprobe_saved_msr = regs->
msr;
164 unsigned int *
addr = (
unsigned int *)regs->
nip;
172 kcb = get_kprobe_ctlblk();
175 if (kprobe_running()) {
183 regs->
msr |= kcb->kprobe_saved_msr;
192 save_previous_kprobe(kcb);
193 set_current_kprobe(p, regs, kcb);
194 kcb->kprobe_saved_msr = regs->
msr;
196 prepare_singlestep(p, regs);
197 kcb->kprobe_status = KPROBE_REENTER;
203 if (is_trap(cur_insn))
229 if (is_trap(cur_insn))
245 set_current_kprobe(p, regs, kcb);
251 if (p->
ainsn.boostable >= 0) {
252 unsigned int insn = *p->
ainsn.insn;
262 p->
ainsn.boostable = 1;
267 kcb->kprobe_status = KPROBE_HIT_SSDONE;
268 reset_current_kprobe();
271 }
else if (ret < 0) {
277 printk(
"Can't step on instruction %x\n", insn);
281 p->
ainsn.boostable = -1;
283 prepare_singlestep(p, regs);
300 asm volatile(
".global kretprobe_trampoline\n"
301 "kretprobe_trampoline:\n"
314 unsigned long flags, orig_ret_address = 0;
338 if (ri->
rp && ri->
rp->handler)
339 ri->
rp->handler(ri, regs);
344 if (orig_ret_address != trampoline_address)
353 kretprobe_assert(ri, orig_ret_address, trampoline_address);
354 regs->
nip = orig_ret_address;
356 reset_current_kprobe();
361 hlist_del(&ri->
hlist);
389 if (((
unsigned long)cur->
ainsn.insn + 4) != regs->
nip)
399 regs->
msr |= kcb->kprobe_saved_msr;
403 restore_previous_kprobe(kcb);
406 reset_current_kprobe();
423 struct kprobe *cur = kprobe_running();
439 regs->
msr |= kcb->kprobe_saved_msr;
441 restore_previous_kprobe(kcb);
443 reset_current_kprobe();
447 case KPROBE_HIT_SSDONE:
492 int ret = NOTIFY_DONE;
503 if (post_kprobe_handler(args->
regs))
537 asm volatile(
"trap" :::
"memory");
558 static struct kprobe trampoline_p = {