]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blame - kernel/trace/trace_kprobe.c
tracing: probeevent: Unify fetch_insn processing common part
[mirror_ubuntu-jammy-kernel.git] / kernel / trace / trace_kprobe.c
CommitLineData
bcea3f96 1// SPDX-License-Identifier: GPL-2.0
413d37d1 2/*
77b44d1b 3 * Kprobes-based tracing events
413d37d1
MH
4 *
5 * Created by Masami Hiramatsu <mhiramat@redhat.com>
6 *
413d37d1 7 */
72576341 8#define pr_fmt(fmt) "trace_kprobe: " fmt
413d37d1
MH
9
10#include <linux/module.h>
11#include <linux/uaccess.h>
b2d09103 12#include <linux/rculist.h>
540adea3 13#include <linux/error-injection.h>
413d37d1 14
d899926f 15#include "trace_kprobe_selftest.h"
8ab83f56 16#include "trace_probe.h"
53305928 17#include "trace_probe_tmpl.h"
1ff511e3 18
8ab83f56 19#define KPROBE_EVENT_SYSTEM "kprobes"
696ced4f 20#define KRETPROBE_MAXACTIVE_MAX 4096
e09c8614 21
413d37d1 22/**
77b44d1b 23 * Kprobe event core functions
413d37d1 24 */
c31ffb3f 25struct trace_kprobe {
413d37d1 26 struct list_head list;
4a846b44 27 struct kretprobe rp; /* Use rp.kp for kprobe use */
a7636d9e 28 unsigned long __percpu *nhit;
413d37d1 29 const char *symbol; /* symbol name */
c31ffb3f 30 struct trace_probe tp;
413d37d1
MH
31};
32
c31ffb3f
NK
33#define SIZEOF_TRACE_KPROBE(n) \
34 (offsetof(struct trace_kprobe, tp.args) + \
eca0d916 35 (sizeof(struct probe_arg) * (n)))
a82378d8 36
3da0f180 37static nokprobe_inline bool trace_kprobe_is_return(struct trace_kprobe *tk)
413d37d1 38{
c31ffb3f 39 return tk->rp.handler != NULL;
413d37d1
MH
40}
41
3da0f180 42static nokprobe_inline const char *trace_kprobe_symbol(struct trace_kprobe *tk)
413d37d1 43{
c31ffb3f 44 return tk->symbol ? tk->symbol : "unknown";
413d37d1
MH
45}
46
3da0f180 47static nokprobe_inline unsigned long trace_kprobe_offset(struct trace_kprobe *tk)
61424318 48{
c31ffb3f 49 return tk->rp.kp.offset;
61424318
MH
50}
51
3da0f180 52static nokprobe_inline bool trace_kprobe_has_gone(struct trace_kprobe *tk)
61424318 53{
c31ffb3f 54 return !!(kprobe_gone(&tk->rp.kp));
61424318
MH
55}
56
3da0f180 57static nokprobe_inline bool trace_kprobe_within_module(struct trace_kprobe *tk,
c31ffb3f 58 struct module *mod)
61424318
MH
59{
60 int len = strlen(mod->name);
c31ffb3f 61 const char *name = trace_kprobe_symbol(tk);
61424318
MH
62 return strncmp(mod->name, name, len) == 0 && name[len] == ':';
63}
64
3da0f180 65static nokprobe_inline bool trace_kprobe_is_on_module(struct trace_kprobe *tk)
61424318 66{
c31ffb3f 67 return !!strchr(trace_kprobe_symbol(tk), ':');
61424318
MH
68}
69
f18f97ac
MN
70static nokprobe_inline unsigned long trace_kprobe_nhit(struct trace_kprobe *tk)
71{
72 unsigned long nhit = 0;
73 int cpu;
74
75 for_each_possible_cpu(cpu)
76 nhit += *per_cpu_ptr(tk->nhit, cpu);
77
78 return nhit;
79}
80
6bc6c77c 81/* Return 0 if it fails to find the symbol address */
45408c4f
MH
82static nokprobe_inline
83unsigned long trace_kprobe_address(struct trace_kprobe *tk)
84{
85 unsigned long addr;
86
87 if (tk->symbol) {
88 addr = (unsigned long)
89 kallsyms_lookup_name(trace_kprobe_symbol(tk));
6bc6c77c
MH
90 if (addr)
91 addr += tk->rp.kp.offset;
45408c4f
MH
92 } else {
93 addr = (unsigned long)tk->rp.kp.addr;
94 }
95 return addr;
96}
97
b4da3340 98bool trace_kprobe_on_func_entry(struct trace_event_call *call)
9802d865
JB
99{
100 struct trace_kprobe *tk = (struct trace_kprobe *)call->data;
b4da3340
MH
101
102 return kprobe_on_func_entry(tk->rp.kp.addr,
103 tk->rp.kp.addr ? NULL : tk->rp.kp.symbol_name,
104 tk->rp.kp.addr ? 0 : tk->rp.kp.offset);
9802d865
JB
105}
106
b4da3340 107bool trace_kprobe_error_injectable(struct trace_event_call *call)
9802d865
JB
108{
109 struct trace_kprobe *tk = (struct trace_kprobe *)call->data;
9802d865 110
45408c4f 111 return within_error_injection_list(trace_kprobe_address(tk));
9802d865
JB
112}
113
c31ffb3f
NK
114static int register_kprobe_event(struct trace_kprobe *tk);
115static int unregister_kprobe_event(struct trace_kprobe *tk);
413d37d1
MH
116
117static DEFINE_MUTEX(probe_lock);
118static LIST_HEAD(probe_list);
119
50d78056
MH
120static int kprobe_dispatcher(struct kprobe *kp, struct pt_regs *regs);
121static int kretprobe_dispatcher(struct kretprobe_instance *ri,
122 struct pt_regs *regs);
123
4a846b44
MH
124/*
125 * Allocate new trace_probe and initialize it (including kprobes).
126 */
c31ffb3f 127static struct trace_kprobe *alloc_trace_kprobe(const char *group,
f52487e9 128 const char *event,
4a846b44
MH
129 void *addr,
130 const char *symbol,
131 unsigned long offs,
696ced4f 132 int maxactive,
3a6b7666 133 int nargs, bool is_return)
413d37d1 134{
c31ffb3f 135 struct trace_kprobe *tk;
6f3cf440 136 int ret = -ENOMEM;
413d37d1 137
c31ffb3f
NK
138 tk = kzalloc(SIZEOF_TRACE_KPROBE(nargs), GFP_KERNEL);
139 if (!tk)
6f3cf440 140 return ERR_PTR(ret);
413d37d1 141
a7636d9e
MKL
142 tk->nhit = alloc_percpu(unsigned long);
143 if (!tk->nhit)
144 goto error;
145
413d37d1 146 if (symbol) {
c31ffb3f
NK
147 tk->symbol = kstrdup(symbol, GFP_KERNEL);
148 if (!tk->symbol)
413d37d1 149 goto error;
c31ffb3f
NK
150 tk->rp.kp.symbol_name = tk->symbol;
151 tk->rp.kp.offset = offs;
4a846b44 152 } else
c31ffb3f 153 tk->rp.kp.addr = addr;
4a846b44
MH
154
155 if (is_return)
c31ffb3f 156 tk->rp.handler = kretprobe_dispatcher;
4a846b44 157 else
c31ffb3f 158 tk->rp.kp.pre_handler = kprobe_dispatcher;
4a846b44 159
696ced4f
AC
160 tk->rp.maxactive = maxactive;
161
da34634f 162 if (!event || !is_good_name(event)) {
6f3cf440 163 ret = -EINVAL;
4263565d 164 goto error;
6f3cf440
MH
165 }
166
c31ffb3f
NK
167 tk->tp.call.class = &tk->tp.class;
168 tk->tp.call.name = kstrdup(event, GFP_KERNEL);
169 if (!tk->tp.call.name)
4263565d 170 goto error;
413d37d1 171
da34634f 172 if (!group || !is_good_name(group)) {
6f3cf440 173 ret = -EINVAL;
f52487e9 174 goto error;
6f3cf440
MH
175 }
176
c31ffb3f
NK
177 tk->tp.class.system = kstrdup(group, GFP_KERNEL);
178 if (!tk->tp.class.system)
f52487e9
MH
179 goto error;
180
c31ffb3f
NK
181 INIT_LIST_HEAD(&tk->list);
182 INIT_LIST_HEAD(&tk->tp.files);
183 return tk;
413d37d1 184error:
c31ffb3f
NK
185 kfree(tk->tp.call.name);
186 kfree(tk->symbol);
a7636d9e 187 free_percpu(tk->nhit);
c31ffb3f 188 kfree(tk);
6f3cf440 189 return ERR_PTR(ret);
413d37d1
MH
190}
191
c31ffb3f 192static void free_trace_kprobe(struct trace_kprobe *tk)
413d37d1
MH
193{
194 int i;
195
c31ffb3f
NK
196 for (i = 0; i < tk->tp.nr_args; i++)
197 traceprobe_free_probe_arg(&tk->tp.args[i]);
413d37d1 198
c31ffb3f
NK
199 kfree(tk->tp.call.class->system);
200 kfree(tk->tp.call.name);
201 kfree(tk->symbol);
a7636d9e 202 free_percpu(tk->nhit);
c31ffb3f 203 kfree(tk);
413d37d1
MH
204}
205
c31ffb3f
NK
206static struct trace_kprobe *find_trace_kprobe(const char *event,
207 const char *group)
413d37d1 208{
c31ffb3f 209 struct trace_kprobe *tk;
413d37d1 210
c31ffb3f 211 list_for_each_entry(tk, &probe_list, list)
687fcc4a 212 if (strcmp(trace_event_name(&tk->tp.call), event) == 0 &&
c31ffb3f
NK
213 strcmp(tk->tp.call.class->system, group) == 0)
214 return tk;
413d37d1
MH
215 return NULL;
216}
217
87107a25
SRV
218static inline int __enable_trace_kprobe(struct trace_kprobe *tk)
219{
220 int ret = 0;
221
222 if (trace_probe_is_registered(&tk->tp) && !trace_kprobe_has_gone(tk)) {
223 if (trace_kprobe_is_return(tk))
224 ret = enable_kretprobe(&tk->rp);
225 else
226 ret = enable_kprobe(&tk->rp.kp);
227 }
228
229 return ret;
230}
231
41a7dd42
MH
232/*
233 * Enable trace_probe
234 * if the file is NULL, enable "perf" handler, or enable "trace" handler.
235 */
236static int
7f1d2f82 237enable_trace_kprobe(struct trace_kprobe *tk, struct trace_event_file *file)
1538f888 238{
87107a25 239 struct event_file_link *link;
1538f888
MH
240 int ret = 0;
241
41a7dd42 242 if (file) {
b04d52e3
ON
243 link = kmalloc(sizeof(*link), GFP_KERNEL);
244 if (!link) {
41a7dd42 245 ret = -ENOMEM;
3fe3d619 246 goto out;
41a7dd42 247 }
41a7dd42 248
b04d52e3 249 link->file = file;
c31ffb3f 250 list_add_tail_rcu(&link->list, &tk->tp.files);
41a7dd42 251
c31ffb3f 252 tk->tp.flags |= TP_FLAG_TRACE;
87107a25
SRV
253 ret = __enable_trace_kprobe(tk);
254 if (ret) {
255 list_del_rcu(&link->list);
57ea2a34
AS
256 kfree(link);
257 tk->tp.flags &= ~TP_FLAG_TRACE;
57ea2a34 258 }
87107a25
SRV
259
260 } else {
261 tk->tp.flags |= TP_FLAG_PROFILE;
262 ret = __enable_trace_kprobe(tk);
263 if (ret)
264 tk->tp.flags &= ~TP_FLAG_PROFILE;
57ea2a34 265 }
3fe3d619 266 out:
1538f888
MH
267 return ret;
268}
269
41a7dd42
MH
270/*
271 * Disable trace_probe
272 * if the file is NULL, disable "perf" handler, or disable "trace" handler.
273 */
274static int
7f1d2f82 275disable_trace_kprobe(struct trace_kprobe *tk, struct trace_event_file *file)
1538f888 276{
a232e270
MH
277 struct event_file_link *link = NULL;
278 int wait = 0;
41a7dd42
MH
279 int ret = 0;
280
41a7dd42 281 if (file) {
c31ffb3f 282 link = find_event_file_link(&tk->tp, file);
b04d52e3 283 if (!link) {
41a7dd42 284 ret = -EINVAL;
3fe3d619 285 goto out;
41a7dd42
MH
286 }
287
b04d52e3 288 list_del_rcu(&link->list);
a232e270 289 wait = 1;
c31ffb3f 290 if (!list_empty(&tk->tp.files))
b04d52e3 291 goto out;
41a7dd42 292
c31ffb3f 293 tk->tp.flags &= ~TP_FLAG_TRACE;
41a7dd42 294 } else
c31ffb3f 295 tk->tp.flags &= ~TP_FLAG_PROFILE;
41a7dd42 296
c31ffb3f
NK
297 if (!trace_probe_is_enabled(&tk->tp) && trace_probe_is_registered(&tk->tp)) {
298 if (trace_kprobe_is_return(tk))
299 disable_kretprobe(&tk->rp);
1538f888 300 else
c31ffb3f 301 disable_kprobe(&tk->rp.kp);
a232e270 302 wait = 1;
1538f888 303 }
e12f03d7
SL
304
305 /*
306 * if tk is not added to any list, it must be a local trace_kprobe
307 * created with perf_event_open. We don't need to wait for these
308 * trace_kprobes
309 */
310 if (list_empty(&tk->list))
311 wait = 0;
3fe3d619 312 out:
a232e270
MH
313 if (wait) {
314 /*
315 * Synchronize with kprobe_trace_func/kretprobe_trace_func
316 * to ensure disabled (all running handlers are finished).
317 * This is not only for kfree(), but also the caller,
318 * trace_remove_event_call() supposes it for releasing
319 * event_call related objects, which will be accessed in
320 * the kprobe_trace_func/kretprobe_trace_func.
321 */
322 synchronize_sched();
323 kfree(link); /* Ignored if link == NULL */
324 }
325
41a7dd42 326 return ret;
1538f888
MH
327}
328
45408c4f
MH
329#if defined(CONFIG_KPROBES_ON_FTRACE) && \
330 !defined(CONFIG_KPROBE_EVENTS_ON_NOTRACE)
331static bool within_notrace_func(struct trace_kprobe *tk)
332{
333 unsigned long offset, size, addr;
334
335 addr = trace_kprobe_address(tk);
6bc6c77c
MH
336 if (!addr || !kallsyms_lookup_size_offset(addr, &size, &offset))
337 return false;
45408c4f 338
9161a864
MH
339 /* Get the entry address of the target function */
340 addr -= offset;
341
342 /*
343 * Since ftrace_location_range() does inclusive range check, we need
344 * to subtract 1 byte from the end address.
345 */
346 return !ftrace_location_range(addr, addr + size - 1);
45408c4f
MH
347}
348#else
349#define within_notrace_func(tk) (false)
350#endif
351
61424318 352/* Internal register function - just handle k*probes and flags */
c31ffb3f 353static int __register_trace_kprobe(struct trace_kprobe *tk)
413d37d1 354{
53305928 355 int ret;
61424318 356
c31ffb3f 357 if (trace_probe_is_registered(&tk->tp))
61424318
MH
358 return -EINVAL;
359
45408c4f
MH
360 if (within_notrace_func(tk)) {
361 pr_warn("Could not probe notrace function %s\n",
362 trace_kprobe_symbol(tk));
363 return -EINVAL;
364 }
365
61424318 366 /* Set/clear disabled flag according to tp->flag */
c31ffb3f
NK
367 if (trace_probe_is_enabled(&tk->tp))
368 tk->rp.kp.flags &= ~KPROBE_FLAG_DISABLED;
61424318 369 else
c31ffb3f 370 tk->rp.kp.flags |= KPROBE_FLAG_DISABLED;
61424318 371
c31ffb3f
NK
372 if (trace_kprobe_is_return(tk))
373 ret = register_kretprobe(&tk->rp);
413d37d1 374 else
c31ffb3f 375 ret = register_kprobe(&tk->rp.kp);
61424318
MH
376
377 if (ret == 0)
c31ffb3f 378 tk->tp.flags |= TP_FLAG_REGISTERED;
61424318 379 else {
c31ffb3f 380 if (ret == -ENOENT && trace_kprobe_is_on_module(tk)) {
a395d6a7 381 pr_warn("This probe might be able to register after target module is loaded. Continue.\n");
61424318
MH
382 ret = 0;
383 } else if (ret == -EILSEQ) {
a395d6a7
JP
384 pr_warn("Probing address(0x%p) is not an instruction boundary.\n",
385 tk->rp.kp.addr);
61424318
MH
386 ret = -EINVAL;
387 }
388 }
389
390 return ret;
391}
392
393/* Internal unregister function - just handle k*probes and flags */
c31ffb3f 394static void __unregister_trace_kprobe(struct trace_kprobe *tk)
61424318 395{
c31ffb3f
NK
396 if (trace_probe_is_registered(&tk->tp)) {
397 if (trace_kprobe_is_return(tk))
398 unregister_kretprobe(&tk->rp);
61424318 399 else
c31ffb3f
NK
400 unregister_kprobe(&tk->rp.kp);
401 tk->tp.flags &= ~TP_FLAG_REGISTERED;
61424318 402 /* Cleanup kprobe for reuse */
c31ffb3f
NK
403 if (tk->rp.kp.symbol_name)
404 tk->rp.kp.addr = NULL;
61424318
MH
405 }
406}
407
408/* Unregister a trace_probe and probe_event: call with locking probe_lock */
c31ffb3f 409static int unregister_trace_kprobe(struct trace_kprobe *tk)
61424318 410{
02ca1521 411 /* Enabled event can not be unregistered */
c31ffb3f 412 if (trace_probe_is_enabled(&tk->tp))
02ca1521
MH
413 return -EBUSY;
414
40c32592 415 /* Will fail if probe is being used by ftrace or perf */
c31ffb3f 416 if (unregister_kprobe_event(tk))
40c32592
SRRH
417 return -EBUSY;
418
c31ffb3f
NK
419 __unregister_trace_kprobe(tk);
420 list_del(&tk->list);
02ca1521
MH
421
422 return 0;
413d37d1
MH
423}
424
425/* Register a trace_probe and probe_event */
c31ffb3f 426static int register_trace_kprobe(struct trace_kprobe *tk)
413d37d1 427{
c31ffb3f 428 struct trace_kprobe *old_tk;
413d37d1
MH
429 int ret;
430
431 mutex_lock(&probe_lock);
432
61424318 433 /* Delete old (same name) event if exist */
687fcc4a 434 old_tk = find_trace_kprobe(trace_event_name(&tk->tp.call),
de7b2973 435 tk->tp.call.class->system);
c31ffb3f
NK
436 if (old_tk) {
437 ret = unregister_trace_kprobe(old_tk);
02ca1521
MH
438 if (ret < 0)
439 goto end;
c31ffb3f 440 free_trace_kprobe(old_tk);
2d5e067e 441 }
61424318
MH
442
443 /* Register new event */
c31ffb3f 444 ret = register_kprobe_event(tk);
2d5e067e 445 if (ret) {
a395d6a7 446 pr_warn("Failed to register probe event(%d)\n", ret);
2d5e067e
MH
447 goto end;
448 }
449
61424318 450 /* Register k*probe */
c31ffb3f 451 ret = __register_trace_kprobe(tk);
61424318 452 if (ret < 0)
c31ffb3f 453 unregister_kprobe_event(tk);
61424318 454 else
c31ffb3f 455 list_add_tail(&tk->list, &probe_list);
61424318 456
413d37d1
MH
457end:
458 mutex_unlock(&probe_lock);
459 return ret;
460}
461
61424318 462/* Module notifier call back, checking event on the module */
c31ffb3f 463static int trace_kprobe_module_callback(struct notifier_block *nb,
61424318
MH
464 unsigned long val, void *data)
465{
466 struct module *mod = data;
c31ffb3f 467 struct trace_kprobe *tk;
61424318
MH
468 int ret;
469
470 if (val != MODULE_STATE_COMING)
471 return NOTIFY_DONE;
472
473 /* Update probes on coming module */
474 mutex_lock(&probe_lock);
c31ffb3f
NK
475 list_for_each_entry(tk, &probe_list, list) {
476 if (trace_kprobe_within_module(tk, mod)) {
02ca1521 477 /* Don't need to check busy - this should have gone. */
c31ffb3f
NK
478 __unregister_trace_kprobe(tk);
479 ret = __register_trace_kprobe(tk);
61424318 480 if (ret)
a395d6a7
JP
481 pr_warn("Failed to re-register probe %s on %s: %d\n",
482 trace_event_name(&tk->tp.call),
483 mod->name, ret);
61424318
MH
484 }
485 }
486 mutex_unlock(&probe_lock);
487
488 return NOTIFY_DONE;
489}
490
c31ffb3f
NK
491static struct notifier_block trace_kprobe_module_nb = {
492 .notifier_call = trace_kprobe_module_callback,
61424318
MH
493 .priority = 1 /* Invoked after kprobe module callback */
494};
495
fca18a47
NR
496/* Convert certain expected symbols into '_' when generating event names */
497static inline void sanitize_event_name(char *name)
498{
499 while (*name++ != '\0')
500 if (*name == ':' || *name == '.')
501 *name = '_';
502}
503
c31ffb3f 504static int create_trace_kprobe(int argc, char **argv)
413d37d1
MH
505{
506 /*
507 * Argument syntax:
696ced4f
AC
508 * - Add kprobe:
509 * p[:[GRP/]EVENT] [MOD:]KSYM[+OFFS]|KADDR [FETCHARGS]
510 * - Add kretprobe:
511 * r[MAXACTIVE][:[GRP/]EVENT] [MOD:]KSYM[+0] [FETCHARGS]
413d37d1 512 * Fetch args:
2e06ff63
MH
513 * $retval : fetch return value
514 * $stack : fetch stack address
515 * $stackN : fetch Nth of stack (N:0-)
35abb67d 516 * $comm : fetch current task comm
413d37d1
MH
517 * @ADDR : fetch memory at ADDR (ADDR should be in kernel)
518 * @SYM[+|-offs] : fetch memory at SYM +|- offs (SYM is a data symbol)
519 * %REG : fetch register REG
93ccae7a 520 * Dereferencing memory fetch:
413d37d1 521 * +|-offs(ARG) : fetch memory at ARG +|- offs address.
eca0d916
MH
522 * Alias name of args:
523 * NAME=FETCHARG : set NAME as alias of FETCHARG.
93ccae7a
MH
524 * Type of args:
525 * FETCHARG:TYPE : use TYPE instead of unsigned long.
413d37d1 526 */
c31ffb3f 527 struct trace_kprobe *tk;
413d37d1 528 int i, ret = 0;
3a6b7666 529 bool is_return = false, is_delete = false;
93ccae7a 530 char *symbol = NULL, *event = NULL, *group = NULL;
696ced4f 531 int maxactive = 0;
da34634f 532 char *arg;
c5d343b6 533 long offset = 0;
413d37d1 534 void *addr = NULL;
4a846b44 535 char buf[MAX_EVENT_NAME_LEN];
413d37d1 536
a7c312be 537 /* argc must be >= 1 */
413d37d1 538 if (argv[0][0] == 'p')
3a6b7666 539 is_return = false;
413d37d1 540 else if (argv[0][0] == 'r')
3a6b7666 541 is_return = true;
a7c312be 542 else if (argv[0][0] == '-')
3a6b7666 543 is_delete = true;
e63cc239 544 else {
a7c312be
MH
545 pr_info("Probe definition must be started with 'p', 'r' or"
546 " '-'.\n");
413d37d1 547 return -EINVAL;
e63cc239 548 }
413d37d1 549
696ced4f
AC
550 event = strchr(&argv[0][1], ':');
551 if (event) {
552 event[0] = '\0';
553 event++;
554 }
555 if (is_return && isdigit(argv[0][1])) {
556 ret = kstrtouint(&argv[0][1], 0, &maxactive);
557 if (ret) {
558 pr_info("Failed to parse maxactive.\n");
559 return ret;
560 }
561 /* kretprobes instances are iterated over via a list. The
562 * maximum should stay reasonable.
563 */
564 if (maxactive > KRETPROBE_MAXACTIVE_MAX) {
565 pr_info("Maxactive is too big (%d > %d).\n",
566 maxactive, KRETPROBE_MAXACTIVE_MAX);
567 return -E2BIG;
568 }
569 }
570
571 if (event) {
d6b183ed
SRV
572 char *slash;
573
574 slash = strchr(event, '/');
575 if (slash) {
f52487e9 576 group = event;
d6b183ed
SRV
577 event = slash + 1;
578 slash[0] = '\0';
f52487e9 579 if (strlen(group) == 0) {
a5efd925 580 pr_info("Group name is not specified\n");
f52487e9
MH
581 return -EINVAL;
582 }
583 }
413d37d1 584 if (strlen(event) == 0) {
a5efd925 585 pr_info("Event name is not specified\n");
413d37d1
MH
586 return -EINVAL;
587 }
588 }
a7c312be
MH
589 if (!group)
590 group = KPROBE_EVENT_SYSTEM;
413d37d1 591
a7c312be
MH
592 if (is_delete) {
593 if (!event) {
594 pr_info("Delete command needs an event name.\n");
595 return -EINVAL;
596 }
9da79ab8 597 mutex_lock(&probe_lock);
c31ffb3f
NK
598 tk = find_trace_kprobe(event, group);
599 if (!tk) {
9da79ab8 600 mutex_unlock(&probe_lock);
a7c312be
MH
601 pr_info("Event %s/%s doesn't exist.\n", group, event);
602 return -ENOENT;
603 }
604 /* delete an event */
c31ffb3f 605 ret = unregister_trace_kprobe(tk);
02ca1521 606 if (ret == 0)
c31ffb3f 607 free_trace_kprobe(tk);
9da79ab8 608 mutex_unlock(&probe_lock);
02ca1521 609 return ret;
a7c312be
MH
610 }
611
612 if (argc < 2) {
613 pr_info("Probe point is not specified.\n");
614 return -EINVAL;
615 }
9e52b325
SD
616
617 /* try to parse an address. if that fails, try to read the
618 * input as a symbol. */
619 if (kstrtoul(argv[1], 0, (unsigned long *)&addr)) {
413d37d1
MH
620 /* a symbol specified */
621 symbol = argv[1];
622 /* TODO: support .init module functions */
8ab83f56 623 ret = traceprobe_split_symbol_offset(symbol, &offset);
c5d343b6 624 if (ret || offset < 0 || offset > UINT_MAX) {
9e52b325 625 pr_info("Failed to parse either an address or a symbol.\n");
413d37d1 626 return ret;
e63cc239 627 }
d0e02579 628 if (offset && is_return &&
659b957f 629 !kprobe_on_func_entry(NULL, symbol, offset)) {
d0e02579 630 pr_info("Given offset is not valid for return probe.\n");
413d37d1 631 return -EINVAL;
e63cc239 632 }
413d37d1 633 }
a82378d8 634 argc -= 2; argv += 2;
413d37d1
MH
635
636 /* setup a probe */
4263565d
MH
637 if (!event) {
638 /* Make a new event name */
4263565d 639 if (symbol)
6f3cf440 640 snprintf(buf, MAX_EVENT_NAME_LEN, "%c_%s_%ld",
4263565d
MH
641 is_return ? 'r' : 'p', symbol, offset);
642 else
6f3cf440 643 snprintf(buf, MAX_EVENT_NAME_LEN, "%c_0x%p",
4263565d 644 is_return ? 'r' : 'p', addr);
fca18a47 645 sanitize_event_name(buf);
4a846b44
MH
646 event = buf;
647 }
696ced4f
AC
648 tk = alloc_trace_kprobe(group, event, addr, symbol, offset, maxactive,
649 argc, is_return);
c31ffb3f 650 if (IS_ERR(tk)) {
e63cc239 651 pr_info("Failed to allocate trace_probe.(%d)\n",
c31ffb3f
NK
652 (int)PTR_ERR(tk));
653 return PTR_ERR(tk);
e63cc239 654 }
413d37d1 655
413d37d1 656 /* parse arguments */
a82378d8
MH
657 ret = 0;
658 for (i = 0; i < argc && i < MAX_TRACE_ARGS; i++) {
c31ffb3f
NK
659 struct probe_arg *parg = &tk->tp.args[i];
660
61a52736 661 /* Increment count for freeing args in error case */
c31ffb3f 662 tk->tp.nr_args++;
61a52736 663
eca0d916
MH
664 /* Parse argument name */
665 arg = strchr(argv[i], '=');
aba91595 666 if (arg) {
eca0d916 667 *arg++ = '\0';
c31ffb3f 668 parg->name = kstrdup(argv[i], GFP_KERNEL);
aba91595 669 } else {
eca0d916 670 arg = argv[i];
aba91595
MH
671 /* If argument name is omitted, set "argN" */
672 snprintf(buf, MAX_EVENT_NAME_LEN, "arg%d", i + 1);
c31ffb3f 673 parg->name = kstrdup(buf, GFP_KERNEL);
aba91595 674 }
a703d946 675
c31ffb3f 676 if (!parg->name) {
aba91595 677 pr_info("Failed to allocate argument[%d] name.\n", i);
ba8665d7 678 ret = -ENOMEM;
413d37d1
MH
679 goto error;
680 }
da34634f 681
c31ffb3f 682 if (!is_good_name(parg->name)) {
da34634f 683 pr_info("Invalid argument[%d] name: %s\n",
c31ffb3f 684 i, parg->name);
da34634f
MH
685 ret = -EINVAL;
686 goto error;
687 }
93ccae7a 688
c31ffb3f
NK
689 if (traceprobe_conflict_field_name(parg->name,
690 tk->tp.args, i)) {
aba91595 691 pr_info("Argument[%d] name '%s' conflicts with "
93ccae7a
MH
692 "another field.\n", i, argv[i]);
693 ret = -EINVAL;
694 goto error;
695 }
ba8665d7
MH
696
697 /* Parse fetch argument */
c31ffb3f 698 ret = traceprobe_parse_probe_arg(arg, &tk->tp.size, parg,
f451bc89 699 is_return, true);
e63cc239 700 if (ret) {
aba91595 701 pr_info("Parse error at argument[%d]. (%d)\n", i, ret);
413d37d1 702 goto error;
e63cc239 703 }
413d37d1 704 }
413d37d1 705
c31ffb3f 706 ret = register_trace_kprobe(tk);
413d37d1
MH
707 if (ret)
708 goto error;
709 return 0;
710
711error:
c31ffb3f 712 free_trace_kprobe(tk);
413d37d1
MH
713 return ret;
714}
715
c31ffb3f 716static int release_all_trace_kprobes(void)
413d37d1 717{
c31ffb3f 718 struct trace_kprobe *tk;
02ca1521 719 int ret = 0;
413d37d1
MH
720
721 mutex_lock(&probe_lock);
02ca1521 722 /* Ensure no probe is in use. */
c31ffb3f
NK
723 list_for_each_entry(tk, &probe_list, list)
724 if (trace_probe_is_enabled(&tk->tp)) {
02ca1521
MH
725 ret = -EBUSY;
726 goto end;
727 }
413d37d1
MH
728 /* TODO: Use batch unregistration */
729 while (!list_empty(&probe_list)) {
c31ffb3f
NK
730 tk = list_entry(probe_list.next, struct trace_kprobe, list);
731 ret = unregister_trace_kprobe(tk);
40c32592
SRRH
732 if (ret)
733 goto end;
c31ffb3f 734 free_trace_kprobe(tk);
413d37d1 735 }
02ca1521
MH
736
737end:
413d37d1 738 mutex_unlock(&probe_lock);
02ca1521
MH
739
740 return ret;
413d37d1
MH
741}
742
413d37d1
MH
743/* Probes listing interfaces */
744static void *probes_seq_start(struct seq_file *m, loff_t *pos)
745{
746 mutex_lock(&probe_lock);
747 return seq_list_start(&probe_list, *pos);
748}
749
750static void *probes_seq_next(struct seq_file *m, void *v, loff_t *pos)
751{
752 return seq_list_next(v, &probe_list, pos);
753}
754
755static void probes_seq_stop(struct seq_file *m, void *v)
756{
757 mutex_unlock(&probe_lock);
758}
759
760static int probes_seq_show(struct seq_file *m, void *v)
761{
c31ffb3f 762 struct trace_kprobe *tk = v;
93ccae7a 763 int i;
413d37d1 764
fa6f0cc7 765 seq_putc(m, trace_kprobe_is_return(tk) ? 'r' : 'p');
de7b2973 766 seq_printf(m, ":%s/%s", tk->tp.call.class->system,
687fcc4a 767 trace_event_name(&tk->tp.call));
413d37d1 768
c31ffb3f
NK
769 if (!tk->symbol)
770 seq_printf(m, " 0x%p", tk->rp.kp.addr);
771 else if (tk->rp.kp.offset)
772 seq_printf(m, " %s+%u", trace_kprobe_symbol(tk),
773 tk->rp.kp.offset);
413d37d1 774 else
c31ffb3f 775 seq_printf(m, " %s", trace_kprobe_symbol(tk));
413d37d1 776
c31ffb3f
NK
777 for (i = 0; i < tk->tp.nr_args; i++)
778 seq_printf(m, " %s=%s", tk->tp.args[i].name, tk->tp.args[i].comm);
fa6f0cc7 779 seq_putc(m, '\n');
93ccae7a 780
413d37d1
MH
781 return 0;
782}
783
784static const struct seq_operations probes_seq_op = {
785 .start = probes_seq_start,
786 .next = probes_seq_next,
787 .stop = probes_seq_stop,
788 .show = probes_seq_show
789};
790
791static int probes_open(struct inode *inode, struct file *file)
792{
02ca1521
MH
793 int ret;
794
795 if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) {
c31ffb3f 796 ret = release_all_trace_kprobes();
02ca1521
MH
797 if (ret < 0)
798 return ret;
799 }
413d37d1
MH
800
801 return seq_open(file, &probes_seq_op);
802}
803
413d37d1
MH
804static ssize_t probes_write(struct file *file, const char __user *buffer,
805 size_t count, loff_t *ppos)
806{
7e465baa
TZ
807 return trace_parse_run_command(file, buffer, count, ppos,
808 create_trace_kprobe);
413d37d1
MH
809}
810
811static const struct file_operations kprobe_events_ops = {
812 .owner = THIS_MODULE,
813 .open = probes_open,
814 .read = seq_read,
815 .llseek = seq_lseek,
816 .release = seq_release,
817 .write = probes_write,
818};
819
cd7e7bd5
MH
820/* Probes profiling interfaces */
821static int probes_profile_seq_show(struct seq_file *m, void *v)
822{
c31ffb3f 823 struct trace_kprobe *tk = v;
cd7e7bd5 824
de7b2973 825 seq_printf(m, " %-44s %15lu %15lu\n",
f18f97ac
MN
826 trace_event_name(&tk->tp.call),
827 trace_kprobe_nhit(tk),
c31ffb3f 828 tk->rp.kp.nmissed);
cd7e7bd5
MH
829
830 return 0;
831}
832
833static const struct seq_operations profile_seq_op = {
834 .start = probes_seq_start,
835 .next = probes_seq_next,
836 .stop = probes_seq_stop,
837 .show = probes_profile_seq_show
838};
839
840static int profile_open(struct inode *inode, struct file *file)
841{
842 return seq_open(file, &profile_seq_op);
843}
844
845static const struct file_operations kprobe_profile_ops = {
846 .owner = THIS_MODULE,
847 .open = profile_open,
848 .read = seq_read,
849 .llseek = seq_lseek,
850 .release = seq_release,
851};
852
53305928
MH
853/* Kprobe specific fetch functions */
854
855/* Return the length of string -- including null terminal byte */
9178412d
MH
856static nokprobe_inline int
857fetch_store_strlen(unsigned long addr)
53305928
MH
858{
859 mm_segment_t old_fs;
860 int ret, len = 0;
861 u8 c;
862
863 old_fs = get_fs();
864 set_fs(KERNEL_DS);
865 pagefault_disable();
866
867 do {
868 ret = __copy_from_user_inatomic(&c, (u8 *)addr + len, 1);
869 len++;
870 } while (c && ret == 0 && len < MAX_STRING_SIZE);
871
872 pagefault_enable();
873 set_fs(old_fs);
874
9178412d 875 return (ret < 0) ? ret : len;
53305928
MH
876}
877
878/*
879 * Fetch a null-terminated string. Caller MUST set *(u32 *)buf with max
880 * length and relative data location.
881 */
9178412d
MH
882static nokprobe_inline int
883fetch_store_string(unsigned long addr, void *dest, void *base)
53305928 884{
9178412d
MH
885 int maxlen = get_loc_len(*(u32 *)dest);
886 u8 *dst = get_loc_data(dest, base);
53305928
MH
887 long ret;
888
9178412d
MH
889 if (unlikely(!maxlen))
890 return -ENOMEM;
53305928
MH
891 /*
892 * Try to get string again, since the string can be changed while
893 * probing.
894 */
895 ret = strncpy_from_unsafe(dst, (void *)addr, maxlen);
896
9178412d
MH
897 if (ret >= 0)
898 *(u32 *)dest = make_data_loc(ret, (void *)dst - base);
899 return ret;
53305928
MH
900}
901
9b960a38
MH
902static nokprobe_inline int
903probe_mem_read(void *dest, void *src, size_t size)
904{
905 return probe_kernel_read(dest, src, size);
906}
907
53305928
MH
908/* Note that we don't verify it, since the code does not come from user space */
909static int
910process_fetch_insn(struct fetch_insn *code, struct pt_regs *regs, void *dest,
9178412d 911 void *base)
53305928
MH
912{
913 unsigned long val;
53305928
MH
914
915 /* 1st stage: get value from context */
916 switch (code->op) {
917 case FETCH_OP_REG:
918 val = regs_get_register(regs, code->param);
919 break;
920 case FETCH_OP_STACK:
921 val = regs_get_kernel_stack_nth(regs, code->param);
922 break;
923 case FETCH_OP_STACKP:
924 val = kernel_stack_pointer(regs);
925 break;
926 case FETCH_OP_RETVAL:
927 val = regs_return_value(regs);
928 break;
929 case FETCH_OP_IMM:
930 val = code->immediate;
931 break;
932 case FETCH_OP_COMM:
933 val = (unsigned long)current->comm;
934 break;
935 default:
936 return -EILSEQ;
937 }
938 code++;
939
9b960a38 940 return process_fetch_insn_bottom(code, val, dest, base);
53305928
MH
941}
942NOKPROBE_SYMBOL(process_fetch_insn)
943
413d37d1 944/* Kprobe handler */
3da0f180 945static nokprobe_inline void
c31ffb3f 946__kprobe_trace_func(struct trace_kprobe *tk, struct pt_regs *regs,
7f1d2f82 947 struct trace_event_file *trace_file)
413d37d1 948{
93ccae7a 949 struct kprobe_trace_entry_head *entry;
413d37d1 950 struct ring_buffer_event *event;
8f8ffe24 951 struct ring_buffer *buffer;
e09c8614 952 int size, dsize, pc;
413d37d1 953 unsigned long irq_flags;
2425bcb9 954 struct trace_event_call *call = &tk->tp.call;
413d37d1 955
7f1d2f82 956 WARN_ON(call != trace_file->event_call);
41a7dd42 957
09a5059a 958 if (trace_trigger_soft_disabled(trace_file))
13a1e4ae 959 return;
b8820084 960
413d37d1
MH
961 local_save_flags(irq_flags);
962 pc = preempt_count();
963
c31ffb3f
NK
964 dsize = __get_data_size(&tk->tp, regs);
965 size = sizeof(*entry) + tk->tp.size + dsize;
413d37d1 966
7f1d2f82 967 event = trace_event_buffer_lock_reserve(&buffer, trace_file,
41a7dd42
MH
968 call->event.type,
969 size, irq_flags, pc);
413d37d1 970 if (!event)
1e12a4a7 971 return;
413d37d1
MH
972
973 entry = ring_buffer_event_data(event);
c31ffb3f 974 entry->ip = (unsigned long)tk->rp.kp.addr;
9178412d 975 store_trace_args(&entry[1], &tk->tp, regs, sizeof(*entry), dsize);
413d37d1 976
7f1d2f82 977 event_trigger_unlock_commit_regs(trace_file, buffer, event,
13a1e4ae 978 entry, irq_flags, pc, regs);
413d37d1
MH
979}
980
3da0f180 981static void
c31ffb3f 982kprobe_trace_func(struct trace_kprobe *tk, struct pt_regs *regs)
41a7dd42 983{
b04d52e3 984 struct event_file_link *link;
41a7dd42 985
c31ffb3f
NK
986 list_for_each_entry_rcu(link, &tk->tp.files, list)
987 __kprobe_trace_func(tk, regs, link->file);
41a7dd42 988}
3da0f180 989NOKPROBE_SYMBOL(kprobe_trace_func);
41a7dd42 990
413d37d1 991/* Kretprobe handler */
3da0f180 992static nokprobe_inline void
c31ffb3f 993__kretprobe_trace_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
41a7dd42 994 struct pt_regs *regs,
7f1d2f82 995 struct trace_event_file *trace_file)
413d37d1 996{
93ccae7a 997 struct kretprobe_trace_entry_head *entry;
413d37d1 998 struct ring_buffer_event *event;
8f8ffe24 999 struct ring_buffer *buffer;
e09c8614 1000 int size, pc, dsize;
413d37d1 1001 unsigned long irq_flags;
2425bcb9 1002 struct trace_event_call *call = &tk->tp.call;
413d37d1 1003
7f1d2f82 1004 WARN_ON(call != trace_file->event_call);
41a7dd42 1005
09a5059a 1006 if (trace_trigger_soft_disabled(trace_file))
13a1e4ae 1007 return;
b8820084 1008
413d37d1
MH
1009 local_save_flags(irq_flags);
1010 pc = preempt_count();
1011
c31ffb3f
NK
1012 dsize = __get_data_size(&tk->tp, regs);
1013 size = sizeof(*entry) + tk->tp.size + dsize;
413d37d1 1014
7f1d2f82 1015 event = trace_event_buffer_lock_reserve(&buffer, trace_file,
41a7dd42
MH
1016 call->event.type,
1017 size, irq_flags, pc);
413d37d1 1018 if (!event)
1e12a4a7 1019 return;
413d37d1
MH
1020
1021 entry = ring_buffer_event_data(event);
c31ffb3f 1022 entry->func = (unsigned long)tk->rp.kp.addr;
413d37d1 1023 entry->ret_ip = (unsigned long)ri->ret_addr;
9178412d 1024 store_trace_args(&entry[1], &tk->tp, regs, sizeof(*entry), dsize);
413d37d1 1025
7f1d2f82 1026 event_trigger_unlock_commit_regs(trace_file, buffer, event,
13a1e4ae 1027 entry, irq_flags, pc, regs);
413d37d1
MH
1028}
1029
3da0f180 1030static void
c31ffb3f 1031kretprobe_trace_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
41a7dd42
MH
1032 struct pt_regs *regs)
1033{
b04d52e3 1034 struct event_file_link *link;
41a7dd42 1035
c31ffb3f
NK
1036 list_for_each_entry_rcu(link, &tk->tp.files, list)
1037 __kretprobe_trace_func(tk, ri, regs, link->file);
41a7dd42 1038}
3da0f180 1039NOKPROBE_SYMBOL(kretprobe_trace_func);
41a7dd42 1040
413d37d1 1041/* Event entry printers */
b62fdd97 1042static enum print_line_t
a9a57763
SR
1043print_kprobe_event(struct trace_iterator *iter, int flags,
1044 struct trace_event *event)
413d37d1 1045{
93ccae7a 1046 struct kprobe_trace_entry_head *field;
413d37d1 1047 struct trace_seq *s = &iter->seq;
eca0d916 1048 struct trace_probe *tp;
413d37d1 1049
93ccae7a 1050 field = (struct kprobe_trace_entry_head *)iter->ent;
80decc70 1051 tp = container_of(event, struct trace_probe, call.event);
413d37d1 1052
687fcc4a 1053 trace_seq_printf(s, "%s: (", trace_event_name(&tp->call));
6e9f23d1 1054
413d37d1 1055 if (!seq_print_ip_sym(s, field->ip, flags | TRACE_ITER_SYM_OFFSET))
85224da0 1056 goto out;
413d37d1 1057
85224da0 1058 trace_seq_putc(s, ')');
413d37d1 1059
56de7630
MH
1060 if (print_probe_args(s, tp->args, tp->nr_args,
1061 (u8 *)&field[1], field) < 0)
1062 goto out;
413d37d1 1063
85224da0
SRRH
1064 trace_seq_putc(s, '\n');
1065 out:
1066 return trace_handle_return(s);
413d37d1
MH
1067}
1068
b62fdd97 1069static enum print_line_t
a9a57763
SR
1070print_kretprobe_event(struct trace_iterator *iter, int flags,
1071 struct trace_event *event)
413d37d1 1072{
93ccae7a 1073 struct kretprobe_trace_entry_head *field;
413d37d1 1074 struct trace_seq *s = &iter->seq;
eca0d916 1075 struct trace_probe *tp;
413d37d1 1076
93ccae7a 1077 field = (struct kretprobe_trace_entry_head *)iter->ent;
80decc70 1078 tp = container_of(event, struct trace_probe, call.event);
413d37d1 1079
687fcc4a 1080 trace_seq_printf(s, "%s: (", trace_event_name(&tp->call));
6e9f23d1 1081
413d37d1 1082 if (!seq_print_ip_sym(s, field->ret_ip, flags | TRACE_ITER_SYM_OFFSET))
85224da0 1083 goto out;
413d37d1 1084
85224da0 1085 trace_seq_puts(s, " <- ");
413d37d1
MH
1086
1087 if (!seq_print_ip_sym(s, field->func, flags & ~TRACE_ITER_SYM_OFFSET))
85224da0 1088 goto out;
413d37d1 1089
85224da0 1090 trace_seq_putc(s, ')');
413d37d1 1091
56de7630
MH
1092 if (print_probe_args(s, tp->args, tp->nr_args,
1093 (u8 *)&field[1], field) < 0)
1094 goto out;
413d37d1 1095
85224da0 1096 trace_seq_putc(s, '\n');
413d37d1 1097
85224da0
SRRH
1098 out:
1099 return trace_handle_return(s);
413d37d1
MH
1100}
1101
413d37d1 1102
2425bcb9 1103static int kprobe_event_define_fields(struct trace_event_call *event_call)
413d37d1 1104{
eeb07b06 1105 int ret;
93ccae7a 1106 struct kprobe_trace_entry_head field;
c31ffb3f 1107 struct trace_kprobe *tk = (struct trace_kprobe *)event_call->data;
413d37d1 1108
a703d946 1109 DEFINE_FIELD(unsigned long, ip, FIELD_STRING_IP, 0);
c31ffb3f 1110
eeb07b06 1111 return traceprobe_define_arg_fields(event_call, sizeof(field), &tk->tp);
413d37d1
MH
1112}
1113
2425bcb9 1114static int kretprobe_event_define_fields(struct trace_event_call *event_call)
413d37d1 1115{
eeb07b06 1116 int ret;
93ccae7a 1117 struct kretprobe_trace_entry_head field;
c31ffb3f 1118 struct trace_kprobe *tk = (struct trace_kprobe *)event_call->data;
413d37d1 1119
a703d946
MH
1120 DEFINE_FIELD(unsigned long, func, FIELD_STRING_FUNC, 0);
1121 DEFINE_FIELD(unsigned long, ret_ip, FIELD_STRING_RETIP, 0);
c31ffb3f 1122
eeb07b06 1123 return traceprobe_define_arg_fields(event_call, sizeof(field), &tk->tp);
413d37d1
MH
1124}
1125
07b139c8 1126#ifdef CONFIG_PERF_EVENTS
e08d1c65
MH
1127
1128/* Kprobe profile handler */
9802d865 1129static int
c31ffb3f 1130kprobe_perf_func(struct trace_kprobe *tk, struct pt_regs *regs)
e08d1c65 1131{
2425bcb9 1132 struct trace_event_call *call = &tk->tp.call;
93ccae7a 1133 struct kprobe_trace_entry_head *entry;
1c024eca 1134 struct hlist_head *head;
e09c8614 1135 int size, __size, dsize;
4ed7c92d 1136 int rctx;
e08d1c65 1137
9802d865 1138 if (bpf_prog_array_valid(call)) {
66665ad2 1139 unsigned long orig_ip = instruction_pointer(regs);
9802d865
JB
1140 int ret;
1141
1142 ret = trace_call_bpf(call, regs);
1143
1144 /*
1145 * We need to check and see if we modified the pc of the
cce188bd
MH
1146 * pt_regs, and if so return 1 so that we don't do the
1147 * single stepping.
9802d865 1148 */
cce188bd 1149 if (orig_ip != instruction_pointer(regs))
9802d865 1150 return 1;
9802d865
JB
1151 if (!ret)
1152 return 0;
1153 }
2541517c 1154
288e984e
ON
1155 head = this_cpu_ptr(call->perf_events);
1156 if (hlist_empty(head))
9802d865 1157 return 0;
288e984e 1158
c31ffb3f
NK
1159 dsize = __get_data_size(&tk->tp, regs);
1160 __size = sizeof(*entry) + tk->tp.size + dsize;
74ebb63e
MH
1161 size = ALIGN(__size + sizeof(u32), sizeof(u64));
1162 size -= sizeof(u32);
ce71b9df 1163
1e1dcd93 1164 entry = perf_trace_buf_alloc(size, NULL, &rctx);
430ad5a6 1165 if (!entry)
9802d865 1166 return 0;
a1a138d0 1167
c31ffb3f 1168 entry->ip = (unsigned long)tk->rp.kp.addr;
e09c8614 1169 memset(&entry[1], 0, dsize);
9178412d 1170 store_trace_args(&entry[1], &tk->tp, regs, sizeof(*entry), dsize);
1e1dcd93 1171 perf_trace_buf_submit(entry, size, rctx, call->event.type, 1, regs,
8fd0fbbe 1172 head, NULL);
9802d865 1173 return 0;
e08d1c65 1174}
3da0f180 1175NOKPROBE_SYMBOL(kprobe_perf_func);
e08d1c65
MH
1176
1177/* Kretprobe profile handler */
3da0f180 1178static void
c31ffb3f 1179kretprobe_perf_func(struct trace_kprobe *tk, struct kretprobe_instance *ri,
2b106aab 1180 struct pt_regs *regs)
e08d1c65 1181{
2425bcb9 1182 struct trace_event_call *call = &tk->tp.call;
93ccae7a 1183 struct kretprobe_trace_entry_head *entry;
1c024eca 1184 struct hlist_head *head;
e09c8614 1185 int size, __size, dsize;
4ed7c92d 1186 int rctx;
e08d1c65 1187
e87c6bc3 1188 if (bpf_prog_array_valid(call) && !trace_call_bpf(call, regs))
2541517c
AS
1189 return;
1190
288e984e
ON
1191 head = this_cpu_ptr(call->perf_events);
1192 if (hlist_empty(head))
1193 return;
1194
c31ffb3f
NK
1195 dsize = __get_data_size(&tk->tp, regs);
1196 __size = sizeof(*entry) + tk->tp.size + dsize;
74ebb63e
MH
1197 size = ALIGN(__size + sizeof(u32), sizeof(u64));
1198 size -= sizeof(u32);
444a2a3b 1199
1e1dcd93 1200 entry = perf_trace_buf_alloc(size, NULL, &rctx);
430ad5a6 1201 if (!entry)
1e12a4a7 1202 return;
e08d1c65 1203
c31ffb3f 1204 entry->func = (unsigned long)tk->rp.kp.addr;
a1a138d0 1205 entry->ret_ip = (unsigned long)ri->ret_addr;
9178412d 1206 store_trace_args(&entry[1], &tk->tp, regs, sizeof(*entry), dsize);
1e1dcd93 1207 perf_trace_buf_submit(entry, size, rctx, call->event.type, 1, regs,
8fd0fbbe 1208 head, NULL);
e08d1c65 1209}
3da0f180 1210NOKPROBE_SYMBOL(kretprobe_perf_func);
41bdc4b4
YS
1211
1212int bpf_get_kprobe_info(const struct perf_event *event, u32 *fd_type,
1213 const char **symbol, u64 *probe_offset,
1214 u64 *probe_addr, bool perf_type_tracepoint)
1215{
1216 const char *pevent = trace_event_name(event->tp_event);
1217 const char *group = event->tp_event->class->system;
1218 struct trace_kprobe *tk;
1219
1220 if (perf_type_tracepoint)
1221 tk = find_trace_kprobe(pevent, group);
1222 else
1223 tk = event->tp_event->data;
1224 if (!tk)
1225 return -EINVAL;
1226
1227 *fd_type = trace_kprobe_is_return(tk) ? BPF_FD_TYPE_KRETPROBE
1228 : BPF_FD_TYPE_KPROBE;
1229 if (tk->symbol) {
1230 *symbol = tk->symbol;
1231 *probe_offset = tk->rp.kp.offset;
1232 *probe_addr = 0;
1233 } else {
1234 *symbol = NULL;
1235 *probe_offset = 0;
1236 *probe_addr = (unsigned long)tk->rp.kp.addr;
1237 }
1238 return 0;
1239}
07b139c8 1240#endif /* CONFIG_PERF_EVENTS */
50d78056 1241
3fe3d619
ON
1242/*
1243 * called by perf_trace_init() or __ftrace_set_clr_event() under event_mutex.
1244 *
1245 * kprobe_trace_self_tests_init() does enable_trace_probe/disable_trace_probe
1246 * lockless, but we can't race with this __init function.
1247 */
2425bcb9 1248static int kprobe_register(struct trace_event_call *event,
fbc1963d 1249 enum trace_reg type, void *data)
2239291a 1250{
c31ffb3f 1251 struct trace_kprobe *tk = (struct trace_kprobe *)event->data;
7f1d2f82 1252 struct trace_event_file *file = data;
1538f888 1253
2239291a
SR
1254 switch (type) {
1255 case TRACE_REG_REGISTER:
c31ffb3f 1256 return enable_trace_kprobe(tk, file);
2239291a 1257 case TRACE_REG_UNREGISTER:
c31ffb3f 1258 return disable_trace_kprobe(tk, file);
2239291a
SR
1259
1260#ifdef CONFIG_PERF_EVENTS
1261 case TRACE_REG_PERF_REGISTER:
c31ffb3f 1262 return enable_trace_kprobe(tk, NULL);
2239291a 1263 case TRACE_REG_PERF_UNREGISTER:
c31ffb3f 1264 return disable_trace_kprobe(tk, NULL);
ceec0b6f
JO
1265 case TRACE_REG_PERF_OPEN:
1266 case TRACE_REG_PERF_CLOSE:
489c75c3
JO
1267 case TRACE_REG_PERF_ADD:
1268 case TRACE_REG_PERF_DEL:
ceec0b6f 1269 return 0;
2239291a
SR
1270#endif
1271 }
1272 return 0;
1273}
50d78056 1274
3da0f180 1275static int kprobe_dispatcher(struct kprobe *kp, struct pt_regs *regs)
50d78056 1276{
c31ffb3f 1277 struct trace_kprobe *tk = container_of(kp, struct trace_kprobe, rp.kp);
9802d865 1278 int ret = 0;
e08d1c65 1279
a7636d9e 1280 raw_cpu_inc(*tk->nhit);
48182bd2 1281
c31ffb3f
NK
1282 if (tk->tp.flags & TP_FLAG_TRACE)
1283 kprobe_trace_func(tk, regs);
07b139c8 1284#ifdef CONFIG_PERF_EVENTS
c31ffb3f 1285 if (tk->tp.flags & TP_FLAG_PROFILE)
9802d865 1286 ret = kprobe_perf_func(tk, regs);
07b139c8 1287#endif
9802d865 1288 return ret;
50d78056 1289}
3da0f180 1290NOKPROBE_SYMBOL(kprobe_dispatcher);
50d78056 1291
3da0f180
MH
1292static int
1293kretprobe_dispatcher(struct kretprobe_instance *ri, struct pt_regs *regs)
50d78056 1294{
c31ffb3f 1295 struct trace_kprobe *tk = container_of(ri->rp, struct trace_kprobe, rp);
50d78056 1296
a7636d9e 1297 raw_cpu_inc(*tk->nhit);
48182bd2 1298
c31ffb3f
NK
1299 if (tk->tp.flags & TP_FLAG_TRACE)
1300 kretprobe_trace_func(tk, ri, regs);
07b139c8 1301#ifdef CONFIG_PERF_EVENTS
c31ffb3f
NK
1302 if (tk->tp.flags & TP_FLAG_PROFILE)
1303 kretprobe_perf_func(tk, ri, regs);
07b139c8 1304#endif
50d78056
MH
1305 return 0; /* We don't tweek kernel, so just return 0 */
1306}
3da0f180 1307NOKPROBE_SYMBOL(kretprobe_dispatcher);
e08d1c65 1308
a9a57763
SR
1309static struct trace_event_functions kretprobe_funcs = {
1310 .trace = print_kretprobe_event
1311};
1312
1313static struct trace_event_functions kprobe_funcs = {
1314 .trace = print_kprobe_event
1315};
1316
e12f03d7
SL
1317static inline void init_trace_event_call(struct trace_kprobe *tk,
1318 struct trace_event_call *call)
413d37d1 1319{
ffb9f995 1320 INIT_LIST_HEAD(&call->class->fields);
c31ffb3f 1321 if (trace_kprobe_is_return(tk)) {
80decc70 1322 call->event.funcs = &kretprobe_funcs;
2e33af02 1323 call->class->define_fields = kretprobe_event_define_fields;
413d37d1 1324 } else {
80decc70 1325 call->event.funcs = &kprobe_funcs;
2e33af02 1326 call->class->define_fields = kprobe_event_define_fields;
413d37d1 1327 }
e12f03d7
SL
1328
1329 call->flags = TRACE_EVENT_FL_KPROBE;
1330 call->class->reg = kprobe_register;
1331 call->data = tk;
1332}
1333
1334static int register_kprobe_event(struct trace_kprobe *tk)
1335{
1336 struct trace_event_call *call = &tk->tp.call;
1337 int ret = 0;
1338
1339 init_trace_event_call(tk, call);
1340
0a46c854 1341 if (traceprobe_set_print_fmt(&tk->tp, trace_kprobe_is_return(tk)) < 0)
a342a028 1342 return -ENOMEM;
9023c930 1343 ret = register_trace_event(&call->event);
32c0edae 1344 if (!ret) {
a342a028 1345 kfree(call->print_fmt);
ff50d991 1346 return -ENODEV;
a342a028 1347 }
413d37d1 1348 ret = trace_add_event_call(call);
ff50d991 1349 if (ret) {
de7b2973 1350 pr_info("Failed to register kprobe event: %s\n",
687fcc4a 1351 trace_event_name(call));
a342a028 1352 kfree(call->print_fmt);
9023c930 1353 unregister_trace_event(&call->event);
ff50d991 1354 }
413d37d1
MH
1355 return ret;
1356}
1357
c31ffb3f 1358static int unregister_kprobe_event(struct trace_kprobe *tk)
413d37d1 1359{
40c32592
SRRH
1360 int ret;
1361
ff50d991 1362 /* tp->event is unregistered in trace_remove_event_call() */
c31ffb3f 1363 ret = trace_remove_event_call(&tk->tp.call);
40c32592 1364 if (!ret)
c31ffb3f 1365 kfree(tk->tp.call.print_fmt);
40c32592 1366 return ret;
413d37d1
MH
1367}
1368
e12f03d7
SL
1369#ifdef CONFIG_PERF_EVENTS
1370/* create a trace_kprobe, but don't add it to global lists */
1371struct trace_event_call *
1372create_local_trace_kprobe(char *func, void *addr, unsigned long offs,
1373 bool is_return)
1374{
1375 struct trace_kprobe *tk;
1376 int ret;
1377 char *event;
1378
1379 /*
1380 * local trace_kprobes are not added to probe_list, so they are never
1381 * searched in find_trace_kprobe(). Therefore, there is no concern of
1382 * duplicated name here.
1383 */
1384 event = func ? func : "DUMMY_EVENT";
1385
1386 tk = alloc_trace_kprobe(KPROBE_EVENT_SYSTEM, event, (void *)addr, func,
1387 offs, 0 /* maxactive */, 0 /* nargs */,
1388 is_return);
1389
1390 if (IS_ERR(tk)) {
1391 pr_info("Failed to allocate trace_probe.(%d)\n",
1392 (int)PTR_ERR(tk));
1393 return ERR_CAST(tk);
1394 }
1395
1396 init_trace_event_call(tk, &tk->tp.call);
1397
0a46c854 1398 if (traceprobe_set_print_fmt(&tk->tp, trace_kprobe_is_return(tk)) < 0) {
e12f03d7
SL
1399 ret = -ENOMEM;
1400 goto error;
1401 }
1402
1403 ret = __register_trace_kprobe(tk);
0fc8c358
JO
1404 if (ret < 0) {
1405 kfree(tk->tp.call.print_fmt);
e12f03d7 1406 goto error;
0fc8c358 1407 }
e12f03d7
SL
1408
1409 return &tk->tp.call;
1410error:
1411 free_trace_kprobe(tk);
1412 return ERR_PTR(ret);
1413}
1414
1415void destroy_local_trace_kprobe(struct trace_event_call *event_call)
1416{
1417 struct trace_kprobe *tk;
1418
1419 tk = container_of(event_call, struct trace_kprobe, tp.call);
1420
1421 if (trace_probe_is_enabled(&tk->tp)) {
1422 WARN_ON(1);
1423 return;
1424 }
1425
1426 __unregister_trace_kprobe(tk);
0fc8c358
JO
1427
1428 kfree(tk->tp.call.print_fmt);
e12f03d7
SL
1429 free_trace_kprobe(tk);
1430}
1431#endif /* CONFIG_PERF_EVENTS */
1432
8434dc93 1433/* Make a tracefs interface for controlling probe points */
413d37d1
MH
1434static __init int init_kprobe_trace(void)
1435{
1436 struct dentry *d_tracer;
1437 struct dentry *entry;
413d37d1 1438
c31ffb3f 1439 if (register_module_notifier(&trace_kprobe_module_nb))
61424318
MH
1440 return -EINVAL;
1441
413d37d1 1442 d_tracer = tracing_init_dentry();
14a5ae40 1443 if (IS_ERR(d_tracer))
413d37d1
MH
1444 return 0;
1445
8434dc93 1446 entry = tracefs_create_file("kprobe_events", 0644, d_tracer,
413d37d1
MH
1447 NULL, &kprobe_events_ops);
1448
cd7e7bd5 1449 /* Event list interface */
413d37d1 1450 if (!entry)
a395d6a7 1451 pr_warn("Could not create tracefs 'kprobe_events' entry\n");
cd7e7bd5
MH
1452
1453 /* Profile interface */
8434dc93 1454 entry = tracefs_create_file("kprobe_profile", 0444, d_tracer,
cd7e7bd5
MH
1455 NULL, &kprobe_profile_ops);
1456
1457 if (!entry)
a395d6a7 1458 pr_warn("Could not create tracefs 'kprobe_profile' entry\n");
413d37d1
MH
1459 return 0;
1460}
1461fs_initcall(init_kprobe_trace);
1462
1463
1464#ifdef CONFIG_FTRACE_STARTUP_TEST
26a346f2 1465static __init struct trace_event_file *
c31ffb3f 1466find_trace_probe_file(struct trace_kprobe *tk, struct trace_array *tr)
41a7dd42 1467{
7f1d2f82 1468 struct trace_event_file *file;
41a7dd42
MH
1469
1470 list_for_each_entry(file, &tr->events, list)
c31ffb3f 1471 if (file->event_call == &tk->tp.call)
41a7dd42
MH
1472 return file;
1473
1474 return NULL;
1475}
1476
3fe3d619 1477/*
c31ffb3f 1478 * Nobody but us can call enable_trace_kprobe/disable_trace_kprobe at this
3fe3d619
ON
1479 * stage, we can do this lockless.
1480 */
413d37d1
MH
1481static __init int kprobe_trace_self_tests_init(void)
1482{
231e36f4 1483 int ret, warn = 0;
413d37d1 1484 int (*target)(int, int, int, int, int, int);
c31ffb3f 1485 struct trace_kprobe *tk;
7f1d2f82 1486 struct trace_event_file *file;
413d37d1 1487
748ec3a2
YY
1488 if (tracing_is_disabled())
1489 return -ENODEV;
1490
413d37d1
MH
1491 target = kprobe_trace_selftest_target;
1492
1493 pr_info("Testing kprobe tracing: ");
1494
7e465baa
TZ
1495 ret = trace_run_command("p:testprobe kprobe_trace_selftest_target "
1496 "$stack $stack0 +0($stack)",
1497 create_trace_kprobe);
231e36f4 1498 if (WARN_ON_ONCE(ret)) {
41a7dd42 1499 pr_warn("error on probing function entry.\n");
231e36f4
MH
1500 warn++;
1501 } else {
1502 /* Enable trace point */
c31ffb3f
NK
1503 tk = find_trace_kprobe("testprobe", KPROBE_EVENT_SYSTEM);
1504 if (WARN_ON_ONCE(tk == NULL)) {
41a7dd42 1505 pr_warn("error on getting new probe.\n");
231e36f4 1506 warn++;
41a7dd42 1507 } else {
c31ffb3f 1508 file = find_trace_probe_file(tk, top_trace_array());
41a7dd42
MH
1509 if (WARN_ON_ONCE(file == NULL)) {
1510 pr_warn("error on getting probe file.\n");
1511 warn++;
1512 } else
c31ffb3f 1513 enable_trace_kprobe(tk, file);
41a7dd42 1514 }
231e36f4 1515 }
413d37d1 1516
7e465baa
TZ
1517 ret = trace_run_command("r:testprobe2 kprobe_trace_selftest_target "
1518 "$retval", create_trace_kprobe);
231e36f4 1519 if (WARN_ON_ONCE(ret)) {
41a7dd42 1520 pr_warn("error on probing function return.\n");
231e36f4
MH
1521 warn++;
1522 } else {
1523 /* Enable trace point */
c31ffb3f
NK
1524 tk = find_trace_kprobe("testprobe2", KPROBE_EVENT_SYSTEM);
1525 if (WARN_ON_ONCE(tk == NULL)) {
41a7dd42 1526 pr_warn("error on getting 2nd new probe.\n");
231e36f4 1527 warn++;
41a7dd42 1528 } else {
c31ffb3f 1529 file = find_trace_probe_file(tk, top_trace_array());
41a7dd42
MH
1530 if (WARN_ON_ONCE(file == NULL)) {
1531 pr_warn("error on getting probe file.\n");
1532 warn++;
1533 } else
c31ffb3f 1534 enable_trace_kprobe(tk, file);
41a7dd42 1535 }
231e36f4
MH
1536 }
1537
1538 if (warn)
1539 goto end;
413d37d1
MH
1540
1541 ret = target(1, 2, 3, 4, 5, 6);
1542
d4d7ccc8
MN
1543 /*
1544 * Not expecting an error here, the check is only to prevent the
1545 * optimizer from removing the call to target() as otherwise there
1546 * are no side-effects and the call is never performed.
1547 */
1548 if (ret != 21)
1549 warn++;
1550
02ca1521 1551 /* Disable trace points before removing it */
c31ffb3f
NK
1552 tk = find_trace_kprobe("testprobe", KPROBE_EVENT_SYSTEM);
1553 if (WARN_ON_ONCE(tk == NULL)) {
41a7dd42 1554 pr_warn("error on getting test probe.\n");
02ca1521 1555 warn++;
41a7dd42 1556 } else {
d4d7ccc8
MN
1557 if (trace_kprobe_nhit(tk) != 1) {
1558 pr_warn("incorrect number of testprobe hits\n");
1559 warn++;
1560 }
1561
c31ffb3f 1562 file = find_trace_probe_file(tk, top_trace_array());
41a7dd42
MH
1563 if (WARN_ON_ONCE(file == NULL)) {
1564 pr_warn("error on getting probe file.\n");
1565 warn++;
1566 } else
c31ffb3f 1567 disable_trace_kprobe(tk, file);
41a7dd42 1568 }
02ca1521 1569
c31ffb3f
NK
1570 tk = find_trace_kprobe("testprobe2", KPROBE_EVENT_SYSTEM);
1571 if (WARN_ON_ONCE(tk == NULL)) {
41a7dd42 1572 pr_warn("error on getting 2nd test probe.\n");
02ca1521 1573 warn++;
41a7dd42 1574 } else {
d4d7ccc8
MN
1575 if (trace_kprobe_nhit(tk) != 1) {
1576 pr_warn("incorrect number of testprobe2 hits\n");
1577 warn++;
1578 }
1579
c31ffb3f 1580 file = find_trace_probe_file(tk, top_trace_array());
41a7dd42
MH
1581 if (WARN_ON_ONCE(file == NULL)) {
1582 pr_warn("error on getting probe file.\n");
1583 warn++;
1584 } else
c31ffb3f 1585 disable_trace_kprobe(tk, file);
41a7dd42 1586 }
02ca1521 1587
7e465baa 1588 ret = trace_run_command("-:testprobe", create_trace_kprobe);
231e36f4 1589 if (WARN_ON_ONCE(ret)) {
41a7dd42 1590 pr_warn("error on deleting a probe.\n");
231e36f4
MH
1591 warn++;
1592 }
1593
7e465baa 1594 ret = trace_run_command("-:testprobe2", create_trace_kprobe);
231e36f4 1595 if (WARN_ON_ONCE(ret)) {
41a7dd42 1596 pr_warn("error on deleting a probe.\n");
231e36f4
MH
1597 warn++;
1598 }
413d37d1 1599
231e36f4 1600end:
c31ffb3f 1601 release_all_trace_kprobes();
30e7d894
TG
1602 /*
1603 * Wait for the optimizer work to finish. Otherwise it might fiddle
1604 * with probes in already freed __init text.
1605 */
1606 wait_for_kprobe_optimizer();
231e36f4
MH
1607 if (warn)
1608 pr_cont("NG: Some tests are failed. Please check them.\n");
1609 else
1610 pr_cont("OK\n");
413d37d1
MH
1611 return 0;
1612}
1613
1614late_initcall(kprobe_trace_self_tests_init);
1615
1616#endif