1 // SPDX-License-Identifier: GPL-2.0 1 2 3 #include <linux/kprobes.h> 4 5 /* Ftrace callback handler for kprobes -- call 6 void kprobe_ftrace_handler(unsigned long ip, u 7 struct ftrace_ops * 8 { 9 int bit; 10 bool lr_saver = false; 11 struct kprobe *p; 12 struct kprobe_ctlblk *kcb; 13 struct pt_regs *regs; 14 15 if (unlikely(kprobe_ftrace_disabled)) 16 return; 17 18 bit = ftrace_test_recursion_trylock(ip 19 if (bit < 0) 20 return; 21 22 regs = ftrace_get_regs(fregs); 23 p = get_kprobe((kprobe_opcode_t *)ip); 24 if (!p) { 25 p = get_kprobe((kprobe_opcode_ 26 if (unlikely(!p) || kprobe_dis 27 goto out; 28 lr_saver = true; 29 } 30 31 kcb = get_kprobe_ctlblk(); 32 if (kprobe_running()) { 33 kprobes_inc_nmissed_count(p); 34 } else { 35 unsigned long orig_ip = instru 36 37 if (lr_saver) 38 ip -= MCOUNT_INSN_SIZE 39 instruction_pointer_set(regs, 40 __this_cpu_write(current_kprob 41 kcb->kprobe_status = KPROBE_HI 42 if (!p->pre_handler || !p->pre 43 /* 44 * Emulate singlestep 45 * as if there is a no 46 */ 47 instruction_pointer_se 48 (unsigned long 49 if (unlikely(p->post_h 50 kcb->kprobe_st 51 p->post_handle 52 } 53 instruction_pointer_se 54 } 55 /* 56 * If pre_handler returns !0, 57 * skip emulating post_handler 58 */ 59 __this_cpu_write(current_kprob 60 } 61 out: 62 ftrace_test_recursion_unlock(bit); 63 } 64 NOKPROBE_SYMBOL(kprobe_ftrace_handler); 65 66 int arch_prepare_kprobe_ftrace(struct kprobe * 67 { 68 p->ainsn.api.insn = NULL; 69 return 0; 70 } 71
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.