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