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