Merge git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
[powerpc.git] / arch / sparc64 / kernel / kprobes.c
1 /* arch/sparc64/kernel/kprobes.c
2  *
3  * Copyright (C) 2004 David S. Miller <davem@davemloft.net>
4  */
5
6 #include <linux/config.h>
7 #include <linux/kernel.h>
8 #include <linux/kprobes.h>
9 #include <asm/kdebug.h>
10 #include <asm/signal.h>
11 #include <asm/cacheflush.h>
12
13 /* We do not have hardware single-stepping on sparc64.
14  * So we implement software single-stepping with breakpoint
15  * traps.  The top-level scheme is similar to that used
16  * in the x86 kprobes implementation.
17  *
18  * In the kprobe->ainsn.insn[] array we store the original
19  * instruction at index zero and a break instruction at
20  * index one.
21  *
22  * When we hit a kprobe we:
23  * - Run the pre-handler
24  * - Remember "regs->tnpc" and interrupt level stored in
25  *   "regs->tstate" so we can restore them later
26  * - Disable PIL interrupts
27  * - Set regs->tpc to point to kprobe->ainsn.insn[0]
28  * - Set regs->tnpc to point to kprobe->ainsn.insn[1]
29  * - Mark that we are actively in a kprobe
30  *
31  * At this point we wait for the second breakpoint at
32  * kprobe->ainsn.insn[1] to hit.  When it does we:
33  * - Run the post-handler
34  * - Set regs->tpc to "remembered" regs->tnpc stored above,
35  *   restore the PIL interrupt level in "regs->tstate" as well
36  * - Make any adjustments necessary to regs->tnpc in order
37  *   to handle relative branches correctly.  See below.
38  * - Mark that we are no longer actively in a kprobe.
39  */
40
41 DEFINE_PER_CPU(struct kprobe *, current_kprobe) = NULL;
42 DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);
43
44 int __kprobes arch_prepare_kprobe(struct kprobe *p)
45 {
46         p->ainsn.insn[0] = *p->addr;
47         p->ainsn.insn[1] = BREAKPOINT_INSTRUCTION_2;
48         p->opcode = *p->addr;
49         return 0;
50 }
51
52 void __kprobes arch_arm_kprobe(struct kprobe *p)
53 {
54         *p->addr = BREAKPOINT_INSTRUCTION;
55         flushi(p->addr);
56 }
57
58 void __kprobes arch_disarm_kprobe(struct kprobe *p)
59 {
60         *p->addr = p->opcode;
61         flushi(p->addr);
62 }
63
64 static inline void save_previous_kprobe(struct kprobe_ctlblk *kcb)
65 {
66         kcb->prev_kprobe.kp = kprobe_running();
67         kcb->prev_kprobe.status = kcb->kprobe_status;
68         kcb->prev_kprobe.orig_tnpc = kcb->kprobe_orig_tnpc;
69         kcb->prev_kprobe.orig_tstate_pil = kcb->kprobe_orig_tstate_pil;
70 }
71
72 static inline void restore_previous_kprobe(struct kprobe_ctlblk *kcb)
73 {
74         __get_cpu_var(current_kprobe) = kcb->prev_kprobe.kp;
75         kcb->kprobe_status = kcb->prev_kprobe.status;
76         kcb->kprobe_orig_tnpc = kcb->prev_kprobe.orig_tnpc;
77         kcb->kprobe_orig_tstate_pil = kcb->prev_kprobe.orig_tstate_pil;
78 }
79
80 static inline void set_current_kprobe(struct kprobe *p, struct pt_regs *regs,
81                                 struct kprobe_ctlblk *kcb)
82 {
83         __get_cpu_var(current_kprobe) = p;
84         kcb->kprobe_orig_tnpc = regs->tnpc;
85         kcb->kprobe_orig_tstate_pil = (regs->tstate & TSTATE_PIL);
86 }
87
88 static inline void prepare_singlestep(struct kprobe *p, struct pt_regs *regs,
89                         struct kprobe_ctlblk *kcb)
90 {
91         regs->tstate |= TSTATE_PIL;
92
93         /*single step inline, if it a breakpoint instruction*/
94         if (p->opcode == BREAKPOINT_INSTRUCTION) {
95                 regs->tpc = (unsigned long) p->addr;
96                 regs->tnpc = kcb->kprobe_orig_tnpc;
97         } else {
98                 regs->tpc = (unsigned long) &p->ainsn.insn[0];
99                 regs->tnpc = (unsigned long) &p->ainsn.insn[1];
100         }
101 }
102
103 static int __kprobes kprobe_handler(struct pt_regs *regs)
104 {
105         struct kprobe *p;
106         void *addr = (void *) regs->tpc;
107         int ret = 0;
108         struct kprobe_ctlblk *kcb;
109
110         /*
111          * We don't want to be preempted for the entire
112          * duration of kprobe processing
113          */
114         preempt_disable();
115         kcb = get_kprobe_ctlblk();
116
117         if (kprobe_running()) {
118                 p = get_kprobe(addr);
119                 if (p) {
120                         if (kcb->kprobe_status == KPROBE_HIT_SS) {
121                                 regs->tstate = ((regs->tstate & ~TSTATE_PIL) |
122                                         kcb->kprobe_orig_tstate_pil);
123                                 goto no_kprobe;
124                         }
125                         /* We have reentered the kprobe_handler(), since
126                          * another probe was hit while within the handler.
127                          * We here save the original kprobes variables and
128                          * just single step on the instruction of the new probe
129                          * without calling any user handlers.
130                          */
131                         save_previous_kprobe(kcb);
132                         set_current_kprobe(p, regs, kcb);
133                         kprobes_inc_nmissed_count(p);
134                         kcb->kprobe_status = KPROBE_REENTER;
135                         prepare_singlestep(p, regs, kcb);
136                         return 1;
137                 } else {
138                         p = __get_cpu_var(current_kprobe);
139                         if (p->break_handler && p->break_handler(p, regs))
140                                 goto ss_probe;
141                 }
142                 goto no_kprobe;
143         }
144
145         p = get_kprobe(addr);
146         if (!p) {
147                 if (*(u32 *)addr != BREAKPOINT_INSTRUCTION) {
148                         /*
149                          * The breakpoint instruction was removed right
150                          * after we hit it.  Another cpu has removed
151                          * either a probepoint or a debugger breakpoint
152                          * at this address.  In either case, no further
153                          * handling of this interrupt is appropriate.
154                          */
155                         ret = 1;
156                 }
157                 /* Not one of ours: let kernel handle it */
158                 goto no_kprobe;
159         }
160
161         set_current_kprobe(p, regs, kcb);
162         kcb->kprobe_status = KPROBE_HIT_ACTIVE;
163         if (p->pre_handler && p->pre_handler(p, regs))
164                 return 1;
165
166 ss_probe:
167         prepare_singlestep(p, regs, kcb);
168         kcb->kprobe_status = KPROBE_HIT_SS;
169         return 1;
170
171 no_kprobe:
172         preempt_enable_no_resched();
173         return ret;
174 }
175
176 /* If INSN is a relative control transfer instruction,
177  * return the corrected branch destination value.
178  *
179  * The original INSN location was REAL_PC, it actually
180  * executed at PC and produced destination address NPC.
181  */
182 static unsigned long __kprobes relbranch_fixup(u32 insn, unsigned long real_pc,
183                                                unsigned long pc,
184                                                unsigned long npc)
185 {
186         /* Branch not taken, no mods necessary.  */
187         if (npc == pc + 0x4UL)
188                 return real_pc + 0x4UL;
189
190         /* The three cases are call, branch w/prediction,
191          * and traditional branch.
192          */
193         if ((insn & 0xc0000000) == 0x40000000 ||
194             (insn & 0xc1c00000) == 0x00400000 ||
195             (insn & 0xc1c00000) == 0x00800000) {
196                 /* The instruction did all the work for us
197                  * already, just apply the offset to the correct
198                  * instruction location.
199                  */
200                 return (real_pc + (npc - pc));
201         }
202
203         return real_pc + 0x4UL;
204 }
205
206 /* If INSN is an instruction which writes it's PC location
207  * into a destination register, fix that up.
208  */
209 static void __kprobes retpc_fixup(struct pt_regs *regs, u32 insn,
210                                   unsigned long real_pc)
211 {
212         unsigned long *slot = NULL;
213
214         /* Simplest cast is call, which always uses %o7 */
215         if ((insn & 0xc0000000) == 0x40000000) {
216                 slot = &regs->u_regs[UREG_I7];
217         }
218
219         /* Jmpl encodes the register inside of the opcode */
220         if ((insn & 0xc1f80000) == 0x81c00000) {
221                 unsigned long rd = ((insn >> 25) & 0x1f);
222
223                 if (rd <= 15) {
224                         slot = &regs->u_regs[rd];
225                 } else {
226                         /* Hard case, it goes onto the stack. */
227                         flushw_all();
228
229                         rd -= 16;
230                         slot = (unsigned long *)
231                                 (regs->u_regs[UREG_FP] + STACK_BIAS);
232                         slot += rd;
233                 }
234         }
235         if (slot != NULL)
236                 *slot = real_pc;
237 }
238
239 /*
240  * Called after single-stepping.  p->addr is the address of the
241  * instruction whose first byte has been replaced by the breakpoint
242  * instruction.  To avoid the SMP problems that can occur when we
243  * temporarily put back the original opcode to single-step, we
244  * single-stepped a copy of the instruction.  The address of this
245  * copy is p->ainsn.insn.
246  *
247  * This function prepares to return from the post-single-step
248  * breakpoint trap.
249  */
250 static void __kprobes resume_execution(struct kprobe *p,
251                 struct pt_regs *regs, struct kprobe_ctlblk *kcb)
252 {
253         u32 insn = p->ainsn.insn[0];
254
255         regs->tpc = kcb->kprobe_orig_tnpc;
256         regs->tnpc = relbranch_fixup(insn,
257                                      (unsigned long) p->addr,
258                                      (unsigned long) &p->ainsn.insn[0],
259                                      regs->tnpc);
260         retpc_fixup(regs, insn, (unsigned long) p->addr);
261
262         regs->tstate = ((regs->tstate & ~TSTATE_PIL) |
263                         kcb->kprobe_orig_tstate_pil);
264 }
265
266 static inline int post_kprobe_handler(struct pt_regs *regs)
267 {
268         struct kprobe *cur = kprobe_running();
269         struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
270
271         if (!cur)
272                 return 0;
273
274         if ((kcb->kprobe_status != KPROBE_REENTER) && cur->post_handler) {
275                 kcb->kprobe_status = KPROBE_HIT_SSDONE;
276                 cur->post_handler(cur, regs, 0);
277         }
278
279         resume_execution(cur, regs, kcb);
280
281         /*Restore back the original saved kprobes variables and continue. */
282         if (kcb->kprobe_status == KPROBE_REENTER) {
283                 restore_previous_kprobe(kcb);
284                 goto out;
285         }
286         reset_current_kprobe();
287 out:
288         preempt_enable_no_resched();
289
290         return 1;
291 }
292
293 static inline int kprobe_fault_handler(struct pt_regs *regs, int trapnr)
294 {
295         struct kprobe *cur = kprobe_running();
296         struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
297
298         if (cur->fault_handler && cur->fault_handler(cur, regs, trapnr))
299                 return 1;
300
301         if (kcb->kprobe_status & KPROBE_HIT_SS) {
302                 resume_execution(cur, regs, kcb);
303
304                 reset_current_kprobe();
305                 preempt_enable_no_resched();
306         }
307         return 0;
308 }
309
310 /*
311  * Wrapper routine to for handling exceptions.
312  */
313 int __kprobes kprobe_exceptions_notify(struct notifier_block *self,
314                                        unsigned long val, void *data)
315 {
316         struct die_args *args = (struct die_args *)data;
317         int ret = NOTIFY_DONE;
318
319         switch (val) {
320         case DIE_DEBUG:
321                 if (kprobe_handler(args->regs))
322                         ret = NOTIFY_STOP;
323                 break;
324         case DIE_DEBUG_2:
325                 if (post_kprobe_handler(args->regs))
326                         ret = NOTIFY_STOP;
327                 break;
328         case DIE_GPF:
329         case DIE_PAGE_FAULT:
330                 /* kprobe_running() needs smp_processor_id() */
331                 preempt_disable();
332                 if (kprobe_running() &&
333                     kprobe_fault_handler(args->regs, args->trapnr))
334                         ret = NOTIFY_STOP;
335                 preempt_enable();
336                 break;
337         default:
338                 break;
339         }
340         return ret;
341 }
342
343 asmlinkage void __kprobes kprobe_trap(unsigned long trap_level,
344                                       struct pt_regs *regs)
345 {
346         BUG_ON(trap_level != 0x170 && trap_level != 0x171);
347
348         if (user_mode(regs)) {
349                 local_irq_enable();
350                 bad_trap(regs, trap_level);
351                 return;
352         }
353
354         /* trap_level == 0x170 --> ta 0x70
355          * trap_level == 0x171 --> ta 0x71
356          */
357         if (notify_die((trap_level == 0x170) ? DIE_DEBUG : DIE_DEBUG_2,
358                        (trap_level == 0x170) ? "debug" : "debug_2",
359                        regs, 0, trap_level, SIGTRAP) != NOTIFY_STOP)
360                 bad_trap(regs, trap_level);
361 }
362
363 /* Jprobes support.  */
364 int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs)
365 {
366         struct jprobe *jp = container_of(p, struct jprobe, kp);
367         struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
368
369         kcb->jprobe_saved_regs_location = regs;
370         memcpy(&(kcb->jprobe_saved_regs), regs, sizeof(*regs));
371
372         /* Save a whole stack frame, this gets arguments
373          * pushed onto the stack after using up all the
374          * arg registers.
375          */
376         memcpy(&(kcb->jprobe_saved_stack),
377                (char *) (regs->u_regs[UREG_FP] + STACK_BIAS),
378                sizeof(kcb->jprobe_saved_stack));
379
380         regs->tpc  = (unsigned long) jp->entry;
381         regs->tnpc = ((unsigned long) jp->entry) + 0x4UL;
382         regs->tstate |= TSTATE_PIL;
383
384         return 1;
385 }
386
387 void __kprobes jprobe_return(void)
388 {
389         __asm__ __volatile__(
390                 ".globl jprobe_return_trap_instruction\n"
391 "jprobe_return_trap_instruction:\n\t"
392                 "ta 0x70");
393 }
394
395 extern void jprobe_return_trap_instruction(void);
396
397 extern void __show_regs(struct pt_regs * regs);
398
399 int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs)
400 {
401         u32 *addr = (u32 *) regs->tpc;
402         struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
403
404         if (addr == (u32 *) jprobe_return_trap_instruction) {
405                 if (kcb->jprobe_saved_regs_location != regs) {
406                         printk("JPROBE: Current regs (%p) does not match "
407                                "saved regs (%p).\n",
408                                regs, kcb->jprobe_saved_regs_location);
409                         printk("JPROBE: Saved registers\n");
410                         __show_regs(kcb->jprobe_saved_regs_location);
411                         printk("JPROBE: Current registers\n");
412                         __show_regs(regs);
413                         BUG();
414                 }
415                 /* Restore old register state.  Do pt_regs
416                  * first so that UREG_FP is the original one for
417                  * the stack frame restore.
418                  */
419                 memcpy(regs, &(kcb->jprobe_saved_regs), sizeof(*regs));
420
421                 memcpy((char *) (regs->u_regs[UREG_FP] + STACK_BIAS),
422                        &(kcb->jprobe_saved_stack),
423                        sizeof(kcb->jprobe_saved_stack));
424
425                 preempt_enable_no_resched();
426                 return 1;
427         }
428         return 0;
429 }
430
431 /* architecture specific initialization */
432 int arch_init_kprobes(void)
433 {
434         return 0;
435 }