linux/kernel/trace/trace_uprobe.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * uprobes-based tracing events
   4 *
   5 * Copyright (C) IBM Corporation, 2010-2012
   6 * Author:      Srikar Dronamraju <srikar@linux.vnet.ibm.com>
   7 */
   8#define pr_fmt(fmt)     "trace_uprobe: " fmt
   9
  10#include <linux/security.h>
  11#include <linux/ctype.h>
  12#include <linux/module.h>
  13#include <linux/uaccess.h>
  14#include <linux/uprobes.h>
  15#include <linux/namei.h>
  16#include <linux/string.h>
  17#include <linux/rculist.h>
  18
  19#include "trace_dynevent.h"
  20#include "trace_probe.h"
  21#include "trace_probe_tmpl.h"
  22
  23#define UPROBE_EVENT_SYSTEM     "uprobes"
  24
  25struct uprobe_trace_entry_head {
  26        struct trace_entry      ent;
  27        unsigned long           vaddr[];
  28};
  29
  30#define SIZEOF_TRACE_ENTRY(is_return)                   \
  31        (sizeof(struct uprobe_trace_entry_head) +       \
  32         sizeof(unsigned long) * (is_return ? 2 : 1))
  33
  34#define DATAOF_TRACE_ENTRY(entry, is_return)            \
  35        ((void*)(entry) + SIZEOF_TRACE_ENTRY(is_return))
  36
  37static int trace_uprobe_create(const char *raw_command);
  38static int trace_uprobe_show(struct seq_file *m, struct dyn_event *ev);
  39static int trace_uprobe_release(struct dyn_event *ev);
  40static bool trace_uprobe_is_busy(struct dyn_event *ev);
  41static bool trace_uprobe_match(const char *system, const char *event,
  42                        int argc, const char **argv, struct dyn_event *ev);
  43
  44static struct dyn_event_operations trace_uprobe_ops = {
  45        .create = trace_uprobe_create,
  46        .show = trace_uprobe_show,
  47        .is_busy = trace_uprobe_is_busy,
  48        .free = trace_uprobe_release,
  49        .match = trace_uprobe_match,
  50};
  51
  52/*
  53 * uprobe event core functions
  54 */
  55struct trace_uprobe {
  56        struct dyn_event                devent;
  57        struct uprobe_consumer          consumer;
  58        struct path                     path;
  59        struct inode                    *inode;
  60        char                            *filename;
  61        unsigned long                   offset;
  62        unsigned long                   ref_ctr_offset;
  63        unsigned long                   nhit;
  64        struct trace_probe              tp;
  65};
  66
  67static bool is_trace_uprobe(struct dyn_event *ev)
  68{
  69        return ev->ops == &trace_uprobe_ops;
  70}
  71
  72static struct trace_uprobe *to_trace_uprobe(struct dyn_event *ev)
  73{
  74        return container_of(ev, struct trace_uprobe, devent);
  75}
  76
  77/**
  78 * for_each_trace_uprobe - iterate over the trace_uprobe list
  79 * @pos:        the struct trace_uprobe * for each entry
  80 * @dpos:       the struct dyn_event * to use as a loop cursor
  81 */
  82#define for_each_trace_uprobe(pos, dpos)        \
  83        for_each_dyn_event(dpos)                \
  84                if (is_trace_uprobe(dpos) && (pos = to_trace_uprobe(dpos)))
  85
  86#define SIZEOF_TRACE_UPROBE(n)                          \
  87        (offsetof(struct trace_uprobe, tp.args) +       \
  88        (sizeof(struct probe_arg) * (n)))
  89
  90static int register_uprobe_event(struct trace_uprobe *tu);
  91static int unregister_uprobe_event(struct trace_uprobe *tu);
  92
  93struct uprobe_dispatch_data {
  94        struct trace_uprobe     *tu;
  95        unsigned long           bp_addr;
  96};
  97
  98static int uprobe_dispatcher(struct uprobe_consumer *con, struct pt_regs *regs);
  99static int uretprobe_dispatcher(struct uprobe_consumer *con,
 100                                unsigned long func, struct pt_regs *regs);
 101
 102#ifdef CONFIG_STACK_GROWSUP
 103static unsigned long adjust_stack_addr(unsigned long addr, unsigned int n)
 104{
 105        return addr - (n * sizeof(long));
 106}
 107#else
 108static unsigned long adjust_stack_addr(unsigned long addr, unsigned int n)
 109{
 110        return addr + (n * sizeof(long));
 111}
 112#endif
 113
 114static unsigned long get_user_stack_nth(struct pt_regs *regs, unsigned int n)
 115{
 116        unsigned long ret;
 117        unsigned long addr = user_stack_pointer(regs);
 118
 119        addr = adjust_stack_addr(addr, n);
 120
 121        if (copy_from_user(&ret, (void __force __user *) addr, sizeof(ret)))
 122                return 0;
 123
 124        return ret;
 125}
 126
 127/*
 128 * Uprobes-specific fetch functions
 129 */
 130static nokprobe_inline int
 131probe_mem_read(void *dest, void *src, size_t size)
 132{
 133        void __user *vaddr = (void __force __user *)src;
 134
 135        return copy_from_user(dest, vaddr, size) ? -EFAULT : 0;
 136}
 137
 138static nokprobe_inline int
 139probe_mem_read_user(void *dest, void *src, size_t size)
 140{
 141        return probe_mem_read(dest, src, size);
 142}
 143
 144/*
 145 * Fetch a null-terminated string. Caller MUST set *(u32 *)dest with max
 146 * length and relative data location.
 147 */
 148static nokprobe_inline int
 149fetch_store_string(unsigned long addr, void *dest, void *base)
 150{
 151        long ret;
 152        u32 loc = *(u32 *)dest;
 153        int maxlen  = get_loc_len(loc);
 154        u8 *dst = get_loc_data(dest, base);
 155        void __user *src = (void __force __user *) addr;
 156
 157        if (unlikely(!maxlen))
 158                return -ENOMEM;
 159
 160        if (addr == FETCH_TOKEN_COMM)
 161                ret = strlcpy(dst, current->comm, maxlen);
 162        else
 163                ret = strncpy_from_user(dst, src, maxlen);
 164        if (ret >= 0) {
 165                if (ret == maxlen)
 166                        dst[ret - 1] = '\0';
 167                else
 168                        /*
 169                         * Include the terminating null byte. In this case it
 170                         * was copied by strncpy_from_user but not accounted
 171                         * for in ret.
 172                         */
 173                        ret++;
 174                *(u32 *)dest = make_data_loc(ret, (void *)dst - base);
 175        }
 176
 177        return ret;
 178}
 179
 180static nokprobe_inline int
 181fetch_store_string_user(unsigned long addr, void *dest, void *base)
 182{
 183        return fetch_store_string(addr, dest, base);
 184}
 185
 186/* Return the length of string -- including null terminal byte */
 187static nokprobe_inline int
 188fetch_store_strlen(unsigned long addr)
 189{
 190        int len;
 191        void __user *vaddr = (void __force __user *) addr;
 192
 193        if (addr == FETCH_TOKEN_COMM)
 194                len = strlen(current->comm) + 1;
 195        else
 196                len = strnlen_user(vaddr, MAX_STRING_SIZE);
 197
 198        return (len > MAX_STRING_SIZE) ? 0 : len;
 199}
 200
 201static nokprobe_inline int
 202fetch_store_strlen_user(unsigned long addr)
 203{
 204        return fetch_store_strlen(addr);
 205}
 206
 207static unsigned long translate_user_vaddr(unsigned long file_offset)
 208{
 209        unsigned long base_addr;
 210        struct uprobe_dispatch_data *udd;
 211
 212        udd = (void *) current->utask->vaddr;
 213
 214        base_addr = udd->bp_addr - udd->tu->offset;
 215        return base_addr + file_offset;
 216}
 217
 218/* Note that we don't verify it, since the code does not come from user space */
 219static int
 220process_fetch_insn(struct fetch_insn *code, struct pt_regs *regs, void *dest,
 221                   void *base)
 222{
 223        unsigned long val;
 224
 225        /* 1st stage: get value from context */
 226        switch (code->op) {
 227        case FETCH_OP_REG:
 228                val = regs_get_register(regs, code->param);
 229                break;
 230        case FETCH_OP_STACK:
 231                val = get_user_stack_nth(regs, code->param);
 232                break;
 233        case FETCH_OP_STACKP:
 234                val = user_stack_pointer(regs);
 235                break;
 236        case FETCH_OP_RETVAL:
 237                val = regs_return_value(regs);
 238                break;
 239        case FETCH_OP_IMM:
 240                val = code->immediate;
 241                break;
 242        case FETCH_OP_COMM:
 243                val = FETCH_TOKEN_COMM;
 244                break;
 245        case FETCH_OP_DATA:
 246                val = (unsigned long)code->data;
 247                break;
 248        case FETCH_OP_FOFFS:
 249                val = translate_user_vaddr(code->immediate);
 250                break;
 251        default:
 252                return -EILSEQ;
 253        }
 254        code++;
 255
 256        return process_fetch_insn_bottom(code, val, dest, base);
 257}
 258NOKPROBE_SYMBOL(process_fetch_insn)
 259
 260static inline void init_trace_uprobe_filter(struct trace_uprobe_filter *filter)
 261{
 262        rwlock_init(&filter->rwlock);
 263        filter->nr_systemwide = 0;
 264        INIT_LIST_HEAD(&filter->perf_events);
 265}
 266
 267static inline bool uprobe_filter_is_empty(struct trace_uprobe_filter *filter)
 268{
 269        return !filter->nr_systemwide && list_empty(&filter->perf_events);
 270}
 271
 272static inline bool is_ret_probe(struct trace_uprobe *tu)
 273{
 274        return tu->consumer.ret_handler != NULL;
 275}
 276
 277static bool trace_uprobe_is_busy(struct dyn_event *ev)
 278{
 279        struct trace_uprobe *tu = to_trace_uprobe(ev);
 280
 281        return trace_probe_is_enabled(&tu->tp);
 282}
 283
 284static bool trace_uprobe_match_command_head(struct trace_uprobe *tu,
 285                                            int argc, const char **argv)
 286{
 287        char buf[MAX_ARGSTR_LEN + 1];
 288        int len;
 289
 290        if (!argc)
 291                return true;
 292
 293        len = strlen(tu->filename);
 294        if (strncmp(tu->filename, argv[0], len) || argv[0][len] != ':')
 295                return false;
 296
 297        if (tu->ref_ctr_offset == 0)
 298                snprintf(buf, sizeof(buf), "0x%0*lx",
 299                                (int)(sizeof(void *) * 2), tu->offset);
 300        else
 301                snprintf(buf, sizeof(buf), "0x%0*lx(0x%lx)",
 302                                (int)(sizeof(void *) * 2), tu->offset,
 303                                tu->ref_ctr_offset);
 304        if (strcmp(buf, &argv[0][len + 1]))
 305                return false;
 306
 307        argc--; argv++;
 308
 309        return trace_probe_match_command_args(&tu->tp, argc, argv);
 310}
 311
 312static bool trace_uprobe_match(const char *system, const char *event,
 313                        int argc, const char **argv, struct dyn_event *ev)
 314{
 315        struct trace_uprobe *tu = to_trace_uprobe(ev);
 316
 317        return strcmp(trace_probe_name(&tu->tp), event) == 0 &&
 318           (!system || strcmp(trace_probe_group_name(&tu->tp), system) == 0) &&
 319           trace_uprobe_match_command_head(tu, argc, argv);
 320}
 321
 322static nokprobe_inline struct trace_uprobe *
 323trace_uprobe_primary_from_call(struct trace_event_call *call)
 324{
 325        struct trace_probe *tp;
 326
 327        tp = trace_probe_primary_from_call(call);
 328        if (WARN_ON_ONCE(!tp))
 329                return NULL;
 330
 331        return container_of(tp, struct trace_uprobe, tp);
 332}
 333
 334/*
 335 * Allocate new trace_uprobe and initialize it (including uprobes).
 336 */
 337static struct trace_uprobe *
 338alloc_trace_uprobe(const char *group, const char *event, int nargs, bool is_ret)
 339{
 340        struct trace_uprobe *tu;
 341        int ret;
 342
 343        tu = kzalloc(SIZEOF_TRACE_UPROBE(nargs), GFP_KERNEL);
 344        if (!tu)
 345                return ERR_PTR(-ENOMEM);
 346
 347        ret = trace_probe_init(&tu->tp, event, group, true);
 348        if (ret < 0)
 349                goto error;
 350
 351        dyn_event_init(&tu->devent, &trace_uprobe_ops);
 352        tu->consumer.handler = uprobe_dispatcher;
 353        if (is_ret)
 354                tu->consumer.ret_handler = uretprobe_dispatcher;
 355        init_trace_uprobe_filter(tu->tp.event->filter);
 356        return tu;
 357
 358error:
 359        kfree(tu);
 360
 361        return ERR_PTR(ret);
 362}
 363
 364static void free_trace_uprobe(struct trace_uprobe *tu)
 365{
 366        if (!tu)
 367                return;
 368
 369        path_put(&tu->path);
 370        trace_probe_cleanup(&tu->tp);
 371        kfree(tu->filename);
 372        kfree(tu);
 373}
 374
 375static struct trace_uprobe *find_probe_event(const char *event, const char *group)
 376{
 377        struct dyn_event *pos;
 378        struct trace_uprobe *tu;
 379
 380        for_each_trace_uprobe(tu, pos)
 381                if (strcmp(trace_probe_name(&tu->tp), event) == 0 &&
 382                    strcmp(trace_probe_group_name(&tu->tp), group) == 0)
 383                        return tu;
 384
 385        return NULL;
 386}
 387
 388/* Unregister a trace_uprobe and probe_event */
 389static int unregister_trace_uprobe(struct trace_uprobe *tu)
 390{
 391        int ret;
 392
 393        if (trace_probe_has_sibling(&tu->tp))
 394                goto unreg;
 395
 396        ret = unregister_uprobe_event(tu);
 397        if (ret)
 398                return ret;
 399
 400unreg:
 401        dyn_event_remove(&tu->devent);
 402        trace_probe_unlink(&tu->tp);
 403        free_trace_uprobe(tu);
 404        return 0;
 405}
 406
 407static bool trace_uprobe_has_same_uprobe(struct trace_uprobe *orig,
 408                                         struct trace_uprobe *comp)
 409{
 410        struct trace_probe_event *tpe = orig->tp.event;
 411        struct trace_probe *pos;
 412        struct inode *comp_inode = d_real_inode(comp->path.dentry);
 413        int i;
 414
 415        list_for_each_entry(pos, &tpe->probes, list) {
 416                orig = container_of(pos, struct trace_uprobe, tp);
 417                if (comp_inode != d_real_inode(orig->path.dentry) ||
 418                    comp->offset != orig->offset)
 419                        continue;
 420
 421                /*
 422                 * trace_probe_compare_arg_type() ensured that nr_args and
 423                 * each argument name and type are same. Let's compare comm.
 424                 */
 425                for (i = 0; i < orig->tp.nr_args; i++) {
 426                        if (strcmp(orig->tp.args[i].comm,
 427                                   comp->tp.args[i].comm))
 428                                break;
 429                }
 430
 431                if (i == orig->tp.nr_args)
 432                        return true;
 433        }
 434
 435        return false;
 436}
 437
 438static int append_trace_uprobe(struct trace_uprobe *tu, struct trace_uprobe *to)
 439{
 440        int ret;
 441
 442        ret = trace_probe_compare_arg_type(&tu->tp, &to->tp);
 443        if (ret) {
 444                /* Note that argument starts index = 2 */
 445                trace_probe_log_set_index(ret + 1);
 446                trace_probe_log_err(0, DIFF_ARG_TYPE);
 447                return -EEXIST;
 448        }
 449        if (trace_uprobe_has_same_uprobe(to, tu)) {
 450                trace_probe_log_set_index(0);
 451                trace_probe_log_err(0, SAME_PROBE);
 452                return -EEXIST;
 453        }
 454
 455        /* Append to existing event */
 456        ret = trace_probe_append(&tu->tp, &to->tp);
 457        if (!ret)
 458                dyn_event_add(&tu->devent);
 459
 460        return ret;
 461}
 462
 463/*
 464 * Uprobe with multiple reference counter is not allowed. i.e.
 465 * If inode and offset matches, reference counter offset *must*
 466 * match as well. Though, there is one exception: If user is
 467 * replacing old trace_uprobe with new one(same group/event),
 468 * then we allow same uprobe with new reference counter as far
 469 * as the new one does not conflict with any other existing
 470 * ones.
 471 */
 472static int validate_ref_ctr_offset(struct trace_uprobe *new)
 473{
 474        struct dyn_event *pos;
 475        struct trace_uprobe *tmp;
 476        struct inode *new_inode = d_real_inode(new->path.dentry);
 477
 478        for_each_trace_uprobe(tmp, pos) {
 479                if (new_inode == d_real_inode(tmp->path.dentry) &&
 480                    new->offset == tmp->offset &&
 481                    new->ref_ctr_offset != tmp->ref_ctr_offset) {
 482                        pr_warn("Reference counter offset mismatch.");
 483                        return -EINVAL;
 484                }
 485        }
 486        return 0;
 487}
 488
 489/* Register a trace_uprobe and probe_event */
 490static int register_trace_uprobe(struct trace_uprobe *tu)
 491{
 492        struct trace_uprobe *old_tu;
 493        int ret;
 494
 495        mutex_lock(&event_mutex);
 496
 497        ret = validate_ref_ctr_offset(tu);
 498        if (ret)
 499                goto end;
 500
 501        /* register as an event */
 502        old_tu = find_probe_event(trace_probe_name(&tu->tp),
 503                                  trace_probe_group_name(&tu->tp));
 504        if (old_tu) {
 505                if (is_ret_probe(tu) != is_ret_probe(old_tu)) {
 506                        trace_probe_log_set_index(0);
 507                        trace_probe_log_err(0, DIFF_PROBE_TYPE);
 508                        ret = -EEXIST;
 509                } else {
 510                        ret = append_trace_uprobe(tu, old_tu);
 511                }
 512                goto end;
 513        }
 514
 515        ret = register_uprobe_event(tu);
 516        if (ret) {
 517                pr_warn("Failed to register probe event(%d)\n", ret);
 518                goto end;
 519        }
 520
 521        dyn_event_add(&tu->devent);
 522
 523end:
 524        mutex_unlock(&event_mutex);
 525
 526        return ret;
 527}
 528
 529/*
 530 * Argument syntax:
 531 *  - Add uprobe: p|r[:[GRP/]EVENT] PATH:OFFSET[%return][(REF)] [FETCHARGS]
 532 */
 533static int __trace_uprobe_create(int argc, const char **argv)
 534{
 535        struct trace_uprobe *tu;
 536        const char *event = NULL, *group = UPROBE_EVENT_SYSTEM;
 537        char *arg, *filename, *rctr, *rctr_end, *tmp;
 538        char buf[MAX_EVENT_NAME_LEN];
 539        struct path path;
 540        unsigned long offset, ref_ctr_offset;
 541        bool is_return = false;
 542        int i, ret;
 543
 544        ret = 0;
 545        ref_ctr_offset = 0;
 546
 547        switch (argv[0][0]) {
 548        case 'r':
 549                is_return = true;
 550                break;
 551        case 'p':
 552                break;
 553        default:
 554                return -ECANCELED;
 555        }
 556
 557        if (argc < 2)
 558                return -ECANCELED;
 559
 560        if (argv[0][1] == ':')
 561                event = &argv[0][2];
 562
 563        if (!strchr(argv[1], '/'))
 564                return -ECANCELED;
 565
 566        filename = kstrdup(argv[1], GFP_KERNEL);
 567        if (!filename)
 568                return -ENOMEM;
 569
 570        /* Find the last occurrence, in case the path contains ':' too. */
 571        arg = strrchr(filename, ':');
 572        if (!arg || !isdigit(arg[1])) {
 573                kfree(filename);
 574                return -ECANCELED;
 575        }
 576
 577        trace_probe_log_init("trace_uprobe", argc, argv);
 578        trace_probe_log_set_index(1);   /* filename is the 2nd argument */
 579
 580        *arg++ = '\0';
 581        ret = kern_path(filename, LOOKUP_FOLLOW, &path);
 582        if (ret) {
 583                trace_probe_log_err(0, FILE_NOT_FOUND);
 584                kfree(filename);
 585                trace_probe_log_clear();
 586                return ret;
 587        }
 588        if (!d_is_reg(path.dentry)) {
 589                trace_probe_log_err(0, NO_REGULAR_FILE);
 590                ret = -EINVAL;
 591                goto fail_address_parse;
 592        }
 593
 594        /* Parse reference counter offset if specified. */
 595        rctr = strchr(arg, '(');
 596        if (rctr) {
 597                rctr_end = strchr(rctr, ')');
 598                if (!rctr_end) {
 599                        ret = -EINVAL;
 600                        rctr_end = rctr + strlen(rctr);
 601                        trace_probe_log_err(rctr_end - filename,
 602                                            REFCNT_OPEN_BRACE);
 603                        goto fail_address_parse;
 604                } else if (rctr_end[1] != '\0') {
 605                        ret = -EINVAL;
 606                        trace_probe_log_err(rctr_end + 1 - filename,
 607                                            BAD_REFCNT_SUFFIX);
 608                        goto fail_address_parse;
 609                }
 610
 611                *rctr++ = '\0';
 612                *rctr_end = '\0';
 613                ret = kstrtoul(rctr, 0, &ref_ctr_offset);
 614                if (ret) {
 615                        trace_probe_log_err(rctr - filename, BAD_REFCNT);
 616                        goto fail_address_parse;
 617                }
 618        }
 619
 620        /* Check if there is %return suffix */
 621        tmp = strchr(arg, '%');
 622        if (tmp) {
 623                if (!strcmp(tmp, "%return")) {
 624                        *tmp = '\0';
 625                        is_return = true;
 626                } else {
 627                        trace_probe_log_err(tmp - filename, BAD_ADDR_SUFFIX);
 628                        ret = -EINVAL;
 629                        goto fail_address_parse;
 630                }
 631        }
 632
 633        /* Parse uprobe offset. */
 634        ret = kstrtoul(arg, 0, &offset);
 635        if (ret) {
 636                trace_probe_log_err(arg - filename, BAD_UPROBE_OFFS);
 637                goto fail_address_parse;
 638        }
 639
 640        /* setup a probe */
 641        trace_probe_log_set_index(0);
 642        if (event) {
 643                ret = traceprobe_parse_event_name(&event, &group, buf,
 644                                                  event - argv[0]);
 645                if (ret)
 646                        goto fail_address_parse;
 647        } else {
 648                char *tail;
 649                char *ptr;
 650
 651                tail = kstrdup(kbasename(filename), GFP_KERNEL);
 652                if (!tail) {
 653                        ret = -ENOMEM;
 654                        goto fail_address_parse;
 655                }
 656
 657                ptr = strpbrk(tail, ".-_");
 658                if (ptr)
 659                        *ptr = '\0';
 660
 661                snprintf(buf, MAX_EVENT_NAME_LEN, "%c_%s_0x%lx", 'p', tail, offset);
 662                event = buf;
 663                kfree(tail);
 664        }
 665
 666        argc -= 2;
 667        argv += 2;
 668
 669        tu = alloc_trace_uprobe(group, event, argc, is_return);
 670        if (IS_ERR(tu)) {
 671                ret = PTR_ERR(tu);
 672                /* This must return -ENOMEM otherwise there is a bug */
 673                WARN_ON_ONCE(ret != -ENOMEM);
 674                goto fail_address_parse;
 675        }
 676        tu->offset = offset;
 677        tu->ref_ctr_offset = ref_ctr_offset;
 678        tu->path = path;
 679        tu->filename = filename;
 680
 681        /* parse arguments */
 682        for (i = 0; i < argc && i < MAX_TRACE_ARGS; i++) {
 683                tmp = kstrdup(argv[i], GFP_KERNEL);
 684                if (!tmp) {
 685                        ret = -ENOMEM;
 686                        goto error;
 687                }
 688
 689                trace_probe_log_set_index(i + 2);
 690                ret = traceprobe_parse_probe_arg(&tu->tp, i, tmp,
 691                                        is_return ? TPARG_FL_RETURN : 0);
 692                kfree(tmp);
 693                if (ret)
 694                        goto error;
 695        }
 696
 697        ret = traceprobe_set_print_fmt(&tu->tp, is_ret_probe(tu));
 698        if (ret < 0)
 699                goto error;
 700
 701        ret = register_trace_uprobe(tu);
 702        if (!ret)
 703                goto out;
 704
 705error:
 706        free_trace_uprobe(tu);
 707out:
 708        trace_probe_log_clear();
 709        return ret;
 710
 711fail_address_parse:
 712        trace_probe_log_clear();
 713        path_put(&path);
 714        kfree(filename);
 715
 716        return ret;
 717}
 718
 719int trace_uprobe_create(const char *raw_command)
 720{
 721        return trace_probe_create(raw_command, __trace_uprobe_create);
 722}
 723
 724static int create_or_delete_trace_uprobe(const char *raw_command)
 725{
 726        int ret;
 727
 728        if (raw_command[0] == '-')
 729                return dyn_event_release(raw_command, &trace_uprobe_ops);
 730
 731        ret = trace_uprobe_create(raw_command);
 732        return ret == -ECANCELED ? -EINVAL : ret;
 733}
 734
 735static int trace_uprobe_release(struct dyn_event *ev)
 736{
 737        struct trace_uprobe *tu = to_trace_uprobe(ev);
 738
 739        return unregister_trace_uprobe(tu);
 740}
 741
 742/* Probes listing interfaces */
 743static int trace_uprobe_show(struct seq_file *m, struct dyn_event *ev)
 744{
 745        struct trace_uprobe *tu = to_trace_uprobe(ev);
 746        char c = is_ret_probe(tu) ? 'r' : 'p';
 747        int i;
 748
 749        seq_printf(m, "%c:%s/%s %s:0x%0*lx", c, trace_probe_group_name(&tu->tp),
 750                        trace_probe_name(&tu->tp), tu->filename,
 751                        (int)(sizeof(void *) * 2), tu->offset);
 752
 753        if (tu->ref_ctr_offset)
 754                seq_printf(m, "(0x%lx)", tu->ref_ctr_offset);
 755
 756        for (i = 0; i < tu->tp.nr_args; i++)
 757                seq_printf(m, " %s=%s", tu->tp.args[i].name, tu->tp.args[i].comm);
 758
 759        seq_putc(m, '\n');
 760        return 0;
 761}
 762
 763static int probes_seq_show(struct seq_file *m, void *v)
 764{
 765        struct dyn_event *ev = v;
 766
 767        if (!is_trace_uprobe(ev))
 768                return 0;
 769
 770        return trace_uprobe_show(m, ev);
 771}
 772
 773static const struct seq_operations probes_seq_op = {
 774        .start  = dyn_event_seq_start,
 775        .next   = dyn_event_seq_next,
 776        .stop   = dyn_event_seq_stop,
 777        .show   = probes_seq_show
 778};
 779
 780static int probes_open(struct inode *inode, struct file *file)
 781{
 782        int ret;
 783
 784        ret = security_locked_down(LOCKDOWN_TRACEFS);
 785        if (ret)
 786                return ret;
 787
 788        if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) {
 789                ret = dyn_events_release_all(&trace_uprobe_ops);
 790                if (ret)
 791                        return ret;
 792        }
 793
 794        return seq_open(file, &probes_seq_op);
 795}
 796
 797static ssize_t probes_write(struct file *file, const char __user *buffer,
 798                            size_t count, loff_t *ppos)
 799{
 800        return trace_parse_run_command(file, buffer, count, ppos,
 801                                        create_or_delete_trace_uprobe);
 802}
 803
 804static const struct file_operations uprobe_events_ops = {
 805        .owner          = THIS_MODULE,
 806        .open           = probes_open,
 807        .read           = seq_read,
 808        .llseek         = seq_lseek,
 809        .release        = seq_release,
 810        .write          = probes_write,
 811};
 812
 813/* Probes profiling interfaces */
 814static int probes_profile_seq_show(struct seq_file *m, void *v)
 815{
 816        struct dyn_event *ev = v;
 817        struct trace_uprobe *tu;
 818
 819        if (!is_trace_uprobe(ev))
 820                return 0;
 821
 822        tu = to_trace_uprobe(ev);
 823        seq_printf(m, "  %s %-44s %15lu\n", tu->filename,
 824                        trace_probe_name(&tu->tp), tu->nhit);
 825        return 0;
 826}
 827
 828static const struct seq_operations profile_seq_op = {
 829        .start  = dyn_event_seq_start,
 830        .next   = dyn_event_seq_next,
 831        .stop   = dyn_event_seq_stop,
 832        .show   = probes_profile_seq_show
 833};
 834
 835static int profile_open(struct inode *inode, struct file *file)
 836{
 837        int ret;
 838
 839        ret = security_locked_down(LOCKDOWN_TRACEFS);
 840        if (ret)
 841                return ret;
 842
 843        return seq_open(file, &profile_seq_op);
 844}
 845
 846static const struct file_operations uprobe_profile_ops = {
 847        .owner          = THIS_MODULE,
 848        .open           = profile_open,
 849        .read           = seq_read,
 850        .llseek         = seq_lseek,
 851        .release        = seq_release,
 852};
 853
 854struct uprobe_cpu_buffer {
 855        struct mutex mutex;
 856        void *buf;
 857};
 858static struct uprobe_cpu_buffer __percpu *uprobe_cpu_buffer;
 859static int uprobe_buffer_refcnt;
 860
 861static int uprobe_buffer_init(void)
 862{
 863        int cpu, err_cpu;
 864
 865        uprobe_cpu_buffer = alloc_percpu(struct uprobe_cpu_buffer);
 866        if (uprobe_cpu_buffer == NULL)
 867                return -ENOMEM;
 868
 869        for_each_possible_cpu(cpu) {
 870                struct page *p = alloc_pages_node(cpu_to_node(cpu),
 871                                                  GFP_KERNEL, 0);
 872                if (p == NULL) {
 873                        err_cpu = cpu;
 874                        goto err;
 875                }
 876                per_cpu_ptr(uprobe_cpu_buffer, cpu)->buf = page_address(p);
 877                mutex_init(&per_cpu_ptr(uprobe_cpu_buffer, cpu)->mutex);
 878        }
 879
 880        return 0;
 881
 882err:
 883        for_each_possible_cpu(cpu) {
 884                if (cpu == err_cpu)
 885                        break;
 886                free_page((unsigned long)per_cpu_ptr(uprobe_cpu_buffer, cpu)->buf);
 887        }
 888
 889        free_percpu(uprobe_cpu_buffer);
 890        return -ENOMEM;
 891}
 892
 893static int uprobe_buffer_enable(void)
 894{
 895        int ret = 0;
 896
 897        BUG_ON(!mutex_is_locked(&event_mutex));
 898
 899        if (uprobe_buffer_refcnt++ == 0) {
 900                ret = uprobe_buffer_init();
 901                if (ret < 0)
 902                        uprobe_buffer_refcnt--;
 903        }
 904
 905        return ret;
 906}
 907
 908static void uprobe_buffer_disable(void)
 909{
 910        int cpu;
 911
 912        BUG_ON(!mutex_is_locked(&event_mutex));
 913
 914        if (--uprobe_buffer_refcnt == 0) {
 915                for_each_possible_cpu(cpu)
 916                        free_page((unsigned long)per_cpu_ptr(uprobe_cpu_buffer,
 917                                                             cpu)->buf);
 918
 919                free_percpu(uprobe_cpu_buffer);
 920                uprobe_cpu_buffer = NULL;
 921        }
 922}
 923
 924static struct uprobe_cpu_buffer *uprobe_buffer_get(void)
 925{
 926        struct uprobe_cpu_buffer *ucb;
 927        int cpu;
 928
 929        cpu = raw_smp_processor_id();
 930        ucb = per_cpu_ptr(uprobe_cpu_buffer, cpu);
 931
 932        /*
 933         * Use per-cpu buffers for fastest access, but we might migrate
 934         * so the mutex makes sure we have sole access to it.
 935         */
 936        mutex_lock(&ucb->mutex);
 937
 938        return ucb;
 939}
 940
 941static void uprobe_buffer_put(struct uprobe_cpu_buffer *ucb)
 942{
 943        mutex_unlock(&ucb->mutex);
 944}
 945
 946static void __uprobe_trace_func(struct trace_uprobe *tu,
 947                                unsigned long func, struct pt_regs *regs,
 948                                struct uprobe_cpu_buffer *ucb, int dsize,
 949                                struct trace_event_file *trace_file)
 950{
 951        struct uprobe_trace_entry_head *entry;
 952        struct trace_buffer *buffer;
 953        struct ring_buffer_event *event;
 954        void *data;
 955        int size, esize;
 956        struct trace_event_call *call = trace_probe_event_call(&tu->tp);
 957
 958        WARN_ON(call != trace_file->event_call);
 959
 960        if (WARN_ON_ONCE(tu->tp.size + dsize > PAGE_SIZE))
 961                return;
 962
 963        if (trace_trigger_soft_disabled(trace_file))
 964                return;
 965
 966        esize = SIZEOF_TRACE_ENTRY(is_ret_probe(tu));
 967        size = esize + tu->tp.size + dsize;
 968        event = trace_event_buffer_lock_reserve(&buffer, trace_file,
 969                                                call->event.type, size, 0);
 970        if (!event)
 971                return;
 972
 973        entry = ring_buffer_event_data(event);
 974        if (is_ret_probe(tu)) {
 975                entry->vaddr[0] = func;
 976                entry->vaddr[1] = instruction_pointer(regs);
 977                data = DATAOF_TRACE_ENTRY(entry, true);
 978        } else {
 979                entry->vaddr[0] = instruction_pointer(regs);
 980                data = DATAOF_TRACE_ENTRY(entry, false);
 981        }
 982
 983        memcpy(data, ucb->buf, tu->tp.size + dsize);
 984
 985        event_trigger_unlock_commit(trace_file, buffer, event, entry, 0);
 986}
 987
 988/* uprobe handler */
 989static int uprobe_trace_func(struct trace_uprobe *tu, struct pt_regs *regs,
 990                             struct uprobe_cpu_buffer *ucb, int dsize)
 991{
 992        struct event_file_link *link;
 993
 994        if (is_ret_probe(tu))
 995                return 0;
 996
 997        rcu_read_lock();
 998        trace_probe_for_each_link_rcu(link, &tu->tp)
 999                __uprobe_trace_func(tu, 0, regs, ucb, dsize, link->file);
1000        rcu_read_unlock();
1001
1002        return 0;
1003}
1004
1005static void uretprobe_trace_func(struct trace_uprobe *tu, unsigned long func,
1006                                 struct pt_regs *regs,
1007                                 struct uprobe_cpu_buffer *ucb, int dsize)
1008{
1009        struct event_file_link *link;
1010
1011        rcu_read_lock();
1012        trace_probe_for_each_link_rcu(link, &tu->tp)
1013                __uprobe_trace_func(tu, func, regs, ucb, dsize, link->file);
1014        rcu_read_unlock();
1015}
1016
1017/* Event entry printers */
1018static enum print_line_t
1019print_uprobe_event(struct trace_iterator *iter, int flags, struct trace_event *event)
1020{
1021        struct uprobe_trace_entry_head *entry;
1022        struct trace_seq *s = &iter->seq;
1023        struct trace_uprobe *tu;
1024        u8 *data;
1025
1026        entry = (struct uprobe_trace_entry_head *)iter->ent;
1027        tu = trace_uprobe_primary_from_call(
1028                container_of(event, struct trace_event_call, event));
1029        if (unlikely(!tu))
1030                goto out;
1031
1032        if (is_ret_probe(tu)) {
1033                trace_seq_printf(s, "%s: (0x%lx <- 0x%lx)",
1034                                 trace_probe_name(&tu->tp),
1035                                 entry->vaddr[1], entry->vaddr[0]);
1036                data = DATAOF_TRACE_ENTRY(entry, true);
1037        } else {
1038                trace_seq_printf(s, "%s: (0x%lx)",
1039                                 trace_probe_name(&tu->tp),
1040                                 entry->vaddr[0]);
1041                data = DATAOF_TRACE_ENTRY(entry, false);
1042        }
1043
1044        if (print_probe_args(s, tu->tp.args, tu->tp.nr_args, data, entry) < 0)
1045                goto out;
1046
1047        trace_seq_putc(s, '\n');
1048
1049 out:
1050        return trace_handle_return(s);
1051}
1052
1053typedef bool (*filter_func_t)(struct uprobe_consumer *self,
1054                                enum uprobe_filter_ctx ctx,
1055                                struct mm_struct *mm);
1056
1057static int trace_uprobe_enable(struct trace_uprobe *tu, filter_func_t filter)
1058{
1059        int ret;
1060
1061        tu->consumer.filter = filter;
1062        tu->inode = d_real_inode(tu->path.dentry);
1063
1064        if (tu->ref_ctr_offset)
1065                ret = uprobe_register_refctr(tu->inode, tu->offset,
1066                                tu->ref_ctr_offset, &tu->consumer);
1067        else
1068                ret = uprobe_register(tu->inode, tu->offset, &tu->consumer);
1069
1070        if (ret)
1071                tu->inode = NULL;
1072
1073        return ret;
1074}
1075
1076static void __probe_event_disable(struct trace_probe *tp)
1077{
1078        struct trace_probe *pos;
1079        struct trace_uprobe *tu;
1080
1081        tu = container_of(tp, struct trace_uprobe, tp);
1082        WARN_ON(!uprobe_filter_is_empty(tu->tp.event->filter));
1083
1084        list_for_each_entry(pos, trace_probe_probe_list(tp), list) {
1085                tu = container_of(pos, struct trace_uprobe, tp);
1086                if (!tu->inode)
1087                        continue;
1088
1089                uprobe_unregister(tu->inode, tu->offset, &tu->consumer);
1090                tu->inode = NULL;
1091        }
1092}
1093
1094static int probe_event_enable(struct trace_event_call *call,
1095                        struct trace_event_file *file, filter_func_t filter)
1096{
1097        struct trace_probe *pos, *tp;
1098        struct trace_uprobe *tu;
1099        bool enabled;
1100        int ret;
1101
1102        tp = trace_probe_primary_from_call(call);
1103        if (WARN_ON_ONCE(!tp))
1104                return -ENODEV;
1105        enabled = trace_probe_is_enabled(tp);
1106
1107        /* This may also change "enabled" state */
1108        if (file) {
1109                if (trace_probe_test_flag(tp, TP_FLAG_PROFILE))
1110                        return -EINTR;
1111
1112                ret = trace_probe_add_file(tp, file);
1113                if (ret < 0)
1114                        return ret;
1115        } else {
1116                if (trace_probe_test_flag(tp, TP_FLAG_TRACE))
1117                        return -EINTR;
1118
1119                trace_probe_set_flag(tp, TP_FLAG_PROFILE);
1120        }
1121
1122        tu = container_of(tp, struct trace_uprobe, tp);
1123        WARN_ON(!uprobe_filter_is_empty(tu->tp.event->filter));
1124
1125        if (enabled)
1126                return 0;
1127
1128        ret = uprobe_buffer_enable();
1129        if (ret)
1130                goto err_flags;
1131
1132        list_for_each_entry(pos, trace_probe_probe_list(tp), list) {
1133                tu = container_of(pos, struct trace_uprobe, tp);
1134                ret = trace_uprobe_enable(tu, filter);
1135                if (ret) {
1136                        __probe_event_disable(tp);
1137                        goto err_buffer;
1138                }
1139        }
1140
1141        return 0;
1142
1143 err_buffer:
1144        uprobe_buffer_disable();
1145
1146 err_flags:
1147        if (file)
1148                trace_probe_remove_file(tp, file);
1149        else
1150                trace_probe_clear_flag(tp, TP_FLAG_PROFILE);
1151
1152        return ret;
1153}
1154
1155static void probe_event_disable(struct trace_event_call *call,
1156                                struct trace_event_file *file)
1157{
1158        struct trace_probe *tp;
1159
1160        tp = trace_probe_primary_from_call(call);
1161        if (WARN_ON_ONCE(!tp))
1162                return;
1163
1164        if (!trace_probe_is_enabled(tp))
1165                return;
1166
1167        if (file) {
1168                if (trace_probe_remove_file(tp, file) < 0)
1169                        return;
1170
1171                if (trace_probe_is_enabled(tp))
1172                        return;
1173        } else
1174                trace_probe_clear_flag(tp, TP_FLAG_PROFILE);
1175
1176        __probe_event_disable(tp);
1177        uprobe_buffer_disable();
1178}
1179
1180static int uprobe_event_define_fields(struct trace_event_call *event_call)
1181{
1182        int ret, size;
1183        struct uprobe_trace_entry_head field;
1184        struct trace_uprobe *tu;
1185
1186        tu = trace_uprobe_primary_from_call(event_call);
1187        if (unlikely(!tu))
1188                return -ENODEV;
1189
1190        if (is_ret_probe(tu)) {
1191                DEFINE_FIELD(unsigned long, vaddr[0], FIELD_STRING_FUNC, 0);
1192                DEFINE_FIELD(unsigned long, vaddr[1], FIELD_STRING_RETIP, 0);
1193                size = SIZEOF_TRACE_ENTRY(true);
1194        } else {
1195                DEFINE_FIELD(unsigned long, vaddr[0], FIELD_STRING_IP, 0);
1196                size = SIZEOF_TRACE_ENTRY(false);
1197        }
1198
1199        return traceprobe_define_arg_fields(event_call, size, &tu->tp);
1200}
1201
1202#ifdef CONFIG_PERF_EVENTS
1203static bool
1204__uprobe_perf_filter(struct trace_uprobe_filter *filter, struct mm_struct *mm)
1205{
1206        struct perf_event *event;
1207
1208        if (filter->nr_systemwide)
1209                return true;
1210
1211        list_for_each_entry(event, &filter->perf_events, hw.tp_list) {
1212                if (event->hw.target->mm == mm)
1213                        return true;
1214        }
1215
1216        return false;
1217}
1218
1219static inline bool
1220trace_uprobe_filter_event(struct trace_uprobe_filter *filter,
1221                          struct perf_event *event)
1222{
1223        return __uprobe_perf_filter(filter, event->hw.target->mm);
1224}
1225
1226static bool trace_uprobe_filter_remove(struct trace_uprobe_filter *filter,
1227                                       struct perf_event *event)
1228{
1229        bool done;
1230
1231        write_lock(&filter->rwlock);
1232        if (event->hw.target) {
1233                list_del(&event->hw.tp_list);
1234                done = filter->nr_systemwide ||
1235                        (event->hw.target->flags & PF_EXITING) ||
1236                        trace_uprobe_filter_event(filter, event);
1237        } else {
1238                filter->nr_systemwide--;
1239                done = filter->nr_systemwide;
1240        }
1241        write_unlock(&filter->rwlock);
1242
1243        return done;
1244}
1245
1246/* This returns true if the filter always covers target mm */
1247static bool trace_uprobe_filter_add(struct trace_uprobe_filter *filter,
1248                                    struct perf_event *event)
1249{
1250        bool done;
1251
1252        write_lock(&filter->rwlock);
1253        if (event->hw.target) {
1254                /*
1255                 * event->parent != NULL means copy_process(), we can avoid
1256                 * uprobe_apply(). current->mm must be probed and we can rely
1257                 * on dup_mmap() which preserves the already installed bp's.
1258                 *
1259                 * attr.enable_on_exec means that exec/mmap will install the
1260                 * breakpoints we need.
1261                 */
1262                done = filter->nr_systemwide ||
1263                        event->parent || event->attr.enable_on_exec ||
1264                        trace_uprobe_filter_event(filter, event);
1265                list_add(&event->hw.tp_list, &filter->perf_events);
1266        } else {
1267                done = filter->nr_systemwide;
1268                filter->nr_systemwide++;
1269        }
1270        write_unlock(&filter->rwlock);
1271
1272        return done;
1273}
1274
1275static int uprobe_perf_close(struct trace_event_call *call,
1276                             struct perf_event *event)
1277{
1278        struct trace_probe *pos, *tp;
1279        struct trace_uprobe *tu;
1280        int ret = 0;
1281
1282        tp = trace_probe_primary_from_call(call);
1283        if (WARN_ON_ONCE(!tp))
1284                return -ENODEV;
1285
1286        tu = container_of(tp, struct trace_uprobe, tp);
1287        if (trace_uprobe_filter_remove(tu->tp.event->filter, event))
1288                return 0;
1289
1290        list_for_each_entry(pos, trace_probe_probe_list(tp), list) {
1291                tu = container_of(pos, struct trace_uprobe, tp);
1292                ret = uprobe_apply(tu->inode, tu->offset, &tu->consumer, false);
1293                if (ret)
1294                        break;
1295        }
1296
1297        return ret;
1298}
1299
1300static int uprobe_perf_open(struct trace_event_call *call,
1301                            struct perf_event *event)
1302{
1303        struct trace_probe *pos, *tp;
1304        struct trace_uprobe *tu;
1305        int err = 0;
1306
1307        tp = trace_probe_primary_from_call(call);
1308        if (WARN_ON_ONCE(!tp))
1309                return -ENODEV;
1310
1311        tu = container_of(tp, struct trace_uprobe, tp);
1312        if (trace_uprobe_filter_add(tu->tp.event->filter, event))
1313                return 0;
1314
1315        list_for_each_entry(pos, trace_probe_probe_list(tp), list) {
1316                err = uprobe_apply(tu->inode, tu->offset, &tu->consumer, true);
1317                if (err) {
1318                        uprobe_perf_close(call, event);
1319                        break;
1320                }
1321        }
1322
1323        return err;
1324}
1325
1326static bool uprobe_perf_filter(struct uprobe_consumer *uc,
1327                                enum uprobe_filter_ctx ctx, struct mm_struct *mm)
1328{
1329        struct trace_uprobe_filter *filter;
1330        struct trace_uprobe *tu;
1331        int ret;
1332
1333        tu = container_of(uc, struct trace_uprobe, consumer);
1334        filter = tu->tp.event->filter;
1335
1336        read_lock(&filter->rwlock);
1337        ret = __uprobe_perf_filter(filter, mm);
1338        read_unlock(&filter->rwlock);
1339
1340        return ret;
1341}
1342
1343static void __uprobe_perf_func(struct trace_uprobe *tu,
1344                               unsigned long func, struct pt_regs *regs,
1345                               struct uprobe_cpu_buffer *ucb, int dsize)
1346{
1347        struct trace_event_call *call = trace_probe_event_call(&tu->tp);
1348        struct uprobe_trace_entry_head *entry;
1349        struct hlist_head *head;
1350        void *data;
1351        int size, esize;
1352        int rctx;
1353
1354        if (bpf_prog_array_valid(call)) {
1355                u32 ret;
1356
1357                preempt_disable();
1358                ret = trace_call_bpf(call, regs);
1359                preempt_enable();
1360                if (!ret)
1361                        return;
1362        }
1363
1364        esize = SIZEOF_TRACE_ENTRY(is_ret_probe(tu));
1365
1366        size = esize + tu->tp.size + dsize;
1367        size = ALIGN(size + sizeof(u32), sizeof(u64)) - sizeof(u32);
1368        if (WARN_ONCE(size > PERF_MAX_TRACE_SIZE, "profile buffer not large enough"))
1369                return;
1370
1371        preempt_disable();
1372        head = this_cpu_ptr(call->perf_events);
1373        if (hlist_empty(head))
1374                goto out;
1375
1376        entry = perf_trace_buf_alloc(size, NULL, &rctx);
1377        if (!entry)
1378                goto out;
1379
1380        if (is_ret_probe(tu)) {
1381                entry->vaddr[0] = func;
1382                entry->vaddr[1] = instruction_pointer(regs);
1383                data = DATAOF_TRACE_ENTRY(entry, true);
1384        } else {
1385                entry->vaddr[0] = instruction_pointer(regs);
1386                data = DATAOF_TRACE_ENTRY(entry, false);
1387        }
1388
1389        memcpy(data, ucb->buf, tu->tp.size + dsize);
1390
1391        if (size - esize > tu->tp.size + dsize) {
1392                int len = tu->tp.size + dsize;
1393
1394                memset(data + len, 0, size - esize - len);
1395        }
1396
1397        perf_trace_buf_submit(entry, size, rctx, call->event.type, 1, regs,
1398                              head, NULL);
1399 out:
1400        preempt_enable();
1401}
1402
1403/* uprobe profile handler */
1404static int uprobe_perf_func(struct trace_uprobe *tu, struct pt_regs *regs,
1405                            struct uprobe_cpu_buffer *ucb, int dsize)
1406{
1407        if (!uprobe_perf_filter(&tu->consumer, 0, current->mm))
1408                return UPROBE_HANDLER_REMOVE;
1409
1410        if (!is_ret_probe(tu))
1411                __uprobe_perf_func(tu, 0, regs, ucb, dsize);
1412        return 0;
1413}
1414
1415static void uretprobe_perf_func(struct trace_uprobe *tu, unsigned long func,
1416                                struct pt_regs *regs,
1417                                struct uprobe_cpu_buffer *ucb, int dsize)
1418{
1419        __uprobe_perf_func(tu, func, regs, ucb, dsize);
1420}
1421
1422int bpf_get_uprobe_info(const struct perf_event *event, u32 *fd_type,
1423                        const char **filename, u64 *probe_offset,
1424                        bool perf_type_tracepoint)
1425{
1426        const char *pevent = trace_event_name(event->tp_event);
1427        const char *group = event->tp_event->class->system;
1428        struct trace_uprobe *tu;
1429
1430        if (perf_type_tracepoint)
1431                tu = find_probe_event(pevent, group);
1432        else
1433                tu = trace_uprobe_primary_from_call(event->tp_event);
1434        if (!tu)
1435                return -EINVAL;
1436
1437        *fd_type = is_ret_probe(tu) ? BPF_FD_TYPE_URETPROBE
1438                                    : BPF_FD_TYPE_UPROBE;
1439        *filename = tu->filename;
1440        *probe_offset = tu->offset;
1441        return 0;
1442}
1443#endif  /* CONFIG_PERF_EVENTS */
1444
1445static int
1446trace_uprobe_register(struct trace_event_call *event, enum trace_reg type,
1447                      void *data)
1448{
1449        struct trace_event_file *file = data;
1450
1451        switch (type) {
1452        case TRACE_REG_REGISTER:
1453                return probe_event_enable(event, file, NULL);
1454
1455        case TRACE_REG_UNREGISTER:
1456                probe_event_disable(event, file);
1457                return 0;
1458
1459#ifdef CONFIG_PERF_EVENTS
1460        case TRACE_REG_PERF_REGISTER:
1461                return probe_event_enable(event, NULL, uprobe_perf_filter);
1462
1463        case TRACE_REG_PERF_UNREGISTER:
1464                probe_event_disable(event, NULL);
1465                return 0;
1466
1467        case TRACE_REG_PERF_OPEN:
1468                return uprobe_perf_open(event, data);
1469
1470        case TRACE_REG_PERF_CLOSE:
1471                return uprobe_perf_close(event, data);
1472
1473#endif
1474        default:
1475                return 0;
1476        }
1477}
1478
1479static int uprobe_dispatcher(struct uprobe_consumer *con, struct pt_regs *regs)
1480{
1481        struct trace_uprobe *tu;
1482        struct uprobe_dispatch_data udd;
1483        struct uprobe_cpu_buffer *ucb;
1484        int dsize, esize;
1485        int ret = 0;
1486
1487
1488        tu = container_of(con, struct trace_uprobe, consumer);
1489        tu->nhit++;
1490
1491        udd.tu = tu;
1492        udd.bp_addr = instruction_pointer(regs);
1493
1494        current->utask->vaddr = (unsigned long) &udd;
1495
1496        if (WARN_ON_ONCE(!uprobe_cpu_buffer))
1497                return 0;
1498
1499        dsize = __get_data_size(&tu->tp, regs);
1500        esize = SIZEOF_TRACE_ENTRY(is_ret_probe(tu));
1501
1502        ucb = uprobe_buffer_get();
1503        store_trace_args(ucb->buf, &tu->tp, regs, esize, dsize);
1504
1505        if (trace_probe_test_flag(&tu->tp, TP_FLAG_TRACE))
1506                ret |= uprobe_trace_func(tu, regs, ucb, dsize);
1507
1508#ifdef CONFIG_PERF_EVENTS
1509        if (trace_probe_test_flag(&tu->tp, TP_FLAG_PROFILE))
1510                ret |= uprobe_perf_func(tu, regs, ucb, dsize);
1511#endif
1512        uprobe_buffer_put(ucb);
1513        return ret;
1514}
1515
1516static int uretprobe_dispatcher(struct uprobe_consumer *con,
1517                                unsigned long func, struct pt_regs *regs)
1518{
1519        struct trace_uprobe *tu;
1520        struct uprobe_dispatch_data udd;
1521        struct uprobe_cpu_buffer *ucb;
1522        int dsize, esize;
1523
1524        tu = container_of(con, struct trace_uprobe, consumer);
1525
1526        udd.tu = tu;
1527        udd.bp_addr = func;
1528
1529        current->utask->vaddr = (unsigned long) &udd;
1530
1531        if (WARN_ON_ONCE(!uprobe_cpu_buffer))
1532                return 0;
1533
1534        dsize = __get_data_size(&tu->tp, regs);
1535        esize = SIZEOF_TRACE_ENTRY(is_ret_probe(tu));
1536
1537        ucb = uprobe_buffer_get();
1538        store_trace_args(ucb->buf, &tu->tp, regs, esize, dsize);
1539
1540        if (trace_probe_test_flag(&tu->tp, TP_FLAG_TRACE))
1541                uretprobe_trace_func(tu, func, regs, ucb, dsize);
1542
1543#ifdef CONFIG_PERF_EVENTS
1544        if (trace_probe_test_flag(&tu->tp, TP_FLAG_PROFILE))
1545                uretprobe_perf_func(tu, func, regs, ucb, dsize);
1546#endif
1547        uprobe_buffer_put(ucb);
1548        return 0;
1549}
1550
1551static struct trace_event_functions uprobe_funcs = {
1552        .trace          = print_uprobe_event
1553};
1554
1555static struct trace_event_fields uprobe_fields_array[] = {
1556        { .type = TRACE_FUNCTION_TYPE,
1557          .define_fields = uprobe_event_define_fields },
1558        {}
1559};
1560
1561static inline void init_trace_event_call(struct trace_uprobe *tu)
1562{
1563        struct trace_event_call *call = trace_probe_event_call(&tu->tp);
1564        call->event.funcs = &uprobe_funcs;
1565        call->class->fields_array = uprobe_fields_array;
1566
1567        call->flags = TRACE_EVENT_FL_UPROBE | TRACE_EVENT_FL_CAP_ANY;
1568        call->class->reg = trace_uprobe_register;
1569}
1570
1571static int register_uprobe_event(struct trace_uprobe *tu)
1572{
1573        init_trace_event_call(tu);
1574
1575        return trace_probe_register_event_call(&tu->tp);
1576}
1577
1578static int unregister_uprobe_event(struct trace_uprobe *tu)
1579{
1580        return trace_probe_unregister_event_call(&tu->tp);
1581}
1582
1583#ifdef CONFIG_PERF_EVENTS
1584struct trace_event_call *
1585create_local_trace_uprobe(char *name, unsigned long offs,
1586                          unsigned long ref_ctr_offset, bool is_return)
1587{
1588        struct trace_uprobe *tu;
1589        struct path path;
1590        int ret;
1591
1592        ret = kern_path(name, LOOKUP_FOLLOW, &path);
1593        if (ret)
1594                return ERR_PTR(ret);
1595
1596        if (!d_is_reg(path.dentry)) {
1597                path_put(&path);
1598                return ERR_PTR(-EINVAL);
1599        }
1600
1601        /*
1602         * local trace_kprobes are not added to dyn_event, so they are never
1603         * searched in find_trace_kprobe(). Therefore, there is no concern of
1604         * duplicated name "DUMMY_EVENT" here.
1605         */
1606        tu = alloc_trace_uprobe(UPROBE_EVENT_SYSTEM, "DUMMY_EVENT", 0,
1607                                is_return);
1608
1609        if (IS_ERR(tu)) {
1610                pr_info("Failed to allocate trace_uprobe.(%d)\n",
1611                        (int)PTR_ERR(tu));
1612                path_put(&path);
1613                return ERR_CAST(tu);
1614        }
1615
1616        tu->offset = offs;
1617        tu->path = path;
1618        tu->ref_ctr_offset = ref_ctr_offset;
1619        tu->filename = kstrdup(name, GFP_KERNEL);
1620        init_trace_event_call(tu);
1621
1622        if (traceprobe_set_print_fmt(&tu->tp, is_ret_probe(tu)) < 0) {
1623                ret = -ENOMEM;
1624                goto error;
1625        }
1626
1627        return trace_probe_event_call(&tu->tp);
1628error:
1629        free_trace_uprobe(tu);
1630        return ERR_PTR(ret);
1631}
1632
1633void destroy_local_trace_uprobe(struct trace_event_call *event_call)
1634{
1635        struct trace_uprobe *tu;
1636
1637        tu = trace_uprobe_primary_from_call(event_call);
1638
1639        free_trace_uprobe(tu);
1640}
1641#endif /* CONFIG_PERF_EVENTS */
1642
1643/* Make a trace interface for controlling probe points */
1644static __init int init_uprobe_trace(void)
1645{
1646        int ret;
1647
1648        ret = dyn_event_register(&trace_uprobe_ops);
1649        if (ret)
1650                return ret;
1651
1652        ret = tracing_init_dentry();
1653        if (ret)
1654                return 0;
1655
1656        trace_create_file("uprobe_events", 0644, NULL,
1657                                    NULL, &uprobe_events_ops);
1658        /* Profile interface */
1659        trace_create_file("uprobe_profile", 0444, NULL,
1660                                    NULL, &uprobe_profile_ops);
1661        return 0;
1662}
1663
1664fs_initcall(init_uprobe_trace);
1665