1 // SPDX-License-Identifier: GPL-2.0
3 * Kernel probes (kprobes) for SuperH
5 * Copyright (C) 2007 Chris Smith <chris.smith@st.com>
6 * Copyright (C) 2006 Lineo Solutions, Inc.
8 #include <linux/kprobes.h>
9 #include <linux/extable.h>
10 #include <linux/ptrace.h>
11 #include <linux/preempt.h>
12 #include <linux/kdebug.h>
13 #include <linux/slab.h>
14 #include <asm/cacheflush.h>
15 #include <linux/uaccess.h>
17 DEFINE_PER_CPU(struct kprobe
*, current_kprobe
) = NULL
;
18 DEFINE_PER_CPU(struct kprobe_ctlblk
, kprobe_ctlblk
);
20 static DEFINE_PER_CPU(struct kprobe
, saved_current_opcode
);
21 static DEFINE_PER_CPU(struct kprobe
, saved_next_opcode
);
22 static DEFINE_PER_CPU(struct kprobe
, saved_next_opcode2
);
24 #define OPCODE_JMP(x) (((x) & 0xF0FF) == 0x402b)
25 #define OPCODE_JSR(x) (((x) & 0xF0FF) == 0x400b)
26 #define OPCODE_BRA(x) (((x) & 0xF000) == 0xa000)
27 #define OPCODE_BRAF(x) (((x) & 0xF0FF) == 0x0023)
28 #define OPCODE_BSR(x) (((x) & 0xF000) == 0xb000)
29 #define OPCODE_BSRF(x) (((x) & 0xF0FF) == 0x0003)
31 #define OPCODE_BF_S(x) (((x) & 0xFF00) == 0x8f00)
32 #define OPCODE_BT_S(x) (((x) & 0xFF00) == 0x8d00)
34 #define OPCODE_BF(x) (((x) & 0xFF00) == 0x8b00)
35 #define OPCODE_BT(x) (((x) & 0xFF00) == 0x8900)
37 #define OPCODE_RTS(x) (((x) & 0x000F) == 0x000b)
38 #define OPCODE_RTE(x) (((x) & 0xFFFF) == 0x002b)
40 int __kprobes
arch_prepare_kprobe(struct kprobe
*p
)
42 kprobe_opcode_t opcode
= *p
->addr
;
44 if (OPCODE_RTE(opcode
))
45 return -EFAULT
; /* Bad breakpoint */
47 memcpy(p
->ainsn
.insn
, p
->addr
, MAX_INSN_SIZE
* sizeof(kprobe_opcode_t
));
53 void __kprobes
arch_arm_kprobe(struct kprobe
*p
)
55 *p
->addr
= BREAKPOINT_INSTRUCTION
;
56 flush_icache_range((unsigned long)p
->addr
,
57 (unsigned long)p
->addr
+ sizeof(kprobe_opcode_t
));
60 void __kprobes
arch_disarm_kprobe(struct kprobe
*p
)
63 flush_icache_range((unsigned long)p
->addr
,
64 (unsigned long)p
->addr
+ sizeof(kprobe_opcode_t
));
67 int __kprobes
arch_trampoline_kprobe(struct kprobe
*p
)
69 if (*p
->addr
== BREAKPOINT_INSTRUCTION
)
76 * If an illegal slot instruction exception occurs for an address
77 * containing a kprobe, remove the probe.
79 * Returns 0 if the exception was handled successfully, 1 otherwise.
81 int __kprobes
kprobe_handle_illslot(unsigned long pc
)
83 struct kprobe
*p
= get_kprobe((kprobe_opcode_t
*) pc
+ 1);
86 printk("Warning: removing kprobe from delay slot: 0x%.8x\n",
87 (unsigned int)pc
+ 2);
95 void __kprobes
arch_remove_kprobe(struct kprobe
*p
)
97 struct kprobe
*saved
= this_cpu_ptr(&saved_next_opcode
);
100 arch_disarm_kprobe(p
);
101 arch_disarm_kprobe(saved
);
106 saved
= this_cpu_ptr(&saved_next_opcode2
);
108 arch_disarm_kprobe(saved
);
116 static void __kprobes
save_previous_kprobe(struct kprobe_ctlblk
*kcb
)
118 kcb
->prev_kprobe
.kp
= kprobe_running();
119 kcb
->prev_kprobe
.status
= kcb
->kprobe_status
;
122 static void __kprobes
restore_previous_kprobe(struct kprobe_ctlblk
*kcb
)
124 __this_cpu_write(current_kprobe
, kcb
->prev_kprobe
.kp
);
125 kcb
->kprobe_status
= kcb
->prev_kprobe
.status
;
128 static void __kprobes
set_current_kprobe(struct kprobe
*p
, struct pt_regs
*regs
,
129 struct kprobe_ctlblk
*kcb
)
131 __this_cpu_write(current_kprobe
, p
);
135 * Singlestep is implemented by disabling the current kprobe and setting one
136 * on the next instruction, following branches. Two probes are set if the
137 * branch is conditional.
139 static void __kprobes
prepare_singlestep(struct kprobe
*p
, struct pt_regs
*regs
)
141 __this_cpu_write(saved_current_opcode
.addr
, (kprobe_opcode_t
*)regs
->pc
);
144 struct kprobe
*op1
, *op2
;
146 arch_disarm_kprobe(p
);
148 op1
= this_cpu_ptr(&saved_next_opcode
);
149 op2
= this_cpu_ptr(&saved_next_opcode2
);
151 if (OPCODE_JSR(p
->opcode
) || OPCODE_JMP(p
->opcode
)) {
152 unsigned int reg_nr
= ((p
->opcode
>> 8) & 0x000F);
153 op1
->addr
= (kprobe_opcode_t
*) regs
->regs
[reg_nr
];
154 } else if (OPCODE_BRA(p
->opcode
) || OPCODE_BSR(p
->opcode
)) {
155 unsigned long disp
= (p
->opcode
& 0x0FFF);
157 (kprobe_opcode_t
*) (regs
->pc
+ 4 + disp
* 2);
159 } else if (OPCODE_BRAF(p
->opcode
) || OPCODE_BSRF(p
->opcode
)) {
160 unsigned int reg_nr
= ((p
->opcode
>> 8) & 0x000F);
162 (kprobe_opcode_t
*) (regs
->pc
+ 4 +
165 } else if (OPCODE_RTS(p
->opcode
)) {
166 op1
->addr
= (kprobe_opcode_t
*) regs
->pr
;
168 } else if (OPCODE_BF(p
->opcode
) || OPCODE_BT(p
->opcode
)) {
169 unsigned long disp
= (p
->opcode
& 0x00FF);
171 op1
->addr
= p
->addr
+ 1;
174 (kprobe_opcode_t
*) (regs
->pc
+ 4 + disp
* 2);
175 op2
->opcode
= *(op2
->addr
);
176 arch_arm_kprobe(op2
);
178 } else if (OPCODE_BF_S(p
->opcode
) || OPCODE_BT_S(p
->opcode
)) {
179 unsigned long disp
= (p
->opcode
& 0x00FF);
181 op1
->addr
= p
->addr
+ 2;
184 (kprobe_opcode_t
*) (regs
->pc
+ 4 + disp
* 2);
185 op2
->opcode
= *(op2
->addr
);
186 arch_arm_kprobe(op2
);
189 op1
->addr
= p
->addr
+ 1;
192 op1
->opcode
= *(op1
->addr
);
193 arch_arm_kprobe(op1
);
197 /* Called with kretprobe_lock held */
198 void __kprobes
arch_prepare_kretprobe(struct kretprobe_instance
*ri
,
199 struct pt_regs
*regs
)
201 ri
->ret_addr
= (kprobe_opcode_t
*) regs
->pr
;
204 /* Replace the return addr with trampoline addr */
205 regs
->pr
= (unsigned long)__kretprobe_trampoline
;
208 static int __kprobes
kprobe_handler(struct pt_regs
*regs
)
212 kprobe_opcode_t
*addr
= NULL
;
213 struct kprobe_ctlblk
*kcb
;
216 * We don't want to be preempted for the entire
217 * duration of kprobe processing
220 kcb
= get_kprobe_ctlblk();
222 addr
= (kprobe_opcode_t
*) (regs
->pc
);
224 /* Check we're not actually recursing */
225 if (kprobe_running()) {
226 p
= get_kprobe(addr
);
228 if (kcb
->kprobe_status
== KPROBE_HIT_SS
&&
229 *p
->ainsn
.insn
== BREAKPOINT_INSTRUCTION
) {
232 /* We have reentered the kprobe_handler(), since
233 * another probe was hit while within the handler.
234 * We here save the original kprobes variables and
235 * just single step on the instruction of the new probe
236 * without calling any user handlers.
238 save_previous_kprobe(kcb
);
239 set_current_kprobe(p
, regs
, kcb
);
240 kprobes_inc_nmissed_count(p
);
241 prepare_singlestep(p
, regs
);
242 kcb
->kprobe_status
= KPROBE_REENTER
;
248 p
= get_kprobe(addr
);
250 /* Not one of ours: let kernel handle it */
251 if (*addr
!= BREAKPOINT_INSTRUCTION
) {
253 * The breakpoint instruction was removed right
254 * after we hit it. Another cpu has removed
255 * either a probepoint or a debugger breakpoint
256 * at this address. In either case, no further
257 * handling of this interrupt is appropriate.
265 set_current_kprobe(p
, regs
, kcb
);
266 kcb
->kprobe_status
= KPROBE_HIT_ACTIVE
;
268 if (p
->pre_handler
&& p
->pre_handler(p
, regs
)) {
269 /* handler has already set things up, so skip ss setup */
270 reset_current_kprobe();
271 preempt_enable_no_resched();
275 prepare_singlestep(p
, regs
);
276 kcb
->kprobe_status
= KPROBE_HIT_SS
;
280 preempt_enable_no_resched();
285 * For function-return probes, init_kprobes() establishes a probepoint
286 * here. When a retprobed function returns, this probe is hit and
287 * trampoline_probe_handler() runs, calling the kretprobe's handler.
289 static void __used
kretprobe_trampoline_holder(void)
291 asm volatile (".globl __kretprobe_trampoline\n"
292 "__kretprobe_trampoline:\n\t"
297 * Called when we hit the probe point at __kretprobe_trampoline
299 static int __kprobes
trampoline_probe_handler(struct kprobe
*p
, struct pt_regs
*regs
)
301 regs
->pc
= __kretprobe_trampoline_handler(regs
, NULL
);
306 static int __kprobes
post_kprobe_handler(struct pt_regs
*regs
)
308 struct kprobe
*cur
= kprobe_running();
309 struct kprobe_ctlblk
*kcb
= get_kprobe_ctlblk();
310 kprobe_opcode_t
*addr
= NULL
;
311 struct kprobe
*p
= NULL
;
316 if ((kcb
->kprobe_status
!= KPROBE_REENTER
) && cur
->post_handler
) {
317 kcb
->kprobe_status
= KPROBE_HIT_SSDONE
;
318 cur
->post_handler(cur
, regs
, 0);
321 p
= this_cpu_ptr(&saved_next_opcode
);
323 arch_disarm_kprobe(p
);
327 addr
= __this_cpu_read(saved_current_opcode
.addr
);
328 __this_cpu_write(saved_current_opcode
.addr
, NULL
);
330 p
= get_kprobe(addr
);
333 p
= this_cpu_ptr(&saved_next_opcode2
);
335 arch_disarm_kprobe(p
);
341 /* Restore back the original saved kprobes variables and continue. */
342 if (kcb
->kprobe_status
== KPROBE_REENTER
) {
343 restore_previous_kprobe(kcb
);
347 reset_current_kprobe();
350 preempt_enable_no_resched();
355 int __kprobes
kprobe_fault_handler(struct pt_regs
*regs
, int trapnr
)
357 struct kprobe
*cur
= kprobe_running();
358 struct kprobe_ctlblk
*kcb
= get_kprobe_ctlblk();
359 const struct exception_table_entry
*entry
;
361 switch (kcb
->kprobe_status
) {
365 * We are here because the instruction being single
366 * stepped caused a page fault. We reset the current
367 * kprobe, point the pc back to the probe address
368 * and allow the page fault handler to continue as a
371 regs
->pc
= (unsigned long)cur
->addr
;
372 if (kcb
->kprobe_status
== KPROBE_REENTER
)
373 restore_previous_kprobe(kcb
);
375 reset_current_kprobe();
376 preempt_enable_no_resched();
378 case KPROBE_HIT_ACTIVE
:
379 case KPROBE_HIT_SSDONE
:
381 * In case the user-specified fault handler returned
382 * zero, try to fix up.
384 if ((entry
= search_exception_tables(regs
->pc
)) != NULL
) {
385 regs
->pc
= entry
->fixup
;
390 * fixup_exception() could not handle it,
391 * Let do_page_fault() fix it.
402 * Wrapper routine to for handling exceptions.
404 int __kprobes
kprobe_exceptions_notify(struct notifier_block
*self
,
405 unsigned long val
, void *data
)
407 struct kprobe
*p
= NULL
;
408 struct die_args
*args
= (struct die_args
*)data
;
409 int ret
= NOTIFY_DONE
;
410 kprobe_opcode_t
*addr
= NULL
;
411 struct kprobe_ctlblk
*kcb
= get_kprobe_ctlblk();
413 addr
= (kprobe_opcode_t
*) (args
->regs
->pc
);
414 if (val
== DIE_TRAP
&&
415 args
->trapnr
== (BREAKPOINT_INSTRUCTION
& 0xff)) {
416 if (!kprobe_running()) {
417 if (kprobe_handler(args
->regs
)) {
420 /* Not a kprobe trap */
424 p
= get_kprobe(addr
);
425 if ((kcb
->kprobe_status
== KPROBE_HIT_SS
) ||
426 (kcb
->kprobe_status
== KPROBE_REENTER
)) {
427 if (post_kprobe_handler(args
->regs
))
430 if (kprobe_handler(args
->regs
))
439 static struct kprobe trampoline_p
= {
440 .addr
= (kprobe_opcode_t
*)&__kretprobe_trampoline
,
441 .pre_handler
= trampoline_probe_handler
444 int __init
arch_init_kprobes(void)
446 return register_kprobe(&trampoline_p
);