linux/tools/perf/builtin-script.c
<<
>>
Prefs
   1#include "builtin.h"
   2
   3#include "perf.h"
   4#include "util/cache.h"
   5#include "util/debug.h"
   6#include <subcmd/exec-cmd.h>
   7#include "util/header.h"
   8#include <subcmd/parse-options.h>
   9#include "util/perf_regs.h"
  10#include "util/session.h"
  11#include "util/tool.h"
  12#include "util/symbol.h"
  13#include "util/thread.h"
  14#include "util/trace-event.h"
  15#include "util/util.h"
  16#include "util/evlist.h"
  17#include "util/evsel.h"
  18#include "util/sort.h"
  19#include "util/data.h"
  20#include "util/auxtrace.h"
  21#include "util/cpumap.h"
  22#include "util/thread_map.h"
  23#include "util/stat.h"
  24#include "util/thread-stack.h"
  25#include <linux/bitmap.h>
  26#include <linux/stringify.h>
  27#include "asm/bug.h"
  28#include "util/mem-events.h"
  29
  30static char const               *script_name;
  31static char const               *generate_script_lang;
  32static bool                     debug_mode;
  33static u64                      last_timestamp;
  34static u64                      nr_unordered;
  35static bool                     no_callchain;
  36static bool                     latency_format;
  37static bool                     system_wide;
  38static bool                     print_flags;
  39static bool                     nanosecs;
  40static const char               *cpu_list;
  41static DECLARE_BITMAP(cpu_bitmap, MAX_NR_CPUS);
  42static struct perf_stat_config  stat_config;
  43
  44unsigned int scripting_max_stack = PERF_MAX_STACK_DEPTH;
  45
  46enum perf_output_field {
  47        PERF_OUTPUT_COMM            = 1U << 0,
  48        PERF_OUTPUT_TID             = 1U << 1,
  49        PERF_OUTPUT_PID             = 1U << 2,
  50        PERF_OUTPUT_TIME            = 1U << 3,
  51        PERF_OUTPUT_CPU             = 1U << 4,
  52        PERF_OUTPUT_EVNAME          = 1U << 5,
  53        PERF_OUTPUT_TRACE           = 1U << 6,
  54        PERF_OUTPUT_IP              = 1U << 7,
  55        PERF_OUTPUT_SYM             = 1U << 8,
  56        PERF_OUTPUT_DSO             = 1U << 9,
  57        PERF_OUTPUT_ADDR            = 1U << 10,
  58        PERF_OUTPUT_SYMOFFSET       = 1U << 11,
  59        PERF_OUTPUT_SRCLINE         = 1U << 12,
  60        PERF_OUTPUT_PERIOD          = 1U << 13,
  61        PERF_OUTPUT_IREGS           = 1U << 14,
  62        PERF_OUTPUT_BRSTACK         = 1U << 15,
  63        PERF_OUTPUT_BRSTACKSYM      = 1U << 16,
  64        PERF_OUTPUT_DATA_SRC        = 1U << 17,
  65        PERF_OUTPUT_WEIGHT          = 1U << 18,
  66        PERF_OUTPUT_BPF_OUTPUT      = 1U << 19,
  67        PERF_OUTPUT_CALLINDENT      = 1U << 20,
  68};
  69
  70struct output_option {
  71        const char *str;
  72        enum perf_output_field field;
  73} all_output_options[] = {
  74        {.str = "comm",  .field = PERF_OUTPUT_COMM},
  75        {.str = "tid",   .field = PERF_OUTPUT_TID},
  76        {.str = "pid",   .field = PERF_OUTPUT_PID},
  77        {.str = "time",  .field = PERF_OUTPUT_TIME},
  78        {.str = "cpu",   .field = PERF_OUTPUT_CPU},
  79        {.str = "event", .field = PERF_OUTPUT_EVNAME},
  80        {.str = "trace", .field = PERF_OUTPUT_TRACE},
  81        {.str = "ip",    .field = PERF_OUTPUT_IP},
  82        {.str = "sym",   .field = PERF_OUTPUT_SYM},
  83        {.str = "dso",   .field = PERF_OUTPUT_DSO},
  84        {.str = "addr",  .field = PERF_OUTPUT_ADDR},
  85        {.str = "symoff", .field = PERF_OUTPUT_SYMOFFSET},
  86        {.str = "srcline", .field = PERF_OUTPUT_SRCLINE},
  87        {.str = "period", .field = PERF_OUTPUT_PERIOD},
  88        {.str = "iregs", .field = PERF_OUTPUT_IREGS},
  89        {.str = "brstack", .field = PERF_OUTPUT_BRSTACK},
  90        {.str = "brstacksym", .field = PERF_OUTPUT_BRSTACKSYM},
  91        {.str = "data_src", .field = PERF_OUTPUT_DATA_SRC},
  92        {.str = "weight",   .field = PERF_OUTPUT_WEIGHT},
  93        {.str = "bpf-output",   .field = PERF_OUTPUT_BPF_OUTPUT},
  94        {.str = "callindent", .field = PERF_OUTPUT_CALLINDENT},
  95};
  96
  97/* default set to maintain compatibility with current format */
  98static struct {
  99        bool user_set;
 100        bool wildcard_set;
 101        unsigned int print_ip_opts;
 102        u64 fields;
 103        u64 invalid_fields;
 104} output[PERF_TYPE_MAX] = {
 105
 106        [PERF_TYPE_HARDWARE] = {
 107                .user_set = false,
 108
 109                .fields = PERF_OUTPUT_COMM | PERF_OUTPUT_TID |
 110                              PERF_OUTPUT_CPU | PERF_OUTPUT_TIME |
 111                              PERF_OUTPUT_EVNAME | PERF_OUTPUT_IP |
 112                              PERF_OUTPUT_SYM | PERF_OUTPUT_DSO |
 113                              PERF_OUTPUT_PERIOD,
 114
 115                .invalid_fields = PERF_OUTPUT_TRACE | PERF_OUTPUT_BPF_OUTPUT,
 116        },
 117
 118        [PERF_TYPE_SOFTWARE] = {
 119                .user_set = false,
 120
 121                .fields = PERF_OUTPUT_COMM | PERF_OUTPUT_TID |
 122                              PERF_OUTPUT_CPU | PERF_OUTPUT_TIME |
 123                              PERF_OUTPUT_EVNAME | PERF_OUTPUT_IP |
 124                              PERF_OUTPUT_SYM | PERF_OUTPUT_DSO |
 125                              PERF_OUTPUT_PERIOD | PERF_OUTPUT_BPF_OUTPUT,
 126
 127                .invalid_fields = PERF_OUTPUT_TRACE,
 128        },
 129
 130        [PERF_TYPE_TRACEPOINT] = {
 131                .user_set = false,
 132
 133                .fields = PERF_OUTPUT_COMM | PERF_OUTPUT_TID |
 134                                  PERF_OUTPUT_CPU | PERF_OUTPUT_TIME |
 135                                  PERF_OUTPUT_EVNAME | PERF_OUTPUT_TRACE
 136        },
 137
 138        [PERF_TYPE_RAW] = {
 139                .user_set = false,
 140
 141                .fields = PERF_OUTPUT_COMM | PERF_OUTPUT_TID |
 142                              PERF_OUTPUT_CPU | PERF_OUTPUT_TIME |
 143                              PERF_OUTPUT_EVNAME | PERF_OUTPUT_IP |
 144                              PERF_OUTPUT_SYM | PERF_OUTPUT_DSO |
 145                              PERF_OUTPUT_PERIOD |  PERF_OUTPUT_ADDR |
 146                              PERF_OUTPUT_DATA_SRC | PERF_OUTPUT_WEIGHT,
 147
 148                .invalid_fields = PERF_OUTPUT_TRACE | PERF_OUTPUT_BPF_OUTPUT,
 149        },
 150
 151        [PERF_TYPE_BREAKPOINT] = {
 152                .user_set = false,
 153
 154                .fields = PERF_OUTPUT_COMM | PERF_OUTPUT_TID |
 155                              PERF_OUTPUT_CPU | PERF_OUTPUT_TIME |
 156                              PERF_OUTPUT_EVNAME | PERF_OUTPUT_IP |
 157                              PERF_OUTPUT_SYM | PERF_OUTPUT_DSO |
 158                              PERF_OUTPUT_PERIOD,
 159
 160                .invalid_fields = PERF_OUTPUT_TRACE | PERF_OUTPUT_BPF_OUTPUT,
 161        },
 162};
 163
 164static bool output_set_by_user(void)
 165{
 166        int j;
 167        for (j = 0; j < PERF_TYPE_MAX; ++j) {
 168                if (output[j].user_set)
 169                        return true;
 170        }
 171        return false;
 172}
 173
 174static const char *output_field2str(enum perf_output_field field)
 175{
 176        int i, imax = ARRAY_SIZE(all_output_options);
 177        const char *str = "";
 178
 179        for (i = 0; i < imax; ++i) {
 180                if (all_output_options[i].field == field) {
 181                        str = all_output_options[i].str;
 182                        break;
 183                }
 184        }
 185        return str;
 186}
 187
 188#define PRINT_FIELD(x)  (output[attr->type].fields & PERF_OUTPUT_##x)
 189
 190static int perf_evsel__do_check_stype(struct perf_evsel *evsel,
 191                                      u64 sample_type, const char *sample_msg,
 192                                      enum perf_output_field field,
 193                                      bool allow_user_set)
 194{
 195        struct perf_event_attr *attr = &evsel->attr;
 196        int type = attr->type;
 197        const char *evname;
 198
 199        if (attr->sample_type & sample_type)
 200                return 0;
 201
 202        if (output[type].user_set) {
 203                if (allow_user_set)
 204                        return 0;
 205                evname = perf_evsel__name(evsel);
 206                pr_err("Samples for '%s' event do not have %s attribute set. "
 207                       "Cannot print '%s' field.\n",
 208                       evname, sample_msg, output_field2str(field));
 209                return -1;
 210        }
 211
 212        /* user did not ask for it explicitly so remove from the default list */
 213        output[type].fields &= ~field;
 214        evname = perf_evsel__name(evsel);
 215        pr_debug("Samples for '%s' event do not have %s attribute set. "
 216                 "Skipping '%s' field.\n",
 217                 evname, sample_msg, output_field2str(field));
 218
 219        return 0;
 220}
 221
 222static int perf_evsel__check_stype(struct perf_evsel *evsel,
 223                                   u64 sample_type, const char *sample_msg,
 224                                   enum perf_output_field field)
 225{
 226        return perf_evsel__do_check_stype(evsel, sample_type, sample_msg, field,
 227                                          false);
 228}
 229
 230static int perf_evsel__check_attr(struct perf_evsel *evsel,
 231                                  struct perf_session *session)
 232{
 233        struct perf_event_attr *attr = &evsel->attr;
 234        bool allow_user_set;
 235
 236        if (perf_header__has_feat(&session->header, HEADER_STAT))
 237                return 0;
 238
 239        allow_user_set = perf_header__has_feat(&session->header,
 240                                               HEADER_AUXTRACE);
 241
 242        if (PRINT_FIELD(TRACE) &&
 243                !perf_session__has_traces(session, "record -R"))
 244                return -EINVAL;
 245
 246        if (PRINT_FIELD(IP)) {
 247                if (perf_evsel__check_stype(evsel, PERF_SAMPLE_IP, "IP",
 248                                            PERF_OUTPUT_IP))
 249                        return -EINVAL;
 250        }
 251
 252        if (PRINT_FIELD(ADDR) &&
 253                perf_evsel__do_check_stype(evsel, PERF_SAMPLE_ADDR, "ADDR",
 254                                           PERF_OUTPUT_ADDR, allow_user_set))
 255                return -EINVAL;
 256
 257        if (PRINT_FIELD(DATA_SRC) &&
 258                perf_evsel__check_stype(evsel, PERF_SAMPLE_DATA_SRC, "DATA_SRC",
 259                                        PERF_OUTPUT_DATA_SRC))
 260                return -EINVAL;
 261
 262        if (PRINT_FIELD(WEIGHT) &&
 263                perf_evsel__check_stype(evsel, PERF_SAMPLE_WEIGHT, "WEIGHT",
 264                                        PERF_OUTPUT_WEIGHT))
 265                return -EINVAL;
 266
 267        if (PRINT_FIELD(SYM) && !PRINT_FIELD(IP) && !PRINT_FIELD(ADDR)) {
 268                pr_err("Display of symbols requested but neither sample IP nor "
 269                           "sample address\nis selected. Hence, no addresses to convert "
 270                       "to symbols.\n");
 271                return -EINVAL;
 272        }
 273        if (PRINT_FIELD(SYMOFFSET) && !PRINT_FIELD(SYM)) {
 274                pr_err("Display of offsets requested but symbol is not"
 275                       "selected.\n");
 276                return -EINVAL;
 277        }
 278        if (PRINT_FIELD(DSO) && !PRINT_FIELD(IP) && !PRINT_FIELD(ADDR)) {
 279                pr_err("Display of DSO requested but neither sample IP nor "
 280                           "sample address\nis selected. Hence, no addresses to convert "
 281                       "to DSO.\n");
 282                return -EINVAL;
 283        }
 284        if (PRINT_FIELD(SRCLINE) && !PRINT_FIELD(IP)) {
 285                pr_err("Display of source line number requested but sample IP is not\n"
 286                       "selected. Hence, no address to lookup the source line number.\n");
 287                return -EINVAL;
 288        }
 289
 290        if ((PRINT_FIELD(PID) || PRINT_FIELD(TID)) &&
 291                perf_evsel__check_stype(evsel, PERF_SAMPLE_TID, "TID",
 292                                        PERF_OUTPUT_TID|PERF_OUTPUT_PID))
 293                return -EINVAL;
 294
 295        if (PRINT_FIELD(TIME) &&
 296                perf_evsel__check_stype(evsel, PERF_SAMPLE_TIME, "TIME",
 297                                        PERF_OUTPUT_TIME))
 298                return -EINVAL;
 299
 300        if (PRINT_FIELD(CPU) &&
 301                perf_evsel__do_check_stype(evsel, PERF_SAMPLE_CPU, "CPU",
 302                                           PERF_OUTPUT_CPU, allow_user_set))
 303                return -EINVAL;
 304
 305        if (PRINT_FIELD(PERIOD) &&
 306                perf_evsel__check_stype(evsel, PERF_SAMPLE_PERIOD, "PERIOD",
 307                                        PERF_OUTPUT_PERIOD))
 308                return -EINVAL;
 309
 310        if (PRINT_FIELD(IREGS) &&
 311                perf_evsel__check_stype(evsel, PERF_SAMPLE_REGS_INTR, "IREGS",
 312                                        PERF_OUTPUT_IREGS))
 313                return -EINVAL;
 314
 315        return 0;
 316}
 317
 318static void set_print_ip_opts(struct perf_event_attr *attr)
 319{
 320        unsigned int type = attr->type;
 321
 322        output[type].print_ip_opts = 0;
 323        if (PRINT_FIELD(IP))
 324                output[type].print_ip_opts |= EVSEL__PRINT_IP;
 325
 326        if (PRINT_FIELD(SYM))
 327                output[type].print_ip_opts |= EVSEL__PRINT_SYM;
 328
 329        if (PRINT_FIELD(DSO))
 330                output[type].print_ip_opts |= EVSEL__PRINT_DSO;
 331
 332        if (PRINT_FIELD(SYMOFFSET))
 333                output[type].print_ip_opts |= EVSEL__PRINT_SYMOFFSET;
 334
 335        if (PRINT_FIELD(SRCLINE))
 336                output[type].print_ip_opts |= EVSEL__PRINT_SRCLINE;
 337}
 338
 339/*
 340 * verify all user requested events exist and the samples
 341 * have the expected data
 342 */
 343static int perf_session__check_output_opt(struct perf_session *session)
 344{
 345        unsigned int j;
 346        struct perf_evsel *evsel;
 347
 348        for (j = 0; j < PERF_TYPE_MAX; ++j) {
 349                evsel = perf_session__find_first_evtype(session, j);
 350
 351                /*
 352                 * even if fields is set to 0 (ie., show nothing) event must
 353                 * exist if user explicitly includes it on the command line
 354                 */
 355                if (!evsel && output[j].user_set && !output[j].wildcard_set) {
 356                        pr_err("%s events do not exist. "
 357                               "Remove corresponding -f option to proceed.\n",
 358                               event_type(j));
 359                        return -1;
 360                }
 361
 362                if (evsel && output[j].fields &&
 363                        perf_evsel__check_attr(evsel, session))
 364                        return -1;
 365
 366                if (evsel == NULL)
 367                        continue;
 368
 369                set_print_ip_opts(&evsel->attr);
 370        }
 371
 372        if (!no_callchain) {
 373                bool use_callchain = false;
 374                bool not_pipe = false;
 375
 376                evlist__for_each_entry(session->evlist, evsel) {
 377                        not_pipe = true;
 378                        if (evsel->attr.sample_type & PERF_SAMPLE_CALLCHAIN) {
 379                                use_callchain = true;
 380                                break;
 381                        }
 382                }
 383                if (not_pipe && !use_callchain)
 384                        symbol_conf.use_callchain = false;
 385        }
 386
 387        /*
 388         * set default for tracepoints to print symbols only
 389         * if callchains are present
 390         */
 391        if (symbol_conf.use_callchain &&
 392            !output[PERF_TYPE_TRACEPOINT].user_set) {
 393                struct perf_event_attr *attr;
 394
 395                j = PERF_TYPE_TRACEPOINT;
 396
 397                evlist__for_each_entry(session->evlist, evsel) {
 398                        if (evsel->attr.type != j)
 399                                continue;
 400
 401                        attr = &evsel->attr;
 402
 403                        if (attr->sample_type & PERF_SAMPLE_CALLCHAIN) {
 404                                output[j].fields |= PERF_OUTPUT_IP;
 405                                output[j].fields |= PERF_OUTPUT_SYM;
 406                                output[j].fields |= PERF_OUTPUT_DSO;
 407                                set_print_ip_opts(attr);
 408                                goto out;
 409                        }
 410                }
 411        }
 412
 413out:
 414        return 0;
 415}
 416
 417static void print_sample_iregs(struct perf_sample *sample,
 418                          struct perf_event_attr *attr)
 419{
 420        struct regs_dump *regs = &sample->intr_regs;
 421        uint64_t mask = attr->sample_regs_intr;
 422        unsigned i = 0, r;
 423
 424        if (!regs)
 425                return;
 426
 427        for_each_set_bit(r, (unsigned long *) &mask, sizeof(mask) * 8) {
 428                u64 val = regs->regs[i++];
 429                printf("%5s:0x%"PRIx64" ", perf_reg_name(r), val);
 430        }
 431}
 432
 433static void print_sample_start(struct perf_sample *sample,
 434                               struct thread *thread,
 435                               struct perf_evsel *evsel)
 436{
 437        struct perf_event_attr *attr = &evsel->attr;
 438        unsigned long secs;
 439        unsigned long usecs;
 440        unsigned long long nsecs;
 441
 442        if (PRINT_FIELD(COMM)) {
 443                if (latency_format)
 444                        printf("%8.8s ", thread__comm_str(thread));
 445                else if (PRINT_FIELD(IP) && symbol_conf.use_callchain)
 446                        printf("%s ", thread__comm_str(thread));
 447                else
 448                        printf("%16s ", thread__comm_str(thread));
 449        }
 450
 451        if (PRINT_FIELD(PID) && PRINT_FIELD(TID))
 452                printf("%5d/%-5d ", sample->pid, sample->tid);
 453        else if (PRINT_FIELD(PID))
 454                printf("%5d ", sample->pid);
 455        else if (PRINT_FIELD(TID))
 456                printf("%5d ", sample->tid);
 457
 458        if (PRINT_FIELD(CPU)) {
 459                if (latency_format)
 460                        printf("%3d ", sample->cpu);
 461                else
 462                        printf("[%03d] ", sample->cpu);
 463        }
 464
 465        if (PRINT_FIELD(TIME)) {
 466                nsecs = sample->time;
 467                secs = nsecs / NSECS_PER_SEC;
 468                nsecs -= secs * NSECS_PER_SEC;
 469                usecs = nsecs / NSECS_PER_USEC;
 470                if (nanosecs)
 471                        printf("%5lu.%09llu: ", secs, nsecs);
 472                else
 473                        printf("%5lu.%06lu: ", secs, usecs);
 474        }
 475}
 476
 477static inline char
 478mispred_str(struct branch_entry *br)
 479{
 480        if (!(br->flags.mispred  || br->flags.predicted))
 481                return '-';
 482
 483        return br->flags.predicted ? 'P' : 'M';
 484}
 485
 486static void print_sample_brstack(struct perf_sample *sample)
 487{
 488        struct branch_stack *br = sample->branch_stack;
 489        u64 i;
 490
 491        if (!(br && br->nr))
 492                return;
 493
 494        for (i = 0; i < br->nr; i++) {
 495                printf(" 0x%"PRIx64"/0x%"PRIx64"/%c/%c/%c/%d ",
 496                        br->entries[i].from,
 497                        br->entries[i].to,
 498                        mispred_str( br->entries + i),
 499                        br->entries[i].flags.in_tx? 'X' : '-',
 500                        br->entries[i].flags.abort? 'A' : '-',
 501                        br->entries[i].flags.cycles);
 502        }
 503}
 504
 505static void print_sample_brstacksym(struct perf_sample *sample,
 506                                    struct thread *thread)
 507{
 508        struct branch_stack *br = sample->branch_stack;
 509        struct addr_location alf, alt;
 510        u64 i, from, to;
 511
 512        if (!(br && br->nr))
 513                return;
 514
 515        for (i = 0; i < br->nr; i++) {
 516
 517                memset(&alf, 0, sizeof(alf));
 518                memset(&alt, 0, sizeof(alt));
 519                from = br->entries[i].from;
 520                to   = br->entries[i].to;
 521
 522                thread__find_addr_map(thread, sample->cpumode, MAP__FUNCTION, from, &alf);
 523                if (alf.map)
 524                        alf.sym = map__find_symbol(alf.map, alf.addr, NULL);
 525
 526                thread__find_addr_map(thread, sample->cpumode, MAP__FUNCTION, to, &alt);
 527                if (alt.map)
 528                        alt.sym = map__find_symbol(alt.map, alt.addr, NULL);
 529
 530                symbol__fprintf_symname_offs(alf.sym, &alf, stdout);
 531                putchar('/');
 532                symbol__fprintf_symname_offs(alt.sym, &alt, stdout);
 533                printf("/%c/%c/%c/%d ",
 534                        mispred_str( br->entries + i),
 535                        br->entries[i].flags.in_tx? 'X' : '-',
 536                        br->entries[i].flags.abort? 'A' : '-',
 537                        br->entries[i].flags.cycles);
 538        }
 539}
 540
 541
 542static void print_sample_addr(struct perf_sample *sample,
 543                          struct thread *thread,
 544                          struct perf_event_attr *attr)
 545{
 546        struct addr_location al;
 547
 548        printf("%16" PRIx64, sample->addr);
 549
 550        if (!sample_addr_correlates_sym(attr))
 551                return;
 552
 553        thread__resolve(thread, &al, sample);
 554
 555        if (PRINT_FIELD(SYM)) {
 556                printf(" ");
 557                if (PRINT_FIELD(SYMOFFSET))
 558                        symbol__fprintf_symname_offs(al.sym, &al, stdout);
 559                else
 560                        symbol__fprintf_symname(al.sym, stdout);
 561        }
 562
 563        if (PRINT_FIELD(DSO)) {
 564                printf(" (");
 565                map__fprintf_dsoname(al.map, stdout);
 566                printf(")");
 567        }
 568}
 569
 570static void print_sample_callindent(struct perf_sample *sample,
 571                                    struct perf_evsel *evsel,
 572                                    struct thread *thread,
 573                                    struct addr_location *al)
 574{
 575        struct perf_event_attr *attr = &evsel->attr;
 576        size_t depth = thread_stack__depth(thread);
 577        struct addr_location addr_al;
 578        const char *name = NULL;
 579        static int spacing;
 580        int len = 0;
 581        u64 ip = 0;
 582
 583        /*
 584         * The 'return' has already been popped off the stack so the depth has
 585         * to be adjusted to match the 'call'.
 586         */
 587        if (thread->ts && sample->flags & PERF_IP_FLAG_RETURN)
 588                depth += 1;
 589
 590        if (sample->flags & (PERF_IP_FLAG_CALL | PERF_IP_FLAG_TRACE_BEGIN)) {
 591                if (sample_addr_correlates_sym(attr)) {
 592                        thread__resolve(thread, &addr_al, sample);
 593                        if (addr_al.sym)
 594                                name = addr_al.sym->name;
 595                        else
 596                                ip = sample->addr;
 597                } else {
 598                        ip = sample->addr;
 599                }
 600        } else if (sample->flags & (PERF_IP_FLAG_RETURN | PERF_IP_FLAG_TRACE_END)) {
 601                if (al->sym)
 602                        name = al->sym->name;
 603                else
 604                        ip = sample->ip;
 605        }
 606
 607        if (name)
 608                len = printf("%*s%s", (int)depth * 4, "", name);
 609        else if (ip)
 610                len = printf("%*s%16" PRIx64, (int)depth * 4, "", ip);
 611
 612        if (len < 0)
 613                return;
 614
 615        /*
 616         * Try to keep the output length from changing frequently so that the
 617         * output lines up more nicely.
 618         */
 619        if (len > spacing || (len && len < spacing - 52))
 620                spacing = round_up(len + 4, 32);
 621
 622        if (len < spacing)
 623                printf("%*s", spacing - len, "");
 624}
 625
 626static void print_sample_bts(struct perf_sample *sample,
 627                             struct perf_evsel *evsel,
 628                             struct thread *thread,
 629                             struct addr_location *al)
 630{
 631        struct perf_event_attr *attr = &evsel->attr;
 632        bool print_srcline_last = false;
 633
 634        if (PRINT_FIELD(CALLINDENT))
 635                print_sample_callindent(sample, evsel, thread, al);
 636
 637        /* print branch_from information */
 638        if (PRINT_FIELD(IP)) {
 639                unsigned int print_opts = output[attr->type].print_ip_opts;
 640                struct callchain_cursor *cursor = NULL;
 641
 642                if (symbol_conf.use_callchain && sample->callchain &&
 643                    thread__resolve_callchain(al->thread, &callchain_cursor, evsel,
 644                                              sample, NULL, NULL, scripting_max_stack) == 0)
 645                        cursor = &callchain_cursor;
 646
 647                if (cursor == NULL) {
 648                        putchar(' ');
 649                        if (print_opts & EVSEL__PRINT_SRCLINE) {
 650                                print_srcline_last = true;
 651                                print_opts &= ~EVSEL__PRINT_SRCLINE;
 652                        }
 653                } else
 654                        putchar('\n');
 655
 656                sample__fprintf_sym(sample, al, 0, print_opts, cursor, stdout);
 657        }
 658
 659        /* print branch_to information */
 660        if (PRINT_FIELD(ADDR) ||
 661            ((evsel->attr.sample_type & PERF_SAMPLE_ADDR) &&
 662             !output[attr->type].user_set)) {
 663                printf(" => ");
 664                print_sample_addr(sample, thread, attr);
 665        }
 666
 667        if (print_srcline_last)
 668                map__fprintf_srcline(al->map, al->addr, "\n  ", stdout);
 669
 670        printf("\n");
 671}
 672
 673static struct {
 674        u32 flags;
 675        const char *name;
 676} sample_flags[] = {
 677        {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_CALL, "call"},
 678        {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_RETURN, "return"},
 679        {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_CONDITIONAL, "jcc"},
 680        {PERF_IP_FLAG_BRANCH, "jmp"},
 681        {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_CALL | PERF_IP_FLAG_INTERRUPT, "int"},
 682        {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_RETURN | PERF_IP_FLAG_INTERRUPT, "iret"},
 683        {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_CALL | PERF_IP_FLAG_SYSCALLRET, "syscall"},
 684        {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_RETURN | PERF_IP_FLAG_SYSCALLRET, "sysret"},
 685        {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_ASYNC, "async"},
 686        {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_CALL | PERF_IP_FLAG_ASYNC | PERF_IP_FLAG_INTERRUPT, "hw int"},
 687        {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_TX_ABORT, "tx abrt"},
 688        {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_TRACE_BEGIN, "tr strt"},
 689        {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_TRACE_END, "tr end"},
 690        {0, NULL}
 691};
 692
 693static void print_sample_flags(u32 flags)
 694{
 695        const char *chars = PERF_IP_FLAG_CHARS;
 696        const int n = strlen(PERF_IP_FLAG_CHARS);
 697        bool in_tx = flags & PERF_IP_FLAG_IN_TX;
 698        const char *name = NULL;
 699        char str[33];
 700        int i, pos = 0;
 701
 702        for (i = 0; sample_flags[i].name ; i++) {
 703                if (sample_flags[i].flags == (flags & ~PERF_IP_FLAG_IN_TX)) {
 704                        name = sample_flags[i].name;
 705                        break;
 706                }
 707        }
 708
 709        for (i = 0; i < n; i++, flags >>= 1) {
 710                if (flags & 1)
 711                        str[pos++] = chars[i];
 712        }
 713        for (; i < 32; i++, flags >>= 1) {
 714                if (flags & 1)
 715                        str[pos++] = '?';
 716        }
 717        str[pos] = 0;
 718
 719        if (name)
 720                printf("  %-7s%4s ", name, in_tx ? "(x)" : "");
 721        else
 722                printf("  %-11s ", str);
 723}
 724
 725struct printer_data {
 726        int line_no;
 727        bool hit_nul;
 728        bool is_printable;
 729};
 730
 731static void
 732print_sample_bpf_output_printer(enum binary_printer_ops op,
 733                                unsigned int val,
 734                                void *extra)
 735{
 736        unsigned char ch = (unsigned char)val;
 737        struct printer_data *printer_data = extra;
 738
 739        switch (op) {
 740        case BINARY_PRINT_DATA_BEGIN:
 741                printf("\n");
 742                break;
 743        case BINARY_PRINT_LINE_BEGIN:
 744                printf("%17s", !printer_data->line_no ? "BPF output:" :
 745                                                        "           ");
 746                break;
 747        case BINARY_PRINT_ADDR:
 748                printf(" %04x:", val);
 749                break;
 750        case BINARY_PRINT_NUM_DATA:
 751                printf(" %02x", val);
 752                break;
 753        case BINARY_PRINT_NUM_PAD:
 754                printf("   ");
 755                break;
 756        case BINARY_PRINT_SEP:
 757                printf("  ");
 758                break;
 759        case BINARY_PRINT_CHAR_DATA:
 760                if (printer_data->hit_nul && ch)
 761                        printer_data->is_printable = false;
 762
 763                if (!isprint(ch)) {
 764                        printf("%c", '.');
 765
 766                        if (!printer_data->is_printable)
 767                                break;
 768
 769                        if (ch == '\0')
 770                                printer_data->hit_nul = true;
 771                        else
 772                                printer_data->is_printable = false;
 773                } else {
 774                        printf("%c", ch);
 775                }
 776                break;
 777        case BINARY_PRINT_CHAR_PAD:
 778                printf(" ");
 779                break;
 780        case BINARY_PRINT_LINE_END:
 781                printf("\n");
 782                printer_data->line_no++;
 783                break;
 784        case BINARY_PRINT_DATA_END:
 785        default:
 786                break;
 787        }
 788}
 789
 790static void print_sample_bpf_output(struct perf_sample *sample)
 791{
 792        unsigned int nr_bytes = sample->raw_size;
 793        struct printer_data printer_data = {0, false, true};
 794
 795        print_binary(sample->raw_data, nr_bytes, 8,
 796                     print_sample_bpf_output_printer, &printer_data);
 797
 798        if (printer_data.is_printable && printer_data.hit_nul)
 799                printf("%17s \"%s\"\n", "BPF string:",
 800                       (char *)(sample->raw_data));
 801}
 802
 803struct perf_script {
 804        struct perf_tool        tool;
 805        struct perf_session     *session;
 806        bool                    show_task_events;
 807        bool                    show_mmap_events;
 808        bool                    show_switch_events;
 809        bool                    allocated;
 810        struct cpu_map          *cpus;
 811        struct thread_map       *threads;
 812        int                     name_width;
 813};
 814
 815static int perf_evlist__max_name_len(struct perf_evlist *evlist)
 816{
 817        struct perf_evsel *evsel;
 818        int max = 0;
 819
 820        evlist__for_each_entry(evlist, evsel) {
 821                int len = strlen(perf_evsel__name(evsel));
 822
 823                max = MAX(len, max);
 824        }
 825
 826        return max;
 827}
 828
 829static size_t data_src__printf(u64 data_src)
 830{
 831        struct mem_info mi = { .data_src.val = data_src };
 832        char decode[100];
 833        char out[100];
 834        static int maxlen;
 835        int len;
 836
 837        perf_script__meminfo_scnprintf(decode, 100, &mi);
 838
 839        len = scnprintf(out, 100, "%16" PRIx64 " %s", data_src, decode);
 840        if (maxlen < len)
 841                maxlen = len;
 842
 843        return printf("%-*s", maxlen, out);
 844}
 845
 846static void process_event(struct perf_script *script,
 847                          struct perf_sample *sample, struct perf_evsel *evsel,
 848                          struct addr_location *al)
 849{
 850        struct thread *thread = al->thread;
 851        struct perf_event_attr *attr = &evsel->attr;
 852
 853        if (output[attr->type].fields == 0)
 854                return;
 855
 856        print_sample_start(sample, thread, evsel);
 857
 858        if (PRINT_FIELD(PERIOD))
 859                printf("%10" PRIu64 " ", sample->period);
 860
 861        if (PRINT_FIELD(EVNAME)) {
 862                const char *evname = perf_evsel__name(evsel);
 863
 864                if (!script->name_width)
 865                        script->name_width = perf_evlist__max_name_len(script->session->evlist);
 866
 867                printf("%*s: ", script->name_width,
 868                       evname ? evname : "[unknown]");
 869        }
 870
 871        if (print_flags)
 872                print_sample_flags(sample->flags);
 873
 874        if (is_bts_event(attr)) {
 875                print_sample_bts(sample, evsel, thread, al);
 876                return;
 877        }
 878
 879        if (PRINT_FIELD(TRACE))
 880                event_format__print(evsel->tp_format, sample->cpu,
 881                                    sample->raw_data, sample->raw_size);
 882        if (PRINT_FIELD(ADDR))
 883                print_sample_addr(sample, thread, attr);
 884
 885        if (PRINT_FIELD(DATA_SRC))
 886                data_src__printf(sample->data_src);
 887
 888        if (PRINT_FIELD(WEIGHT))
 889                printf("%16" PRIu64, sample->weight);
 890
 891        if (PRINT_FIELD(IP)) {
 892                struct callchain_cursor *cursor = NULL;
 893
 894                if (symbol_conf.use_callchain && sample->callchain &&
 895                    thread__resolve_callchain(al->thread, &callchain_cursor, evsel,
 896                                              sample, NULL, NULL, scripting_max_stack) == 0)
 897                        cursor = &callchain_cursor;
 898
 899                putchar(cursor ? '\n' : ' ');
 900                sample__fprintf_sym(sample, al, 0, output[attr->type].print_ip_opts, cursor, stdout);
 901        }
 902
 903        if (PRINT_FIELD(IREGS))
 904                print_sample_iregs(sample, attr);
 905
 906        if (PRINT_FIELD(BRSTACK))
 907                print_sample_brstack(sample);
 908        else if (PRINT_FIELD(BRSTACKSYM))
 909                print_sample_brstacksym(sample, thread);
 910
 911        if (perf_evsel__is_bpf_output(evsel) && PRINT_FIELD(BPF_OUTPUT))
 912                print_sample_bpf_output(sample);
 913
 914        printf("\n");
 915}
 916
 917static struct scripting_ops     *scripting_ops;
 918
 919static void __process_stat(struct perf_evsel *counter, u64 tstamp)
 920{
 921        int nthreads = thread_map__nr(counter->threads);
 922        int ncpus = perf_evsel__nr_cpus(counter);
 923        int cpu, thread;
 924        static int header_printed;
 925
 926        if (counter->system_wide)
 927                nthreads = 1;
 928
 929        if (!header_printed) {
 930                printf("%3s %8s %15s %15s %15s %15s %s\n",
 931                       "CPU", "THREAD", "VAL", "ENA", "RUN", "TIME", "EVENT");
 932                header_printed = 1;
 933        }
 934
 935        for (thread = 0; thread < nthreads; thread++) {
 936                for (cpu = 0; cpu < ncpus; cpu++) {
 937                        struct perf_counts_values *counts;
 938
 939                        counts = perf_counts(counter->counts, cpu, thread);
 940
 941                        printf("%3d %8d %15" PRIu64 " %15" PRIu64 " %15" PRIu64 " %15" PRIu64 " %s\n",
 942                                counter->cpus->map[cpu],
 943                                thread_map__pid(counter->threads, thread),
 944                                counts->val,
 945                                counts->ena,
 946                                counts->run,
 947                                tstamp,
 948                                perf_evsel__name(counter));
 949                }
 950        }
 951}
 952
 953static void process_stat(struct perf_evsel *counter, u64 tstamp)
 954{
 955        if (scripting_ops && scripting_ops->process_stat)
 956                scripting_ops->process_stat(&stat_config, counter, tstamp);
 957        else
 958                __process_stat(counter, tstamp);
 959}
 960
 961static void process_stat_interval(u64 tstamp)
 962{
 963        if (scripting_ops && scripting_ops->process_stat_interval)
 964                scripting_ops->process_stat_interval(tstamp);
 965}
 966
 967static void setup_scripting(void)
 968{
 969        setup_perl_scripting();
 970        setup_python_scripting();
 971}
 972
 973static int flush_scripting(void)
 974{
 975        return scripting_ops ? scripting_ops->flush_script() : 0;
 976}
 977
 978static int cleanup_scripting(void)
 979{
 980        pr_debug("\nperf script stopped\n");
 981
 982        return scripting_ops ? scripting_ops->stop_script() : 0;
 983}
 984
 985static int process_sample_event(struct perf_tool *tool,
 986                                union perf_event *event,
 987                                struct perf_sample *sample,
 988                                struct perf_evsel *evsel,
 989                                struct machine *machine)
 990{
 991        struct perf_script *scr = container_of(tool, struct perf_script, tool);
 992        struct addr_location al;
 993
 994        if (debug_mode) {
 995                if (sample->time < last_timestamp) {
 996                        pr_err("Samples misordered, previous: %" PRIu64
 997                                " this: %" PRIu64 "\n", last_timestamp,
 998                                sample->time);
 999                        nr_unordered++;
1000                }
1001                last_timestamp = sample->time;
1002                return 0;
1003        }
1004
1005        if (machine__resolve(machine, &al, sample) < 0) {
1006                pr_err("problem processing %d event, skipping it.\n",
1007                       event->header.type);
1008                return -1;
1009        }
1010
1011        if (al.filtered)
1012                goto out_put;
1013
1014        if (cpu_list && !test_bit(sample->cpu, cpu_bitmap))
1015                goto out_put;
1016
1017        if (scripting_ops)
1018                scripting_ops->process_event(event, sample, evsel, &al);
1019        else
1020                process_event(scr, sample, evsel, &al);
1021
1022out_put:
1023        addr_location__put(&al);
1024        return 0;
1025}
1026
1027static int process_attr(struct perf_tool *tool, union perf_event *event,
1028                        struct perf_evlist **pevlist)
1029{
1030        struct perf_script *scr = container_of(tool, struct perf_script, tool);
1031        struct perf_evlist *evlist;
1032        struct perf_evsel *evsel, *pos;
1033        int err;
1034
1035        err = perf_event__process_attr(tool, event, pevlist);
1036        if (err)
1037                return err;
1038
1039        evlist = *pevlist;
1040        evsel = perf_evlist__last(*pevlist);
1041
1042        if (evsel->attr.type >= PERF_TYPE_MAX)
1043                return 0;
1044
1045        evlist__for_each_entry(evlist, pos) {
1046                if (pos->attr.type == evsel->attr.type && pos != evsel)
1047                        return 0;
1048        }
1049
1050        set_print_ip_opts(&evsel->attr);
1051
1052        if (evsel->attr.sample_type)
1053                err = perf_evsel__check_attr(evsel, scr->session);
1054
1055        return err;
1056}
1057
1058static int process_comm_event(struct perf_tool *tool,
1059                              union perf_event *event,
1060                              struct perf_sample *sample,
1061                              struct machine *machine)
1062{
1063        struct thread *thread;
1064        struct perf_script *script = container_of(tool, struct perf_script, tool);
1065        struct perf_session *session = script->session;
1066        struct perf_evsel *evsel = perf_evlist__id2evsel(session->evlist, sample->id);
1067        int ret = -1;
1068
1069        thread = machine__findnew_thread(machine, event->comm.pid, event->comm.tid);
1070        if (thread == NULL) {
1071                pr_debug("problem processing COMM event, skipping it.\n");
1072                return -1;
1073        }
1074
1075        if (perf_event__process_comm(tool, event, sample, machine) < 0)
1076                goto out;
1077
1078        if (!evsel->attr.sample_id_all) {
1079                sample->cpu = 0;
1080                sample->time = 0;
1081                sample->tid = event->comm.tid;
1082                sample->pid = event->comm.pid;
1083        }
1084        print_sample_start(sample, thread, evsel);
1085        perf_event__fprintf(event, stdout);
1086        ret = 0;
1087out:
1088        thread__put(thread);
1089        return ret;
1090}
1091
1092static int process_fork_event(struct perf_tool *tool,
1093                              union perf_event *event,
1094                              struct perf_sample *sample,
1095                              struct machine *machine)
1096{
1097        struct thread *thread;
1098        struct perf_script *script = container_of(tool, struct perf_script, tool);
1099        struct perf_session *session = script->session;
1100        struct perf_evsel *evsel = perf_evlist__id2evsel(session->evlist, sample->id);
1101
1102        if (perf_event__process_fork(tool, event, sample, machine) < 0)
1103                return -1;
1104
1105        thread = machine__findnew_thread(machine, event->fork.pid, event->fork.tid);
1106        if (thread == NULL) {
1107                pr_debug("problem processing FORK event, skipping it.\n");
1108                return -1;
1109        }
1110
1111        if (!evsel->attr.sample_id_all) {
1112                sample->cpu = 0;
1113                sample->time = event->fork.time;
1114                sample->tid = event->fork.tid;
1115                sample->pid = event->fork.pid;
1116        }
1117        print_sample_start(sample, thread, evsel);
1118        perf_event__fprintf(event, stdout);
1119        thread__put(thread);
1120
1121        return 0;
1122}
1123static int process_exit_event(struct perf_tool *tool,
1124                              union perf_event *event,
1125                              struct perf_sample *sample,
1126                              struct machine *machine)
1127{
1128        int err = 0;
1129        struct thread *thread;
1130        struct perf_script *script = container_of(tool, struct perf_script, tool);
1131        struct perf_session *session = script->session;
1132        struct perf_evsel *evsel = perf_evlist__id2evsel(session->evlist, sample->id);
1133
1134        thread = machine__findnew_thread(machine, event->fork.pid, event->fork.tid);
1135        if (thread == NULL) {
1136                pr_debug("problem processing EXIT event, skipping it.\n");
1137                return -1;
1138        }
1139
1140        if (!evsel->attr.sample_id_all) {
1141                sample->cpu = 0;
1142                sample->time = 0;
1143                sample->tid = event->fork.tid;
1144                sample->pid = event->fork.pid;
1145        }
1146        print_sample_start(sample, thread, evsel);
1147        perf_event__fprintf(event, stdout);
1148
1149        if (perf_event__process_exit(tool, event, sample, machine) < 0)
1150                err = -1;
1151
1152        thread__put(thread);
1153        return err;
1154}
1155
1156static int process_mmap_event(struct perf_tool *tool,
1157                              union perf_event *event,
1158                              struct perf_sample *sample,
1159                              struct machine *machine)
1160{
1161        struct thread *thread;
1162        struct perf_script *script = container_of(tool, struct perf_script, tool);
1163        struct perf_session *session = script->session;
1164        struct perf_evsel *evsel = perf_evlist__id2evsel(session->evlist, sample->id);
1165
1166        if (perf_event__process_mmap(tool, event, sample, machine) < 0)
1167                return -1;
1168
1169        thread = machine__findnew_thread(machine, event->mmap.pid, event->mmap.tid);
1170        if (thread == NULL) {
1171                pr_debug("problem processing MMAP event, skipping it.\n");
1172                return -1;
1173        }
1174
1175        if (!evsel->attr.sample_id_all) {
1176                sample->cpu = 0;
1177                sample->time = 0;
1178                sample->tid = event->mmap.tid;
1179                sample->pid = event->mmap.pid;
1180        }
1181        print_sample_start(sample, thread, evsel);
1182        perf_event__fprintf(event, stdout);
1183        thread__put(thread);
1184        return 0;
1185}
1186
1187static int process_mmap2_event(struct perf_tool *tool,
1188                              union perf_event *event,
1189                              struct perf_sample *sample,
1190                              struct machine *machine)
1191{
1192        struct thread *thread;
1193        struct perf_script *script = container_of(tool, struct perf_script, tool);
1194        struct perf_session *session = script->session;
1195        struct perf_evsel *evsel = perf_evlist__id2evsel(session->evlist, sample->id);
1196
1197        if (perf_event__process_mmap2(tool, event, sample, machine) < 0)
1198                return -1;
1199
1200        thread = machine__findnew_thread(machine, event->mmap2.pid, event->mmap2.tid);
1201        if (thread == NULL) {
1202                pr_debug("problem processing MMAP2 event, skipping it.\n");
1203                return -1;
1204        }
1205
1206        if (!evsel->attr.sample_id_all) {
1207                sample->cpu = 0;
1208                sample->time = 0;
1209                sample->tid = event->mmap2.tid;
1210                sample->pid = event->mmap2.pid;
1211        }
1212        print_sample_start(sample, thread, evsel);
1213        perf_event__fprintf(event, stdout);
1214        thread__put(thread);
1215        return 0;
1216}
1217
1218static int process_switch_event(struct perf_tool *tool,
1219                                union perf_event *event,
1220                                struct perf_sample *sample,
1221                                struct machine *machine)
1222{
1223        struct thread *thread;
1224        struct perf_script *script = container_of(tool, struct perf_script, tool);
1225        struct perf_session *session = script->session;
1226        struct perf_evsel *evsel = perf_evlist__id2evsel(session->evlist, sample->id);
1227
1228        if (perf_event__process_switch(tool, event, sample, machine) < 0)
1229                return -1;
1230
1231        thread = machine__findnew_thread(machine, sample->pid,
1232                                         sample->tid);
1233        if (thread == NULL) {
1234                pr_debug("problem processing SWITCH event, skipping it.\n");
1235                return -1;
1236        }
1237
1238        print_sample_start(sample, thread, evsel);
1239        perf_event__fprintf(event, stdout);
1240        thread__put(thread);
1241        return 0;
1242}
1243
1244static void sig_handler(int sig __maybe_unused)
1245{
1246        session_done = 1;
1247}
1248
1249static int __cmd_script(struct perf_script *script)
1250{
1251        int ret;
1252
1253        signal(SIGINT, sig_handler);
1254
1255        /* override event processing functions */
1256        if (script->show_task_events) {
1257                script->tool.comm = process_comm_event;
1258                script->tool.fork = process_fork_event;
1259                script->tool.exit = process_exit_event;
1260        }
1261        if (script->show_mmap_events) {
1262                script->tool.mmap = process_mmap_event;
1263                script->tool.mmap2 = process_mmap2_event;
1264        }
1265        if (script->show_switch_events)
1266                script->tool.context_switch = process_switch_event;
1267
1268        ret = perf_session__process_events(script->session);
1269
1270        if (debug_mode)
1271                pr_err("Misordered timestamps: %" PRIu64 "\n", nr_unordered);
1272
1273        return ret;
1274}
1275
1276struct script_spec {
1277        struct list_head        node;
1278        struct scripting_ops    *ops;
1279        char                    spec[0];
1280};
1281
1282static LIST_HEAD(script_specs);
1283
1284static struct script_spec *script_spec__new(const char *spec,
1285                                            struct scripting_ops *ops)
1286{
1287        struct script_spec *s = malloc(sizeof(*s) + strlen(spec) + 1);
1288
1289        if (s != NULL) {
1290                strcpy(s->spec, spec);
1291                s->ops = ops;
1292        }
1293
1294        return s;
1295}
1296
1297static void script_spec__add(struct script_spec *s)
1298{
1299        list_add_tail(&s->node, &script_specs);
1300}
1301
1302static struct script_spec *script_spec__find(const char *spec)
1303{
1304        struct script_spec *s;
1305
1306        list_for_each_entry(s, &script_specs, node)
1307                if (strcasecmp(s->spec, spec) == 0)
1308                        return s;
1309        return NULL;
1310}
1311
1312int script_spec_register(const char *spec, struct scripting_ops *ops)
1313{
1314        struct script_spec *s;
1315
1316        s = script_spec__find(spec);
1317        if (s)
1318                return -1;
1319
1320        s = script_spec__new(spec, ops);
1321        if (!s)
1322                return -1;
1323        else
1324                script_spec__add(s);
1325
1326        return 0;
1327}
1328
1329static struct scripting_ops *script_spec__lookup(const char *spec)
1330{
1331        struct script_spec *s = script_spec__find(spec);
1332        if (!s)
1333                return NULL;
1334
1335        return s->ops;
1336}
1337
1338static void list_available_languages(void)
1339{
1340        struct script_spec *s;
1341
1342        fprintf(stderr, "\n");
1343        fprintf(stderr, "Scripting language extensions (used in "
1344                "perf script -s [spec:]script.[spec]):\n\n");
1345
1346        list_for_each_entry(s, &script_specs, node)
1347                fprintf(stderr, "  %-42s [%s]\n", s->spec, s->ops->name);
1348
1349        fprintf(stderr, "\n");
1350}
1351
1352static int parse_scriptname(const struct option *opt __maybe_unused,
1353                            const char *str, int unset __maybe_unused)
1354{
1355        char spec[PATH_MAX];
1356        const char *script, *ext;
1357        int len;
1358
1359        if (strcmp(str, "lang") == 0) {
1360                list_available_languages();
1361                exit(0);
1362        }
1363
1364        script = strchr(str, ':');
1365        if (script) {
1366                len = script - str;
1367                if (len >= PATH_MAX) {
1368                        fprintf(stderr, "invalid language specifier");
1369                        return -1;
1370                }
1371                strncpy(spec, str, len);
1372                spec[len] = '\0';
1373                scripting_ops = script_spec__lookup(spec);
1374                if (!scripting_ops) {
1375                        fprintf(stderr, "invalid language specifier");
1376                        return -1;
1377                }
1378                script++;
1379        } else {
1380                script = str;
1381                ext = strrchr(script, '.');
1382                if (!ext) {
1383                        fprintf(stderr, "invalid script extension");
1384                        return -1;
1385                }
1386                scripting_ops = script_spec__lookup(++ext);
1387                if (!scripting_ops) {
1388                        fprintf(stderr, "invalid script extension");
1389                        return -1;
1390                }
1391        }
1392
1393        script_name = strdup(script);
1394
1395        return 0;
1396}
1397
1398static int parse_output_fields(const struct option *opt __maybe_unused,
1399                            const char *arg, int unset __maybe_unused)
1400{
1401        char *tok;
1402        int i, imax = ARRAY_SIZE(all_output_options);
1403        int j;
1404        int rc = 0;
1405        char *str = strdup(arg);
1406        int type = -1;
1407
1408        if (!str)
1409                return -ENOMEM;
1410
1411        /* first word can state for which event type the user is specifying
1412         * the fields. If no type exists, the specified fields apply to all
1413         * event types found in the file minus the invalid fields for a type.
1414         */
1415        tok = strchr(str, ':');
1416        if (tok) {
1417                *tok = '\0';
1418                tok++;
1419                if (!strcmp(str, "hw"))
1420                        type = PERF_TYPE_HARDWARE;
1421                else if (!strcmp(str, "sw"))
1422                        type = PERF_TYPE_SOFTWARE;
1423                else if (!strcmp(str, "trace"))
1424                        type = PERF_TYPE_TRACEPOINT;
1425                else if (!strcmp(str, "raw"))
1426                        type = PERF_TYPE_RAW;
1427                else if (!strcmp(str, "break"))
1428                        type = PERF_TYPE_BREAKPOINT;
1429                else {
1430                        fprintf(stderr, "Invalid event type in field string.\n");
1431                        rc = -EINVAL;
1432                        goto out;
1433                }
1434
1435                if (output[type].user_set)
1436                        pr_warning("Overriding previous field request for %s events.\n",
1437                                   event_type(type));
1438
1439                output[type].fields = 0;
1440                output[type].user_set = true;
1441                output[type].wildcard_set = false;
1442
1443        } else {
1444                tok = str;
1445                if (strlen(str) == 0) {
1446                        fprintf(stderr,
1447                                "Cannot set fields to 'none' for all event types.\n");
1448                        rc = -EINVAL;
1449                        goto out;
1450                }
1451
1452                if (output_set_by_user())
1453                        pr_warning("Overriding previous field request for all events.\n");
1454
1455                for (j = 0; j < PERF_TYPE_MAX; ++j) {
1456                        output[j].fields = 0;
1457                        output[j].user_set = true;
1458                        output[j].wildcard_set = true;
1459                }
1460        }
1461
1462        for (tok = strtok(tok, ","); tok; tok = strtok(NULL, ",")) {
1463                for (i = 0; i < imax; ++i) {
1464                        if (strcmp(tok, all_output_options[i].str) == 0)
1465                                break;
1466                }
1467                if (i == imax && strcmp(tok, "flags") == 0) {
1468                        print_flags = true;
1469                        continue;
1470                }
1471                if (i == imax) {
1472                        fprintf(stderr, "Invalid field requested.\n");
1473                        rc = -EINVAL;
1474                        goto out;
1475                }
1476
1477                if (type == -1) {
1478                        /* add user option to all events types for
1479                         * which it is valid
1480                         */
1481                        for (j = 0; j < PERF_TYPE_MAX; ++j) {
1482                                if (output[j].invalid_fields & all_output_options[i].field) {
1483                                        pr_warning("\'%s\' not valid for %s events. Ignoring.\n",
1484                                                   all_output_options[i].str, event_type(j));
1485                                } else
1486                                        output[j].fields |= all_output_options[i].field;
1487                        }
1488                } else {
1489                        if (output[type].invalid_fields & all_output_options[i].field) {
1490                                fprintf(stderr, "\'%s\' not valid for %s events.\n",
1491                                         all_output_options[i].str, event_type(type));
1492
1493                                rc = -EINVAL;
1494                                goto out;
1495                        }
1496                        output[type].fields |= all_output_options[i].field;
1497                }
1498        }
1499
1500        if (type >= 0) {
1501                if (output[type].fields == 0) {
1502                        pr_debug("No fields requested for %s type. "
1503                                 "Events will not be displayed.\n", event_type(type));
1504                }
1505        }
1506
1507out:
1508        free(str);
1509        return rc;
1510}
1511
1512/* Helper function for filesystems that return a dent->d_type DT_UNKNOWN */
1513static int is_directory(const char *base_path, const struct dirent *dent)
1514{
1515        char path[PATH_MAX];
1516        struct stat st;
1517
1518        sprintf(path, "%s/%s", base_path, dent->d_name);
1519        if (stat(path, &st))
1520                return 0;
1521
1522        return S_ISDIR(st.st_mode);
1523}
1524
1525#define for_each_lang(scripts_path, scripts_dir, lang_dirent)           \
1526        while ((lang_dirent = readdir(scripts_dir)) != NULL)            \
1527                if ((lang_dirent->d_type == DT_DIR ||                   \
1528                     (lang_dirent->d_type == DT_UNKNOWN &&              \
1529                      is_directory(scripts_path, lang_dirent))) &&      \
1530                    (strcmp(lang_dirent->d_name, ".")) &&               \
1531                    (strcmp(lang_dirent->d_name, "..")))
1532
1533#define for_each_script(lang_path, lang_dir, script_dirent)             \
1534        while ((script_dirent = readdir(lang_dir)) != NULL)             \
1535                if (script_dirent->d_type != DT_DIR &&                  \
1536                    (script_dirent->d_type != DT_UNKNOWN ||             \
1537                     !is_directory(lang_path, script_dirent)))
1538
1539
1540#define RECORD_SUFFIX                   "-record"
1541#define REPORT_SUFFIX                   "-report"
1542
1543struct script_desc {
1544        struct list_head        node;
1545        char                    *name;
1546        char                    *half_liner;
1547        char                    *args;
1548};
1549
1550static LIST_HEAD(script_descs);
1551
1552static struct script_desc *script_desc__new(const char *name)
1553{
1554        struct script_desc *s = zalloc(sizeof(*s));
1555
1556        if (s != NULL && name)
1557                s->name = strdup(name);
1558
1559        return s;
1560}
1561
1562static void script_desc__delete(struct script_desc *s)
1563{
1564        zfree(&s->name);
1565        zfree(&s->half_liner);
1566        zfree(&s->args);
1567        free(s);
1568}
1569
1570static void script_desc__add(struct script_desc *s)
1571{
1572        list_add_tail(&s->node, &script_descs);
1573}
1574
1575static struct script_desc *script_desc__find(const char *name)
1576{
1577        struct script_desc *s;
1578
1579        list_for_each_entry(s, &script_descs, node)
1580                if (strcasecmp(s->name, name) == 0)
1581                        return s;
1582        return NULL;
1583}
1584
1585static struct script_desc *script_desc__findnew(const char *name)
1586{
1587        struct script_desc *s = script_desc__find(name);
1588
1589        if (s)
1590                return s;
1591
1592        s = script_desc__new(name);
1593        if (!s)
1594                goto out_delete_desc;
1595
1596        script_desc__add(s);
1597
1598        return s;
1599
1600out_delete_desc:
1601        script_desc__delete(s);
1602
1603        return NULL;
1604}
1605
1606static const char *ends_with(const char *str, const char *suffix)
1607{
1608        size_t suffix_len = strlen(suffix);
1609        const char *p = str;
1610
1611        if (strlen(str) > suffix_len) {
1612                p = str + strlen(str) - suffix_len;
1613                if (!strncmp(p, suffix, suffix_len))
1614                        return p;
1615        }
1616
1617        return NULL;
1618}
1619
1620static int read_script_info(struct script_desc *desc, const char *filename)
1621{
1622        char line[BUFSIZ], *p;
1623        FILE *fp;
1624
1625        fp = fopen(filename, "r");
1626        if (!fp)
1627                return -1;
1628
1629        while (fgets(line, sizeof(line), fp)) {
1630                p = ltrim(line);
1631                if (strlen(p) == 0)
1632                        continue;
1633                if (*p != '#')
1634                        continue;
1635                p++;
1636                if (strlen(p) && *p == '!')
1637                        continue;
1638
1639                p = ltrim(p);
1640                if (strlen(p) && p[strlen(p) - 1] == '\n')
1641                        p[strlen(p) - 1] = '\0';
1642
1643                if (!strncmp(p, "description:", strlen("description:"))) {
1644                        p += strlen("description:");
1645                        desc->half_liner = strdup(ltrim(p));
1646                        continue;
1647                }
1648
1649                if (!strncmp(p, "args:", strlen("args:"))) {
1650                        p += strlen("args:");
1651                        desc->args = strdup(ltrim(p));
1652                        continue;
1653                }
1654        }
1655
1656        fclose(fp);
1657
1658        return 0;
1659}
1660
1661static char *get_script_root(struct dirent *script_dirent, const char *suffix)
1662{
1663        char *script_root, *str;
1664
1665        script_root = strdup(script_dirent->d_name);
1666        if (!script_root)
1667                return NULL;
1668
1669        str = (char *)ends_with(script_root, suffix);
1670        if (!str) {
1671                free(script_root);
1672                return NULL;
1673        }
1674
1675        *str = '\0';
1676        return script_root;
1677}
1678
1679static int list_available_scripts(const struct option *opt __maybe_unused,
1680                                  const char *s __maybe_unused,
1681                                  int unset __maybe_unused)
1682{
1683        struct dirent *script_dirent, *lang_dirent;
1684        char scripts_path[MAXPATHLEN];
1685        DIR *scripts_dir, *lang_dir;
1686        char script_path[MAXPATHLEN];
1687        char lang_path[MAXPATHLEN];
1688        struct script_desc *desc;
1689        char first_half[BUFSIZ];
1690        char *script_root;
1691
1692        snprintf(scripts_path, MAXPATHLEN, "%s/scripts", get_argv_exec_path());
1693
1694        scripts_dir = opendir(scripts_path);
1695        if (!scripts_dir) {
1696                fprintf(stdout,
1697                        "open(%s) failed.\n"
1698                        "Check \"PERF_EXEC_PATH\" env to set scripts dir.\n",
1699                        scripts_path);
1700                exit(-1);
1701        }
1702
1703        for_each_lang(scripts_path, scripts_dir, lang_dirent) {
1704                snprintf(lang_path, MAXPATHLEN, "%s/%s/bin", scripts_path,
1705                         lang_dirent->d_name);
1706                lang_dir = opendir(lang_path);
1707                if (!lang_dir)
1708                        continue;
1709
1710                for_each_script(lang_path, lang_dir, script_dirent) {
1711                        script_root = get_script_root(script_dirent, REPORT_SUFFIX);
1712                        if (script_root) {
1713                                desc = script_desc__findnew(script_root);
1714                                snprintf(script_path, MAXPATHLEN, "%s/%s",
1715                                         lang_path, script_dirent->d_name);
1716                                read_script_info(desc, script_path);
1717                                free(script_root);
1718                        }
1719                }
1720        }
1721
1722        fprintf(stdout, "List of available trace scripts:\n");
1723        list_for_each_entry(desc, &script_descs, node) {
1724                sprintf(first_half, "%s %s", desc->name,
1725                        desc->args ? desc->args : "");
1726                fprintf(stdout, "  %-36s %s\n", first_half,
1727                        desc->half_liner ? desc->half_liner : "");
1728        }
1729
1730        exit(0);
1731}
1732
1733/*
1734 * Some scripts specify the required events in their "xxx-record" file,
1735 * this function will check if the events in perf.data match those
1736 * mentioned in the "xxx-record".
1737 *
1738 * Fixme: All existing "xxx-record" are all in good formats "-e event ",
1739 * which is covered well now. And new parsing code should be added to
1740 * cover the future complexing formats like event groups etc.
1741 */
1742static int check_ev_match(char *dir_name, char *scriptname,
1743                        struct perf_session *session)
1744{
1745        char filename[MAXPATHLEN], evname[128];
1746        char line[BUFSIZ], *p;
1747        struct perf_evsel *pos;
1748        int match, len;
1749        FILE *fp;
1750
1751        sprintf(filename, "%s/bin/%s-record", dir_name, scriptname);
1752
1753        fp = fopen(filename, "r");
1754        if (!fp)
1755                return -1;
1756
1757        while (fgets(line, sizeof(line), fp)) {
1758                p = ltrim(line);
1759                if (*p == '#')
1760                        continue;
1761
1762                while (strlen(p)) {
1763                        p = strstr(p, "-e");
1764                        if (!p)
1765                                break;
1766
1767                        p += 2;
1768                        p = ltrim(p);
1769                        len = strcspn(p, " \t");
1770                        if (!len)
1771                                break;
1772
1773                        snprintf(evname, len + 1, "%s", p);
1774
1775                        match = 0;
1776                        evlist__for_each_entry(session->evlist, pos) {
1777                                if (!strcmp(perf_evsel__name(pos), evname)) {
1778                                        match = 1;
1779                                        break;
1780                                }
1781                        }
1782
1783                        if (!match) {
1784                                fclose(fp);
1785                                return -1;
1786                        }
1787                }
1788        }
1789
1790        fclose(fp);
1791        return 0;
1792}
1793
1794/*
1795 * Return -1 if none is found, otherwise the actual scripts number.
1796 *
1797 * Currently the only user of this function is the script browser, which
1798 * will list all statically runnable scripts, select one, execute it and
1799 * show the output in a perf browser.
1800 */
1801int find_scripts(char **scripts_array, char **scripts_path_array)
1802{
1803        struct dirent *script_dirent, *lang_dirent;
1804        char scripts_path[MAXPATHLEN], lang_path[MAXPATHLEN];
1805        DIR *scripts_dir, *lang_dir;
1806        struct perf_session *session;
1807        struct perf_data_file file = {
1808                .path = input_name,
1809                .mode = PERF_DATA_MODE_READ,
1810        };
1811        char *temp;
1812        int i = 0;
1813
1814        session = perf_session__new(&file, false, NULL);
1815        if (!session)
1816                return -1;
1817
1818        snprintf(scripts_path, MAXPATHLEN, "%s/scripts", get_argv_exec_path());
1819
1820        scripts_dir = opendir(scripts_path);
1821        if (!scripts_dir) {
1822                perf_session__delete(session);
1823                return -1;
1824        }
1825
1826        for_each_lang(scripts_path, scripts_dir, lang_dirent) {
1827                snprintf(lang_path, MAXPATHLEN, "%s/%s", scripts_path,
1828                         lang_dirent->d_name);
1829#ifdef NO_LIBPERL
1830                if (strstr(lang_path, "perl"))
1831                        continue;
1832#endif
1833#ifdef NO_LIBPYTHON
1834                if (strstr(lang_path, "python"))
1835                        continue;
1836#endif
1837
1838                lang_dir = opendir(lang_path);
1839                if (!lang_dir)
1840                        continue;
1841
1842                for_each_script(lang_path, lang_dir, script_dirent) {
1843                        /* Skip those real time scripts: xxxtop.p[yl] */
1844                        if (strstr(script_dirent->d_name, "top."))
1845                                continue;
1846                        sprintf(scripts_path_array[i], "%s/%s", lang_path,
1847                                script_dirent->d_name);
1848                        temp = strchr(script_dirent->d_name, '.');
1849                        snprintf(scripts_array[i],
1850                                (temp - script_dirent->d_name) + 1,
1851                                "%s", script_dirent->d_name);
1852
1853                        if (check_ev_match(lang_path,
1854                                        scripts_array[i], session))
1855                                continue;
1856
1857                        i++;
1858                }
1859                closedir(lang_dir);
1860        }
1861
1862        closedir(scripts_dir);
1863        perf_session__delete(session);
1864        return i;
1865}
1866
1867static char *get_script_path(const char *script_root, const char *suffix)
1868{
1869        struct dirent *script_dirent, *lang_dirent;
1870        char scripts_path[MAXPATHLEN];
1871        char script_path[MAXPATHLEN];
1872        DIR *scripts_dir, *lang_dir;
1873        char lang_path[MAXPATHLEN];
1874        char *__script_root;
1875
1876        snprintf(scripts_path, MAXPATHLEN, "%s/scripts", get_argv_exec_path());
1877
1878        scripts_dir = opendir(scripts_path);
1879        if (!scripts_dir)
1880                return NULL;
1881
1882        for_each_lang(scripts_path, scripts_dir, lang_dirent) {
1883                snprintf(lang_path, MAXPATHLEN, "%s/%s/bin", scripts_path,
1884                         lang_dirent->d_name);
1885                lang_dir = opendir(lang_path);
1886                if (!lang_dir)
1887                        continue;
1888
1889                for_each_script(lang_path, lang_dir, script_dirent) {
1890                        __script_root = get_script_root(script_dirent, suffix);
1891                        if (__script_root && !strcmp(script_root, __script_root)) {
1892                                free(__script_root);
1893                                closedir(lang_dir);
1894                                closedir(scripts_dir);
1895                                snprintf(script_path, MAXPATHLEN, "%s/%s",
1896                                         lang_path, script_dirent->d_name);
1897                                return strdup(script_path);
1898                        }
1899                        free(__script_root);
1900                }
1901                closedir(lang_dir);
1902        }
1903        closedir(scripts_dir);
1904
1905        return NULL;
1906}
1907
1908static bool is_top_script(const char *script_path)
1909{
1910        return ends_with(script_path, "top") == NULL ? false : true;
1911}
1912
1913static int has_required_arg(char *script_path)
1914{
1915        struct script_desc *desc;
1916        int n_args = 0;
1917        char *p;
1918
1919        desc = script_desc__new(NULL);
1920
1921        if (read_script_info(desc, script_path))
1922                goto out;
1923
1924        if (!desc->args)
1925                goto out;
1926
1927        for (p = desc->args; *p; p++)
1928                if (*p == '<')
1929                        n_args++;
1930out:
1931        script_desc__delete(desc);
1932
1933        return n_args;
1934}
1935
1936static int have_cmd(int argc, const char **argv)
1937{
1938        char **__argv = malloc(sizeof(const char *) * argc);
1939
1940        if (!__argv) {
1941                pr_err("malloc failed\n");
1942                return -1;
1943        }
1944
1945        memcpy(__argv, argv, sizeof(const char *) * argc);
1946        argc = parse_options(argc, (const char **)__argv, record_options,
1947                             NULL, PARSE_OPT_STOP_AT_NON_OPTION);
1948        free(__argv);
1949
1950        system_wide = (argc == 0);
1951
1952        return 0;
1953}
1954
1955static void script__setup_sample_type(struct perf_script *script)
1956{
1957        struct perf_session *session = script->session;
1958        u64 sample_type = perf_evlist__combined_sample_type(session->evlist);
1959
1960        if (symbol_conf.use_callchain || symbol_conf.cumulate_callchain) {
1961                if ((sample_type & PERF_SAMPLE_REGS_USER) &&
1962                    (sample_type & PERF_SAMPLE_STACK_USER))
1963                        callchain_param.record_mode = CALLCHAIN_DWARF;
1964                else if (sample_type & PERF_SAMPLE_BRANCH_STACK)
1965                        callchain_param.record_mode = CALLCHAIN_LBR;
1966                else
1967                        callchain_param.record_mode = CALLCHAIN_FP;
1968        }
1969}
1970
1971static int process_stat_round_event(struct perf_tool *tool __maybe_unused,
1972                                    union perf_event *event,
1973                                    struct perf_session *session)
1974{
1975        struct stat_round_event *round = &event->stat_round;
1976        struct perf_evsel *counter;
1977
1978        evlist__for_each_entry(session->evlist, counter) {
1979                perf_stat_process_counter(&stat_config, counter);
1980                process_stat(counter, round->time);
1981        }
1982
1983        process_stat_interval(round->time);
1984        return 0;
1985}
1986
1987static int process_stat_config_event(struct perf_tool *tool __maybe_unused,
1988                                     union perf_event *event,
1989                                     struct perf_session *session __maybe_unused)
1990{
1991        perf_event__read_stat_config(&stat_config, &event->stat_config);
1992        return 0;
1993}
1994
1995static int set_maps(struct perf_script *script)
1996{
1997        struct perf_evlist *evlist = script->session->evlist;
1998
1999        if (!script->cpus || !script->threads)
2000                return 0;
2001
2002        if (WARN_ONCE(script->allocated, "stats double allocation\n"))
2003                return -EINVAL;
2004
2005        perf_evlist__set_maps(evlist, script->cpus, script->threads);
2006
2007        if (perf_evlist__alloc_stats(evlist, true))
2008                return -ENOMEM;
2009
2010        script->allocated = true;
2011        return 0;
2012}
2013
2014static
2015int process_thread_map_event(struct perf_tool *tool,
2016                             union perf_event *event,
2017                             struct perf_session *session __maybe_unused)
2018{
2019        struct perf_script *script = container_of(tool, struct perf_script, tool);
2020
2021        if (script->threads) {
2022                pr_warning("Extra thread map event, ignoring.\n");
2023                return 0;
2024        }
2025
2026        script->threads = thread_map__new_event(&event->thread_map);
2027        if (!script->threads)
2028                return -ENOMEM;
2029
2030        return set_maps(script);
2031}
2032
2033static
2034int process_cpu_map_event(struct perf_tool *tool __maybe_unused,
2035                          union perf_event *event,
2036                          struct perf_session *session __maybe_unused)
2037{
2038        struct perf_script *script = container_of(tool, struct perf_script, tool);
2039
2040        if (script->cpus) {
2041                pr_warning("Extra cpu map event, ignoring.\n");
2042                return 0;
2043        }
2044
2045        script->cpus = cpu_map__new_data(&event->cpu_map.data);
2046        if (!script->cpus)
2047                return -ENOMEM;
2048
2049        return set_maps(script);
2050}
2051
2052int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused)
2053{
2054        bool show_full_info = false;
2055        bool header = false;
2056        bool header_only = false;
2057        bool script_started = false;
2058        char *rec_script_path = NULL;
2059        char *rep_script_path = NULL;
2060        struct perf_session *session;
2061        struct itrace_synth_opts itrace_synth_opts = { .set = false, };
2062        char *script_path = NULL;
2063        const char **__argv;
2064        int i, j, err = 0;
2065        struct perf_script script = {
2066                .tool = {
2067                        .sample          = process_sample_event,
2068                        .mmap            = perf_event__process_mmap,
2069                        .mmap2           = perf_event__process_mmap2,
2070                        .comm            = perf_event__process_comm,
2071                        .exit            = perf_event__process_exit,
2072                        .fork            = perf_event__process_fork,
2073                        .attr            = process_attr,
2074                        .event_update   = perf_event__process_event_update,
2075                        .tracing_data    = perf_event__process_tracing_data,
2076                        .build_id        = perf_event__process_build_id,
2077                        .id_index        = perf_event__process_id_index,
2078                        .auxtrace_info   = perf_event__process_auxtrace_info,
2079                        .auxtrace        = perf_event__process_auxtrace,
2080                        .auxtrace_error  = perf_event__process_auxtrace_error,
2081                        .stat            = perf_event__process_stat_event,
2082                        .stat_round      = process_stat_round_event,
2083                        .stat_config     = process_stat_config_event,
2084                        .thread_map      = process_thread_map_event,
2085                        .cpu_map         = process_cpu_map_event,
2086                        .ordered_events  = true,
2087                        .ordering_requires_timestamps = true,
2088                },
2089        };
2090        struct perf_data_file file = {
2091                .mode = PERF_DATA_MODE_READ,
2092        };
2093        const struct option options[] = {
2094        OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
2095                    "dump raw trace in ASCII"),
2096        OPT_INCR('v', "verbose", &verbose,
2097                 "be more verbose (show symbol address, etc)"),
2098        OPT_BOOLEAN('L', "Latency", &latency_format,
2099                    "show latency attributes (irqs/preemption disabled, etc)"),
2100        OPT_CALLBACK_NOOPT('l', "list", NULL, NULL, "list available scripts",
2101                           list_available_scripts),
2102        OPT_CALLBACK('s', "script", NULL, "name",
2103                     "script file name (lang:script name, script name, or *)",
2104                     parse_scriptname),
2105        OPT_STRING('g', "gen-script", &generate_script_lang, "lang",
2106                   "generate perf-script.xx script in specified language"),
2107        OPT_STRING('i', "input", &input_name, "file", "input file name"),
2108        OPT_BOOLEAN('d', "debug-mode", &debug_mode,
2109                   "do various checks like samples ordering and lost events"),
2110        OPT_BOOLEAN(0, "header", &header, "Show data header."),
2111        OPT_BOOLEAN(0, "header-only", &header_only, "Show only data header."),
2112        OPT_STRING('k', "vmlinux", &symbol_conf.vmlinux_name,
2113                   "file", "vmlinux pathname"),
2114        OPT_STRING(0, "kallsyms", &symbol_conf.kallsyms_name,
2115                   "file", "kallsyms pathname"),
2116        OPT_BOOLEAN('G', "hide-call-graph", &no_callchain,
2117                    "When printing symbols do not display call chain"),
2118        OPT_CALLBACK(0, "symfs", NULL, "directory",
2119                     "Look for files with symbols relative to this directory",
2120                     symbol__config_symfs),
2121        OPT_CALLBACK('F', "fields", NULL, "str",
2122                     "comma separated output fields prepend with 'type:'. "
2123                     "Valid types: hw,sw,trace,raw. "
2124                     "Fields: comm,tid,pid,time,cpu,event,trace,ip,sym,dso,"
2125                     "addr,symoff,period,iregs,brstack,brstacksym,flags,"
2126                     "bpf-output,callindent", parse_output_fields),
2127        OPT_BOOLEAN('a', "all-cpus", &system_wide,
2128                    "system-wide collection from all CPUs"),
2129        OPT_STRING('S', "symbols", &symbol_conf.sym_list_str, "symbol[,symbol...]",
2130                   "only consider these symbols"),
2131        OPT_STRING('C', "cpu", &cpu_list, "cpu", "list of cpus to profile"),
2132        OPT_STRING('c', "comms", &symbol_conf.comm_list_str, "comm[,comm...]",
2133                   "only display events for these comms"),
2134        OPT_STRING(0, "pid", &symbol_conf.pid_list_str, "pid[,pid...]",
2135                   "only consider symbols in these pids"),
2136        OPT_STRING(0, "tid", &symbol_conf.tid_list_str, "tid[,tid...]",
2137                   "only consider symbols in these tids"),
2138        OPT_UINTEGER(0, "max-stack", &scripting_max_stack,
2139                     "Set the maximum stack depth when parsing the callchain, "
2140                     "anything beyond the specified depth will be ignored. "
2141                     "Default: kernel.perf_event_max_stack or " __stringify(PERF_MAX_STACK_DEPTH)),
2142        OPT_BOOLEAN('I', "show-info", &show_full_info,
2143                    "display extended information from perf.data file"),
2144        OPT_BOOLEAN('\0', "show-kernel-path", &symbol_conf.show_kernel_path,
2145                    "Show the path of [kernel.kallsyms]"),
2146        OPT_BOOLEAN('\0', "show-task-events", &script.show_task_events,
2147                    "Show the fork/comm/exit events"),
2148        OPT_BOOLEAN('\0', "show-mmap-events", &script.show_mmap_events,
2149                    "Show the mmap events"),
2150        OPT_BOOLEAN('\0', "show-switch-events", &script.show_switch_events,
2151                    "Show context switch events (if recorded)"),
2152        OPT_BOOLEAN('f', "force", &file.force, "don't complain, do it"),
2153        OPT_BOOLEAN(0, "ns", &nanosecs,
2154                    "Use 9 decimal places when displaying time"),
2155        OPT_CALLBACK_OPTARG(0, "itrace", &itrace_synth_opts, NULL, "opts",
2156                            "Instruction Tracing options",
2157                            itrace_parse_synth_opts),
2158        OPT_BOOLEAN(0, "full-source-path", &srcline_full_filename,
2159                        "Show full source file name path for source lines"),
2160        OPT_BOOLEAN(0, "demangle", &symbol_conf.demangle,
2161                        "Enable symbol demangling"),
2162        OPT_BOOLEAN(0, "demangle-kernel", &symbol_conf.demangle_kernel,
2163                        "Enable kernel symbol demangling"),
2164
2165        OPT_END()
2166        };
2167        const char * const script_subcommands[] = { "record", "report", NULL };
2168        const char *script_usage[] = {
2169                "perf script [<options>]",
2170                "perf script [<options>] record <script> [<record-options>] <command>",
2171                "perf script [<options>] report <script> [script-args]",
2172                "perf script [<options>] <script> [<record-options>] <command>",
2173                "perf script [<options>] <top-script> [script-args]",
2174                NULL
2175        };
2176
2177        setup_scripting();
2178
2179        argc = parse_options_subcommand(argc, argv, options, script_subcommands, script_usage,
2180                             PARSE_OPT_STOP_AT_NON_OPTION);
2181
2182        file.path = input_name;
2183
2184        if (argc > 1 && !strncmp(argv[0], "rec", strlen("rec"))) {
2185                rec_script_path = get_script_path(argv[1], RECORD_SUFFIX);
2186                if (!rec_script_path)
2187                        return cmd_record(argc, argv, NULL);
2188        }
2189
2190        if (argc > 1 && !strncmp(argv[0], "rep", strlen("rep"))) {
2191                rep_script_path = get_script_path(argv[1], REPORT_SUFFIX);
2192                if (!rep_script_path) {
2193                        fprintf(stderr,
2194                                "Please specify a valid report script"
2195                                "(see 'perf script -l' for listing)\n");
2196                        return -1;
2197                }
2198        }
2199
2200        if (itrace_synth_opts.callchain &&
2201            itrace_synth_opts.callchain_sz > scripting_max_stack)
2202                scripting_max_stack = itrace_synth_opts.callchain_sz;
2203
2204        /* make sure PERF_EXEC_PATH is set for scripts */
2205        set_argv_exec_path(get_argv_exec_path());
2206
2207        if (argc && !script_name && !rec_script_path && !rep_script_path) {
2208                int live_pipe[2];
2209                int rep_args;
2210                pid_t pid;
2211
2212                rec_script_path = get_script_path(argv[0], RECORD_SUFFIX);
2213                rep_script_path = get_script_path(argv[0], REPORT_SUFFIX);
2214
2215                if (!rec_script_path && !rep_script_path) {
2216                        usage_with_options_msg(script_usage, options,
2217                                "Couldn't find script `%s'\n\n See perf"
2218                                " script -l for available scripts.\n", argv[0]);
2219                }
2220
2221                if (is_top_script(argv[0])) {
2222                        rep_args = argc - 1;
2223                } else {
2224                        int rec_args;
2225
2226                        rep_args = has_required_arg(rep_script_path);
2227                        rec_args = (argc - 1) - rep_args;
2228                        if (rec_args < 0) {
2229                                usage_with_options_msg(script_usage, options,
2230                                        "`%s' script requires options."
2231                                        "\n\n See perf script -l for available "
2232                                        "scripts and options.\n", argv[0]);
2233                        }
2234                }
2235
2236                if (pipe(live_pipe) < 0) {
2237                        perror("failed to create pipe");
2238                        return -1;
2239                }
2240
2241                pid = fork();
2242                if (pid < 0) {
2243                        perror("failed to fork");
2244                        return -1;
2245                }
2246
2247                if (!pid) {
2248                        j = 0;
2249
2250                        dup2(live_pipe[1], 1);
2251                        close(live_pipe[0]);
2252
2253                        if (is_top_script(argv[0])) {
2254                                system_wide = true;
2255                        } else if (!system_wide) {
2256                                if (have_cmd(argc - rep_args, &argv[rep_args]) != 0) {
2257                                        err = -1;
2258                                        goto out;
2259                                }
2260                        }
2261
2262                        __argv = malloc((argc + 6) * sizeof(const char *));
2263                        if (!__argv) {
2264                                pr_err("malloc failed\n");
2265                                err = -ENOMEM;
2266                                goto out;
2267                        }
2268
2269                        __argv[j++] = "/bin/sh";
2270                        __argv[j++] = rec_script_path;
2271                        if (system_wide)
2272                                __argv[j++] = "-a";
2273                        __argv[j++] = "-q";
2274                        __argv[j++] = "-o";
2275                        __argv[j++] = "-";
2276                        for (i = rep_args + 1; i < argc; i++)
2277                                __argv[j++] = argv[i];
2278                        __argv[j++] = NULL;
2279
2280                        execvp("/bin/sh", (char **)__argv);
2281                        free(__argv);
2282                        exit(-1);
2283                }
2284
2285                dup2(live_pipe[0], 0);
2286                close(live_pipe[1]);
2287
2288                __argv = malloc((argc + 4) * sizeof(const char *));
2289                if (!__argv) {
2290                        pr_err("malloc failed\n");
2291                        err = -ENOMEM;
2292                        goto out;
2293                }
2294
2295                j = 0;
2296                __argv[j++] = "/bin/sh";
2297                __argv[j++] = rep_script_path;
2298                for (i = 1; i < rep_args + 1; i++)
2299                        __argv[j++] = argv[i];
2300                __argv[j++] = "-i";
2301                __argv[j++] = "-";
2302                __argv[j++] = NULL;
2303
2304                execvp("/bin/sh", (char **)__argv);
2305                free(__argv);
2306                exit(-1);
2307        }
2308
2309        if (rec_script_path)
2310                script_path = rec_script_path;
2311        if (rep_script_path)
2312                script_path = rep_script_path;
2313
2314        if (script_path) {
2315                j = 0;
2316
2317                if (!rec_script_path)
2318                        system_wide = false;
2319                else if (!system_wide) {
2320                        if (have_cmd(argc - 1, &argv[1]) != 0) {
2321                                err = -1;
2322                                goto out;
2323                        }
2324                }
2325
2326                __argv = malloc((argc + 2) * sizeof(const char *));
2327                if (!__argv) {
2328                        pr_err("malloc failed\n");
2329                        err = -ENOMEM;
2330                        goto out;
2331                }
2332
2333                __argv[j++] = "/bin/sh";
2334                __argv[j++] = script_path;
2335                if (system_wide)
2336                        __argv[j++] = "-a";
2337                for (i = 2; i < argc; i++)
2338                        __argv[j++] = argv[i];
2339                __argv[j++] = NULL;
2340
2341                execvp("/bin/sh", (char **)__argv);
2342                free(__argv);
2343                exit(-1);
2344        }
2345
2346        if (!script_name)
2347                setup_pager();
2348
2349        session = perf_session__new(&file, false, &script.tool);
2350        if (session == NULL)
2351                return -1;
2352
2353        if (header || header_only) {
2354                perf_session__fprintf_info(session, stdout, show_full_info);
2355                if (header_only)
2356                        goto out_delete;
2357        }
2358
2359        if (symbol__init(&session->header.env) < 0)
2360                goto out_delete;
2361
2362        script.session = session;
2363        script__setup_sample_type(&script);
2364
2365        if (output[PERF_TYPE_HARDWARE].fields & PERF_OUTPUT_CALLINDENT)
2366                itrace_synth_opts.thread_stack = true;
2367
2368        session->itrace_synth_opts = &itrace_synth_opts;
2369
2370        if (cpu_list) {
2371                err = perf_session__cpu_bitmap(session, cpu_list, cpu_bitmap);
2372                if (err < 0)
2373                        goto out_delete;
2374        }
2375
2376        if (!no_callchain)
2377                symbol_conf.use_callchain = true;
2378        else
2379                symbol_conf.use_callchain = false;
2380
2381        if (session->tevent.pevent &&
2382            pevent_set_function_resolver(session->tevent.pevent,
2383                                         machine__resolve_kernel_addr,
2384                                         &session->machines.host) < 0) {
2385                pr_err("%s: failed to set libtraceevent function resolver\n", __func__);
2386                return -1;
2387        }
2388
2389        if (generate_script_lang) {
2390                struct stat perf_stat;
2391                int input;
2392
2393                if (output_set_by_user()) {
2394                        fprintf(stderr,
2395                                "custom fields not supported for generated scripts");
2396                        err = -EINVAL;
2397                        goto out_delete;
2398                }
2399
2400                input = open(file.path, O_RDONLY);      /* input_name */
2401                if (input < 0) {
2402                        err = -errno;
2403                        perror("failed to open file");
2404                        goto out_delete;
2405                }
2406
2407                err = fstat(input, &perf_stat);
2408                if (err < 0) {
2409                        perror("failed to stat file");
2410                        goto out_delete;
2411                }
2412
2413                if (!perf_stat.st_size) {
2414                        fprintf(stderr, "zero-sized file, nothing to do!\n");
2415                        goto out_delete;
2416                }
2417
2418                scripting_ops = script_spec__lookup(generate_script_lang);
2419                if (!scripting_ops) {
2420                        fprintf(stderr, "invalid language specifier");
2421                        err = -ENOENT;
2422                        goto out_delete;
2423                }
2424
2425                err = scripting_ops->generate_script(session->tevent.pevent,
2426                                                     "perf-script");
2427                goto out_delete;
2428        }
2429
2430        if (script_name) {
2431                err = scripting_ops->start_script(script_name, argc, argv);
2432                if (err)
2433                        goto out_delete;
2434                pr_debug("perf script started with script %s\n\n", script_name);
2435                script_started = true;
2436        }
2437
2438
2439        err = perf_session__check_output_opt(session);
2440        if (err < 0)
2441                goto out_delete;
2442
2443        err = __cmd_script(&script);
2444
2445        flush_scripting();
2446
2447out_delete:
2448        perf_evlist__free_stats(session->evlist);
2449        perf_session__delete(session);
2450
2451        if (script_started)
2452                cleanup_scripting();
2453out:
2454        return err;
2455}
2456