Lines Matching +full:num +full:- +full:addresses
1 // SPDX-License-Identifier: GPL-2.0
3 * fprobe - Simple ftrace probe wrapper for function entry.
36 fp->nmissed++; in fprobe_handler()
40 if (fp->entry_handler) in fprobe_handler()
41 fp->entry_handler(fp, ip, ftrace_get_regs(fregs)); in fprobe_handler()
43 if (fp->exit_handler) { in fprobe_handler()
44 rh = rethook_try_get(fp->rethook); in fprobe_handler()
46 fp->nmissed++; in fprobe_handler()
50 fpr->entry_ip = ip; in fprobe_handler()
65 fp->nmissed++; in fprobe_kprobe_handler()
84 fp->exit_handler(fp, fpr->entry_ip, regs); in fprobe_exit_handler()
97 static unsigned long *get_ftrace_locations(const char **syms, int num) in get_ftrace_locations() argument
102 addrs = kcalloc(num, sizeof(*addrs), GFP_KERNEL); in get_ftrace_locations()
104 return ERR_PTR(-ENOMEM); in get_ftrace_locations()
107 sort(syms, num, sizeof(*syms), symbols_cmp, NULL); in get_ftrace_locations()
109 if (!ftrace_lookup_symbols(syms, num, addrs)) in get_ftrace_locations()
113 return ERR_PTR(-ENOENT); in get_ftrace_locations()
118 fp->nmissed = 0; in fprobe_init()
120 fp->ops.func = fprobe_kprobe_handler; in fprobe_init()
122 fp->ops.func = fprobe_handler; in fprobe_init()
123 fp->ops.flags |= FTRACE_OPS_FL_SAVE_REGS; in fprobe_init()
126 static int fprobe_init_rethook(struct fprobe *fp, int num) in fprobe_init_rethook() argument
130 if (num < 0) in fprobe_init_rethook()
131 return -EINVAL; in fprobe_init_rethook()
133 if (!fp->exit_handler) { in fprobe_init_rethook()
134 fp->rethook = NULL; in fprobe_init_rethook()
139 size = num * num_possible_cpus() * 2; in fprobe_init_rethook()
141 return -E2BIG; in fprobe_init_rethook()
143 fp->rethook = rethook_alloc((void *)fp, fprobe_exit_handler); in fprobe_init_rethook()
144 if (!fp->rethook) in fprobe_init_rethook()
145 return -ENOMEM; in fprobe_init_rethook()
151 rethook_free(fp->rethook); in fprobe_init_rethook()
152 fp->rethook = NULL; in fprobe_init_rethook()
153 return -ENOMEM; in fprobe_init_rethook()
155 rethook_add_node(fp->rethook, &node->node); in fprobe_init_rethook()
162 if (fp->rethook) { in fprobe_fail_cleanup()
163 /* Don't need to cleanup rethook->handler because this is not used. */ in fprobe_fail_cleanup()
164 rethook_free(fp->rethook); in fprobe_fail_cleanup()
165 fp->rethook = NULL; in fprobe_fail_cleanup()
167 ftrace_free_filter(&fp->ops); in fprobe_fail_cleanup()
171 * register_fprobe() - Register fprobe to ftrace by pattern.
179 * Return 0 if @fp is registered successfully, -errno if not.
188 return -EINVAL; in register_fprobe()
194 ret = ftrace_set_filter(&fp->ops, str, len, 0); in register_fprobe()
202 ret = ftrace_set_notrace(&fp->ops, str, len, 0); in register_fprobe()
212 hash = rcu_access_pointer(fp->ops.local_hash.filter_hash); in register_fprobe()
216 ret = fprobe_init_rethook(fp, (int)hash->count); in register_fprobe()
218 ret = register_ftrace_function(&fp->ops); in register_fprobe()
228 * register_fprobe_ips() - Register fprobe to ftrace by address.
230 * @addrs: An array of target ftrace location addresses.
231 * @num: The number of entries of @addrs.
234 * The @addrs must be the addresses of ftrace location address, which may be
235 * the symbol address + arch-dependent offset.
238 * Return 0 if @fp is registered successfully, -errno if not.
240 int register_fprobe_ips(struct fprobe *fp, unsigned long *addrs, int num) in register_fprobe_ips() argument
244 if (!fp || !addrs || num <= 0) in register_fprobe_ips()
245 return -EINVAL; in register_fprobe_ips()
249 ret = ftrace_set_filter_ips(&fp->ops, addrs, num, 0, 0); in register_fprobe_ips()
253 ret = fprobe_init_rethook(fp, num); in register_fprobe_ips()
255 ret = register_ftrace_function(&fp->ops); in register_fprobe_ips()
264 * register_fprobe_syms() - Register fprobe to ftrace by symbols.
267 * @num: The number of entries of @syms.
272 * Return 0 if @fp is registered successfully, -errno if not.
274 int register_fprobe_syms(struct fprobe *fp, const char **syms, int num) in register_fprobe_syms() argument
279 if (!fp || !syms || num <= 0) in register_fprobe_syms()
280 return -EINVAL; in register_fprobe_syms()
282 addrs = get_ftrace_locations(syms, num); in register_fprobe_syms()
286 ret = register_fprobe_ips(fp, addrs, num); in register_fprobe_syms()
295 * unregister_fprobe() - Unregister fprobe from ftrace
300 * Return 0 if @fp is unregistered successfully, -errno if not.
306 if (!fp || (fp->ops.saved_func != fprobe_handler && in unregister_fprobe()
307 fp->ops.saved_func != fprobe_kprobe_handler)) in unregister_fprobe()
308 return -EINVAL; in unregister_fprobe()
316 if (fp->rethook) in unregister_fprobe()
317 rethook_free(fp->rethook); in unregister_fprobe()
319 ret = unregister_ftrace_function(&fp->ops); in unregister_fprobe()
323 ftrace_free_filter(&fp->ops); in unregister_fprobe()