linux/tools/perf/builtin-script.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2#include "builtin.h"
   3
   4#include "util/counts.h"
   5#include "util/debug.h"
   6#include "util/dso.h"
   7#include <subcmd/exec-cmd.h>
   8#include "util/header.h"
   9#include <subcmd/parse-options.h>
  10#include "util/perf_regs.h"
  11#include "util/session.h"
  12#include "util/tool.h"
  13#include "util/map.h"
  14#include "util/srcline.h"
  15#include "util/symbol.h"
  16#include "util/thread.h"
  17#include "util/trace-event.h"
  18#include "util/evlist.h"
  19#include "util/evsel.h"
  20#include "util/evsel_fprintf.h"
  21#include "util/evswitch.h"
  22#include "util/sort.h"
  23#include "util/data.h"
  24#include "util/auxtrace.h"
  25#include "util/cpumap.h"
  26#include "util/thread_map.h"
  27#include "util/stat.h"
  28#include "util/color.h"
  29#include "util/string2.h"
  30#include "util/thread-stack.h"
  31#include "util/time-utils.h"
  32#include "util/path.h"
  33#include "util/event.h"
  34#include "ui/ui.h"
  35#include "print_binary.h"
  36#include "archinsn.h"
  37#include <linux/bitmap.h>
  38#include <linux/kernel.h>
  39#include <linux/stringify.h>
  40#include <linux/time64.h>
  41#include <linux/zalloc.h>
  42#include <sys/utsname.h>
  43#include "asm/bug.h"
  44#include "util/mem-events.h"
  45#include "util/dump-insn.h"
  46#include <dirent.h>
  47#include <errno.h>
  48#include <inttypes.h>
  49#include <signal.h>
  50#include <sys/param.h>
  51#include <sys/types.h>
  52#include <sys/stat.h>
  53#include <fcntl.h>
  54#include <unistd.h>
  55#include <subcmd/pager.h>
  56#include <perf/evlist.h>
  57#include <linux/err.h>
  58#include "util/dlfilter.h"
  59#include "util/record.h"
  60#include "util/util.h"
  61#include "perf.h"
  62
  63#include <linux/ctype.h>
  64
  65static char const               *script_name;
  66static char const               *generate_script_lang;
  67static bool                     reltime;
  68static bool                     deltatime;
  69static u64                      initial_time;
  70static u64                      previous_time;
  71static bool                     debug_mode;
  72static u64                      last_timestamp;
  73static u64                      nr_unordered;
  74static bool                     no_callchain;
  75static bool                     latency_format;
  76static bool                     system_wide;
  77static bool                     print_flags;
  78static const char               *cpu_list;
  79static DECLARE_BITMAP(cpu_bitmap, MAX_NR_CPUS);
  80static struct perf_stat_config  stat_config;
  81static int                      max_blocks;
  82static bool                     native_arch;
  83static struct dlfilter          *dlfilter;
  84static int                      dlargc;
  85static char                     **dlargv;
  86
  87unsigned int scripting_max_stack = PERF_MAX_STACK_DEPTH;
  88
  89enum perf_output_field {
  90        PERF_OUTPUT_COMM            = 1ULL << 0,
  91        PERF_OUTPUT_TID             = 1ULL << 1,
  92        PERF_OUTPUT_PID             = 1ULL << 2,
  93        PERF_OUTPUT_TIME            = 1ULL << 3,
  94        PERF_OUTPUT_CPU             = 1ULL << 4,
  95        PERF_OUTPUT_EVNAME          = 1ULL << 5,
  96        PERF_OUTPUT_TRACE           = 1ULL << 6,
  97        PERF_OUTPUT_IP              = 1ULL << 7,
  98        PERF_OUTPUT_SYM             = 1ULL << 8,
  99        PERF_OUTPUT_DSO             = 1ULL << 9,
 100        PERF_OUTPUT_ADDR            = 1ULL << 10,
 101        PERF_OUTPUT_SYMOFFSET       = 1ULL << 11,
 102        PERF_OUTPUT_SRCLINE         = 1ULL << 12,
 103        PERF_OUTPUT_PERIOD          = 1ULL << 13,
 104        PERF_OUTPUT_IREGS           = 1ULL << 14,
 105        PERF_OUTPUT_BRSTACK         = 1ULL << 15,
 106        PERF_OUTPUT_BRSTACKSYM      = 1ULL << 16,
 107        PERF_OUTPUT_DATA_SRC        = 1ULL << 17,
 108        PERF_OUTPUT_WEIGHT          = 1ULL << 18,
 109        PERF_OUTPUT_BPF_OUTPUT      = 1ULL << 19,
 110        PERF_OUTPUT_CALLINDENT      = 1ULL << 20,
 111        PERF_OUTPUT_INSN            = 1ULL << 21,
 112        PERF_OUTPUT_INSNLEN         = 1ULL << 22,
 113        PERF_OUTPUT_BRSTACKINSN     = 1ULL << 23,
 114        PERF_OUTPUT_BRSTACKOFF      = 1ULL << 24,
 115        PERF_OUTPUT_SYNTH           = 1ULL << 25,
 116        PERF_OUTPUT_PHYS_ADDR       = 1ULL << 26,
 117        PERF_OUTPUT_UREGS           = 1ULL << 27,
 118        PERF_OUTPUT_METRIC          = 1ULL << 28,
 119        PERF_OUTPUT_MISC            = 1ULL << 29,
 120        PERF_OUTPUT_SRCCODE         = 1ULL << 30,
 121        PERF_OUTPUT_IPC             = 1ULL << 31,
 122        PERF_OUTPUT_TOD             = 1ULL << 32,
 123        PERF_OUTPUT_DATA_PAGE_SIZE  = 1ULL << 33,
 124        PERF_OUTPUT_CODE_PAGE_SIZE  = 1ULL << 34,
 125};
 126
 127struct perf_script {
 128        struct perf_tool        tool;
 129        struct perf_session     *session;
 130        bool                    show_task_events;
 131        bool                    show_mmap_events;
 132        bool                    show_switch_events;
 133        bool                    show_namespace_events;
 134        bool                    show_lost_events;
 135        bool                    show_round_events;
 136        bool                    show_bpf_events;
 137        bool                    show_cgroup_events;
 138        bool                    show_text_poke_events;
 139        bool                    allocated;
 140        bool                    per_event_dump;
 141        bool                    stitch_lbr;
 142        struct evswitch         evswitch;
 143        struct perf_cpu_map     *cpus;
 144        struct perf_thread_map *threads;
 145        int                     name_width;
 146        const char              *time_str;
 147        struct perf_time_interval *ptime_range;
 148        int                     range_size;
 149        int                     range_num;
 150};
 151
 152struct output_option {
 153        const char *str;
 154        enum perf_output_field field;
 155} all_output_options[] = {
 156        {.str = "comm",  .field = PERF_OUTPUT_COMM},
 157        {.str = "tid",   .field = PERF_OUTPUT_TID},
 158        {.str = "pid",   .field = PERF_OUTPUT_PID},
 159        {.str = "time",  .field = PERF_OUTPUT_TIME},
 160        {.str = "cpu",   .field = PERF_OUTPUT_CPU},
 161        {.str = "event", .field = PERF_OUTPUT_EVNAME},
 162        {.str = "trace", .field = PERF_OUTPUT_TRACE},
 163        {.str = "ip",    .field = PERF_OUTPUT_IP},
 164        {.str = "sym",   .field = PERF_OUTPUT_SYM},
 165        {.str = "dso",   .field = PERF_OUTPUT_DSO},
 166        {.str = "addr",  .field = PERF_OUTPUT_ADDR},
 167        {.str = "symoff", .field = PERF_OUTPUT_SYMOFFSET},
 168        {.str = "srcline", .field = PERF_OUTPUT_SRCLINE},
 169        {.str = "period", .field = PERF_OUTPUT_PERIOD},
 170        {.str = "iregs", .field = PERF_OUTPUT_IREGS},
 171        {.str = "uregs", .field = PERF_OUTPUT_UREGS},
 172        {.str = "brstack", .field = PERF_OUTPUT_BRSTACK},
 173        {.str = "brstacksym", .field = PERF_OUTPUT_BRSTACKSYM},
 174        {.str = "data_src", .field = PERF_OUTPUT_DATA_SRC},
 175        {.str = "weight",   .field = PERF_OUTPUT_WEIGHT},
 176        {.str = "bpf-output",   .field = PERF_OUTPUT_BPF_OUTPUT},
 177        {.str = "callindent", .field = PERF_OUTPUT_CALLINDENT},
 178        {.str = "insn", .field = PERF_OUTPUT_INSN},
 179        {.str = "insnlen", .field = PERF_OUTPUT_INSNLEN},
 180        {.str = "brstackinsn", .field = PERF_OUTPUT_BRSTACKINSN},
 181        {.str = "brstackoff", .field = PERF_OUTPUT_BRSTACKOFF},
 182        {.str = "synth", .field = PERF_OUTPUT_SYNTH},
 183        {.str = "phys_addr", .field = PERF_OUTPUT_PHYS_ADDR},
 184        {.str = "metric", .field = PERF_OUTPUT_METRIC},
 185        {.str = "misc", .field = PERF_OUTPUT_MISC},
 186        {.str = "srccode", .field = PERF_OUTPUT_SRCCODE},
 187        {.str = "ipc", .field = PERF_OUTPUT_IPC},
 188        {.str = "tod", .field = PERF_OUTPUT_TOD},
 189        {.str = "data_page_size", .field = PERF_OUTPUT_DATA_PAGE_SIZE},
 190        {.str = "code_page_size", .field = PERF_OUTPUT_CODE_PAGE_SIZE},
 191};
 192
 193enum {
 194        OUTPUT_TYPE_SYNTH = PERF_TYPE_MAX,
 195        OUTPUT_TYPE_OTHER,
 196        OUTPUT_TYPE_MAX
 197};
 198
 199/* default set to maintain compatibility with current format */
 200static struct {
 201        bool user_set;
 202        bool wildcard_set;
 203        unsigned int print_ip_opts;
 204        u64 fields;
 205        u64 invalid_fields;
 206        u64 user_set_fields;
 207        u64 user_unset_fields;
 208} output[OUTPUT_TYPE_MAX] = {
 209
 210        [PERF_TYPE_HARDWARE] = {
 211                .user_set = false,
 212
 213                .fields = PERF_OUTPUT_COMM | PERF_OUTPUT_TID |
 214                              PERF_OUTPUT_CPU | PERF_OUTPUT_TIME |
 215                              PERF_OUTPUT_EVNAME | PERF_OUTPUT_IP |
 216                              PERF_OUTPUT_SYM | PERF_OUTPUT_SYMOFFSET |
 217                              PERF_OUTPUT_DSO | PERF_OUTPUT_PERIOD,
 218
 219                .invalid_fields = PERF_OUTPUT_TRACE | PERF_OUTPUT_BPF_OUTPUT,
 220        },
 221
 222        [PERF_TYPE_SOFTWARE] = {
 223                .user_set = false,
 224
 225                .fields = PERF_OUTPUT_COMM | PERF_OUTPUT_TID |
 226                              PERF_OUTPUT_CPU | PERF_OUTPUT_TIME |
 227                              PERF_OUTPUT_EVNAME | PERF_OUTPUT_IP |
 228                              PERF_OUTPUT_SYM | PERF_OUTPUT_SYMOFFSET |
 229                              PERF_OUTPUT_DSO | PERF_OUTPUT_PERIOD |
 230                              PERF_OUTPUT_BPF_OUTPUT,
 231
 232                .invalid_fields = PERF_OUTPUT_TRACE,
 233        },
 234
 235        [PERF_TYPE_TRACEPOINT] = {
 236                .user_set = false,
 237
 238                .fields = PERF_OUTPUT_COMM | PERF_OUTPUT_TID |
 239                                  PERF_OUTPUT_CPU | PERF_OUTPUT_TIME |
 240                                  PERF_OUTPUT_EVNAME | PERF_OUTPUT_TRACE
 241        },
 242
 243        [PERF_TYPE_HW_CACHE] = {
 244                .user_set = false,
 245
 246                .fields = PERF_OUTPUT_COMM | PERF_OUTPUT_TID |
 247                              PERF_OUTPUT_CPU | PERF_OUTPUT_TIME |
 248                              PERF_OUTPUT_EVNAME | PERF_OUTPUT_IP |
 249                              PERF_OUTPUT_SYM | PERF_OUTPUT_SYMOFFSET |
 250                              PERF_OUTPUT_DSO | PERF_OUTPUT_PERIOD,
 251
 252                .invalid_fields = PERF_OUTPUT_TRACE | PERF_OUTPUT_BPF_OUTPUT,
 253        },
 254
 255        [PERF_TYPE_RAW] = {
 256                .user_set = false,
 257
 258                .fields = PERF_OUTPUT_COMM | PERF_OUTPUT_TID |
 259                              PERF_OUTPUT_CPU | PERF_OUTPUT_TIME |
 260                              PERF_OUTPUT_EVNAME | PERF_OUTPUT_IP |
 261                              PERF_OUTPUT_SYM | PERF_OUTPUT_SYMOFFSET |
 262                              PERF_OUTPUT_DSO | PERF_OUTPUT_PERIOD |
 263                              PERF_OUTPUT_ADDR | PERF_OUTPUT_DATA_SRC |
 264                              PERF_OUTPUT_WEIGHT | PERF_OUTPUT_PHYS_ADDR |
 265                              PERF_OUTPUT_DATA_PAGE_SIZE | PERF_OUTPUT_CODE_PAGE_SIZE,
 266
 267                .invalid_fields = PERF_OUTPUT_TRACE | PERF_OUTPUT_BPF_OUTPUT,
 268        },
 269
 270        [PERF_TYPE_BREAKPOINT] = {
 271                .user_set = false,
 272
 273                .fields = PERF_OUTPUT_COMM | PERF_OUTPUT_TID |
 274                              PERF_OUTPUT_CPU | PERF_OUTPUT_TIME |
 275                              PERF_OUTPUT_EVNAME | PERF_OUTPUT_IP |
 276                              PERF_OUTPUT_SYM | PERF_OUTPUT_SYMOFFSET |
 277                              PERF_OUTPUT_DSO | PERF_OUTPUT_PERIOD,
 278
 279                .invalid_fields = PERF_OUTPUT_TRACE | PERF_OUTPUT_BPF_OUTPUT,
 280        },
 281
 282        [OUTPUT_TYPE_SYNTH] = {
 283                .user_set = false,
 284
 285                .fields = PERF_OUTPUT_COMM | PERF_OUTPUT_TID |
 286                              PERF_OUTPUT_CPU | PERF_OUTPUT_TIME |
 287                              PERF_OUTPUT_EVNAME | PERF_OUTPUT_IP |
 288                              PERF_OUTPUT_SYM | PERF_OUTPUT_SYMOFFSET |
 289                              PERF_OUTPUT_DSO | PERF_OUTPUT_SYNTH,
 290
 291                .invalid_fields = PERF_OUTPUT_TRACE | PERF_OUTPUT_BPF_OUTPUT,
 292        },
 293
 294        [OUTPUT_TYPE_OTHER] = {
 295                .user_set = false,
 296
 297                .fields = PERF_OUTPUT_COMM | PERF_OUTPUT_TID |
 298                              PERF_OUTPUT_CPU | PERF_OUTPUT_TIME |
 299                              PERF_OUTPUT_EVNAME | PERF_OUTPUT_IP |
 300                              PERF_OUTPUT_SYM | PERF_OUTPUT_SYMOFFSET |
 301                              PERF_OUTPUT_DSO | PERF_OUTPUT_PERIOD,
 302
 303                .invalid_fields = PERF_OUTPUT_TRACE | PERF_OUTPUT_BPF_OUTPUT,
 304        },
 305};
 306
 307struct evsel_script {
 308       char *filename;
 309       FILE *fp;
 310       u64  samples;
 311       /* For metric output */
 312       u64  val;
 313       int  gnum;
 314};
 315
 316static inline struct evsel_script *evsel_script(struct evsel *evsel)
 317{
 318        return (struct evsel_script *)evsel->priv;
 319}
 320
 321static struct evsel_script *evsel_script__new(struct evsel *evsel, struct perf_data *data)
 322{
 323        struct evsel_script *es = zalloc(sizeof(*es));
 324
 325        if (es != NULL) {
 326                if (asprintf(&es->filename, "%s.%s.dump", data->file.path, evsel__name(evsel)) < 0)
 327                        goto out_free;
 328                es->fp = fopen(es->filename, "w");
 329                if (es->fp == NULL)
 330                        goto out_free_filename;
 331        }
 332
 333        return es;
 334out_free_filename:
 335        zfree(&es->filename);
 336out_free:
 337        free(es);
 338        return NULL;
 339}
 340
 341static void evsel_script__delete(struct evsel_script *es)
 342{
 343        zfree(&es->filename);
 344        fclose(es->fp);
 345        es->fp = NULL;
 346        free(es);
 347}
 348
 349static int evsel_script__fprintf(struct evsel_script *es, FILE *fp)
 350{
 351        struct stat st;
 352
 353        fstat(fileno(es->fp), &st);
 354        return fprintf(fp, "[ perf script: Wrote %.3f MB %s (%" PRIu64 " samples) ]\n",
 355                       st.st_size / 1024.0 / 1024.0, es->filename, es->samples);
 356}
 357
 358static inline int output_type(unsigned int type)
 359{
 360        switch (type) {
 361        case PERF_TYPE_SYNTH:
 362                return OUTPUT_TYPE_SYNTH;
 363        default:
 364                if (type < PERF_TYPE_MAX)
 365                        return type;
 366        }
 367
 368        return OUTPUT_TYPE_OTHER;
 369}
 370
 371static bool output_set_by_user(void)
 372{
 373        int j;
 374        for (j = 0; j < OUTPUT_TYPE_MAX; ++j) {
 375                if (output[j].user_set)
 376                        return true;
 377        }
 378        return false;
 379}
 380
 381static const char *output_field2str(enum perf_output_field field)
 382{
 383        int i, imax = ARRAY_SIZE(all_output_options);
 384        const char *str = "";
 385
 386        for (i = 0; i < imax; ++i) {
 387                if (all_output_options[i].field == field) {
 388                        str = all_output_options[i].str;
 389                        break;
 390                }
 391        }
 392        return str;
 393}
 394
 395#define PRINT_FIELD(x)  (output[output_type(attr->type)].fields & PERF_OUTPUT_##x)
 396
 397static int evsel__do_check_stype(struct evsel *evsel, u64 sample_type, const char *sample_msg,
 398                                 enum perf_output_field field, bool allow_user_set)
 399{
 400        struct perf_event_attr *attr = &evsel->core.attr;
 401        int type = output_type(attr->type);
 402        const char *evname;
 403
 404        if (attr->sample_type & sample_type)
 405                return 0;
 406
 407        if (output[type].user_set_fields & field) {
 408                if (allow_user_set)
 409                        return 0;
 410                evname = evsel__name(evsel);
 411                pr_err("Samples for '%s' event do not have %s attribute set. "
 412                       "Cannot print '%s' field.\n",
 413                       evname, sample_msg, output_field2str(field));
 414                return -1;
 415        }
 416
 417        /* user did not ask for it explicitly so remove from the default list */
 418        output[type].fields &= ~field;
 419        evname = evsel__name(evsel);
 420        pr_debug("Samples for '%s' event do not have %s attribute set. "
 421                 "Skipping '%s' field.\n",
 422                 evname, sample_msg, output_field2str(field));
 423
 424        return 0;
 425}
 426
 427static int evsel__check_stype(struct evsel *evsel, u64 sample_type, const char *sample_msg,
 428                              enum perf_output_field field)
 429{
 430        return evsel__do_check_stype(evsel, sample_type, sample_msg, field, false);
 431}
 432
 433static int evsel__check_attr(struct evsel *evsel, struct perf_session *session)
 434{
 435        struct perf_event_attr *attr = &evsel->core.attr;
 436        bool allow_user_set;
 437
 438        if (perf_header__has_feat(&session->header, HEADER_STAT))
 439                return 0;
 440
 441        allow_user_set = perf_header__has_feat(&session->header,
 442                                               HEADER_AUXTRACE);
 443
 444        if (PRINT_FIELD(TRACE) &&
 445            !perf_session__has_traces(session, "record -R"))
 446                return -EINVAL;
 447
 448        if (PRINT_FIELD(IP)) {
 449                if (evsel__check_stype(evsel, PERF_SAMPLE_IP, "IP", PERF_OUTPUT_IP))
 450                        return -EINVAL;
 451        }
 452
 453        if (PRINT_FIELD(ADDR) &&
 454            evsel__do_check_stype(evsel, PERF_SAMPLE_ADDR, "ADDR", PERF_OUTPUT_ADDR, allow_user_set))
 455                return -EINVAL;
 456
 457        if (PRINT_FIELD(DATA_SRC) &&
 458            evsel__check_stype(evsel, PERF_SAMPLE_DATA_SRC, "DATA_SRC", PERF_OUTPUT_DATA_SRC))
 459                return -EINVAL;
 460
 461        if (PRINT_FIELD(WEIGHT) &&
 462            evsel__check_stype(evsel, PERF_SAMPLE_WEIGHT_TYPE, "WEIGHT", PERF_OUTPUT_WEIGHT))
 463                return -EINVAL;
 464
 465        if (PRINT_FIELD(SYM) &&
 466            !(evsel->core.attr.sample_type & (PERF_SAMPLE_IP|PERF_SAMPLE_ADDR))) {
 467                pr_err("Display of symbols requested but neither sample IP nor "
 468                           "sample address\navailable. Hence, no addresses to convert "
 469                       "to symbols.\n");
 470                return -EINVAL;
 471        }
 472        if (PRINT_FIELD(SYMOFFSET) && !PRINT_FIELD(SYM)) {
 473                pr_err("Display of offsets requested but symbol is not"
 474                       "selected.\n");
 475                return -EINVAL;
 476        }
 477        if (PRINT_FIELD(DSO) &&
 478            !(evsel->core.attr.sample_type & (PERF_SAMPLE_IP|PERF_SAMPLE_ADDR))) {
 479                pr_err("Display of DSO requested but no address to convert.\n");
 480                return -EINVAL;
 481        }
 482        if ((PRINT_FIELD(SRCLINE) || PRINT_FIELD(SRCCODE)) && !PRINT_FIELD(IP)) {
 483                pr_err("Display of source line number requested but sample IP is not\n"
 484                       "selected. Hence, no address to lookup the source line number.\n");
 485                return -EINVAL;
 486        }
 487        if (PRINT_FIELD(BRSTACKINSN) && !allow_user_set &&
 488            !(evlist__combined_branch_type(session->evlist) & PERF_SAMPLE_BRANCH_ANY)) {
 489                pr_err("Display of branch stack assembler requested, but non all-branch filter set\n"
 490                       "Hint: run 'perf record -b ...'\n");
 491                return -EINVAL;
 492        }
 493        if ((PRINT_FIELD(PID) || PRINT_FIELD(TID)) &&
 494            evsel__check_stype(evsel, PERF_SAMPLE_TID, "TID", PERF_OUTPUT_TID|PERF_OUTPUT_PID))
 495                return -EINVAL;
 496
 497        if (PRINT_FIELD(TIME) &&
 498            evsel__check_stype(evsel, PERF_SAMPLE_TIME, "TIME", PERF_OUTPUT_TIME))
 499                return -EINVAL;
 500
 501        if (PRINT_FIELD(CPU) &&
 502            evsel__do_check_stype(evsel, PERF_SAMPLE_CPU, "CPU", PERF_OUTPUT_CPU, allow_user_set))
 503                return -EINVAL;
 504
 505        if (PRINT_FIELD(IREGS) &&
 506            evsel__do_check_stype(evsel, PERF_SAMPLE_REGS_INTR, "IREGS", PERF_OUTPUT_IREGS, allow_user_set))
 507                return -EINVAL;
 508
 509        if (PRINT_FIELD(UREGS) &&
 510            evsel__check_stype(evsel, PERF_SAMPLE_REGS_USER, "UREGS", PERF_OUTPUT_UREGS))
 511                return -EINVAL;
 512
 513        if (PRINT_FIELD(PHYS_ADDR) &&
 514            evsel__check_stype(evsel, PERF_SAMPLE_PHYS_ADDR, "PHYS_ADDR", PERF_OUTPUT_PHYS_ADDR))
 515                return -EINVAL;
 516
 517        if (PRINT_FIELD(DATA_PAGE_SIZE) &&
 518            evsel__check_stype(evsel, PERF_SAMPLE_DATA_PAGE_SIZE, "DATA_PAGE_SIZE", PERF_OUTPUT_DATA_PAGE_SIZE))
 519                return -EINVAL;
 520
 521        if (PRINT_FIELD(CODE_PAGE_SIZE) &&
 522            evsel__check_stype(evsel, PERF_SAMPLE_CODE_PAGE_SIZE, "CODE_PAGE_SIZE", PERF_OUTPUT_CODE_PAGE_SIZE))
 523                return -EINVAL;
 524
 525        return 0;
 526}
 527
 528static void set_print_ip_opts(struct perf_event_attr *attr)
 529{
 530        unsigned int type = output_type(attr->type);
 531
 532        output[type].print_ip_opts = 0;
 533        if (PRINT_FIELD(IP))
 534                output[type].print_ip_opts |= EVSEL__PRINT_IP;
 535
 536        if (PRINT_FIELD(SYM))
 537                output[type].print_ip_opts |= EVSEL__PRINT_SYM;
 538
 539        if (PRINT_FIELD(DSO))
 540                output[type].print_ip_opts |= EVSEL__PRINT_DSO;
 541
 542        if (PRINT_FIELD(SYMOFFSET))
 543                output[type].print_ip_opts |= EVSEL__PRINT_SYMOFFSET;
 544
 545        if (PRINT_FIELD(SRCLINE))
 546                output[type].print_ip_opts |= EVSEL__PRINT_SRCLINE;
 547}
 548
 549static struct evsel *find_first_output_type(struct evlist *evlist,
 550                                            unsigned int type)
 551{
 552        struct evsel *evsel;
 553
 554        evlist__for_each_entry(evlist, evsel) {
 555                if (output_type(evsel->core.attr.type) == (int)type)
 556                        return evsel;
 557        }
 558        return NULL;
 559}
 560
 561/*
 562 * verify all user requested events exist and the samples
 563 * have the expected data
 564 */
 565static int perf_session__check_output_opt(struct perf_session *session)
 566{
 567        bool tod = false;
 568        unsigned int j;
 569        struct evsel *evsel;
 570
 571        for (j = 0; j < OUTPUT_TYPE_MAX; ++j) {
 572                evsel = find_first_output_type(session->evlist, j);
 573
 574                /*
 575                 * even if fields is set to 0 (ie., show nothing) event must
 576                 * exist if user explicitly includes it on the command line
 577                 */
 578                if (!evsel && output[j].user_set && !output[j].wildcard_set &&
 579                    j != OUTPUT_TYPE_SYNTH) {
 580                        pr_err("%s events do not exist. "
 581                               "Remove corresponding -F option to proceed.\n",
 582                               event_type(j));
 583                        return -1;
 584                }
 585
 586                if (evsel && output[j].fields &&
 587                        evsel__check_attr(evsel, session))
 588                        return -1;
 589
 590                if (evsel == NULL)
 591                        continue;
 592
 593                set_print_ip_opts(&evsel->core.attr);
 594                tod |= output[j].fields & PERF_OUTPUT_TOD;
 595        }
 596
 597        if (!no_callchain) {
 598                bool use_callchain = false;
 599                bool not_pipe = false;
 600
 601                evlist__for_each_entry(session->evlist, evsel) {
 602                        not_pipe = true;
 603                        if (evsel__has_callchain(evsel)) {
 604                                use_callchain = true;
 605                                break;
 606                        }
 607                }
 608                if (not_pipe && !use_callchain)
 609                        symbol_conf.use_callchain = false;
 610        }
 611
 612        /*
 613         * set default for tracepoints to print symbols only
 614         * if callchains are present
 615         */
 616        if (symbol_conf.use_callchain &&
 617            !output[PERF_TYPE_TRACEPOINT].user_set) {
 618                j = PERF_TYPE_TRACEPOINT;
 619
 620                evlist__for_each_entry(session->evlist, evsel) {
 621                        if (evsel->core.attr.type != j)
 622                                continue;
 623
 624                        if (evsel__has_callchain(evsel)) {
 625                                output[j].fields |= PERF_OUTPUT_IP;
 626                                output[j].fields |= PERF_OUTPUT_SYM;
 627                                output[j].fields |= PERF_OUTPUT_SYMOFFSET;
 628                                output[j].fields |= PERF_OUTPUT_DSO;
 629                                set_print_ip_opts(&evsel->core.attr);
 630                                goto out;
 631                        }
 632                }
 633        }
 634
 635        if (tod && !session->header.env.clock.enabled) {
 636                pr_err("Can't provide 'tod' time, missing clock data. "
 637                       "Please record with -k/--clockid option.\n");
 638                return -1;
 639        }
 640out:
 641        return 0;
 642}
 643
 644static int perf_sample__fprintf_regs(struct regs_dump *regs, uint64_t mask,
 645                                     FILE *fp)
 646{
 647        unsigned i = 0, r;
 648        int printed = 0;
 649
 650        if (!regs || !regs->regs)
 651                return 0;
 652
 653        printed += fprintf(fp, " ABI:%" PRIu64 " ", regs->abi);
 654
 655        for_each_set_bit(r, (unsigned long *) &mask, sizeof(mask) * 8) {
 656                u64 val = regs->regs[i++];
 657                printed += fprintf(fp, "%5s:0x%"PRIx64" ", perf_reg_name(r), val);
 658        }
 659
 660        return printed;
 661}
 662
 663#define DEFAULT_TOD_FMT "%F %H:%M:%S"
 664
 665static char*
 666tod_scnprintf(struct perf_script *script, char *buf, int buflen,
 667             u64 timestamp)
 668{
 669        u64 tod_ns, clockid_ns;
 670        struct perf_env *env;
 671        unsigned long nsec;
 672        struct tm ltime;
 673        char date[64];
 674        time_t sec;
 675
 676        buf[0] = '\0';
 677        if (buflen < 64 || !script)
 678                return buf;
 679
 680        env = &script->session->header.env;
 681        if (!env->clock.enabled) {
 682                scnprintf(buf, buflen, "disabled");
 683                return buf;
 684        }
 685
 686        clockid_ns = env->clock.clockid_ns;
 687        tod_ns     = env->clock.tod_ns;
 688
 689        if (timestamp > clockid_ns)
 690                tod_ns += timestamp - clockid_ns;
 691        else
 692                tod_ns -= clockid_ns - timestamp;
 693
 694        sec  = (time_t) (tod_ns / NSEC_PER_SEC);
 695        nsec = tod_ns - sec * NSEC_PER_SEC;
 696
 697        if (localtime_r(&sec, &ltime) == NULL) {
 698                scnprintf(buf, buflen, "failed");
 699        } else {
 700                strftime(date, sizeof(date), DEFAULT_TOD_FMT, &ltime);
 701
 702                if (symbol_conf.nanosecs) {
 703                        snprintf(buf, buflen, "%s.%09lu", date, nsec);
 704                } else {
 705                        snprintf(buf, buflen, "%s.%06lu",
 706                                 date, nsec / NSEC_PER_USEC);
 707                }
 708        }
 709
 710        return buf;
 711}
 712
 713static int perf_sample__fprintf_iregs(struct perf_sample *sample,
 714                                      struct perf_event_attr *attr, FILE *fp)
 715{
 716        return perf_sample__fprintf_regs(&sample->intr_regs,
 717                                         attr->sample_regs_intr, fp);
 718}
 719
 720static int perf_sample__fprintf_uregs(struct perf_sample *sample,
 721                                      struct perf_event_attr *attr, FILE *fp)
 722{
 723        return perf_sample__fprintf_regs(&sample->user_regs,
 724                                         attr->sample_regs_user, fp);
 725}
 726
 727static int perf_sample__fprintf_start(struct perf_script *script,
 728                                      struct perf_sample *sample,
 729                                      struct thread *thread,
 730                                      struct evsel *evsel,
 731                                      u32 type, FILE *fp)
 732{
 733        struct perf_event_attr *attr = &evsel->core.attr;
 734        unsigned long secs;
 735        unsigned long long nsecs;
 736        int printed = 0;
 737        char tstr[128];
 738
 739        if (PRINT_FIELD(COMM)) {
 740                const char *comm = thread ? thread__comm_str(thread) : ":-1";
 741
 742                if (latency_format)
 743                        printed += fprintf(fp, "%8.8s ", comm);
 744                else if (PRINT_FIELD(IP) && evsel__has_callchain(evsel) && symbol_conf.use_callchain)
 745                        printed += fprintf(fp, "%s ", comm);
 746                else
 747                        printed += fprintf(fp, "%16s ", comm);
 748        }
 749
 750        if (PRINT_FIELD(PID) && PRINT_FIELD(TID))
 751                printed += fprintf(fp, "%5d/%-5d ", sample->pid, sample->tid);
 752        else if (PRINT_FIELD(PID))
 753                printed += fprintf(fp, "%5d ", sample->pid);
 754        else if (PRINT_FIELD(TID))
 755                printed += fprintf(fp, "%5d ", sample->tid);
 756
 757        if (PRINT_FIELD(CPU)) {
 758                if (latency_format)
 759                        printed += fprintf(fp, "%3d ", sample->cpu);
 760                else
 761                        printed += fprintf(fp, "[%03d] ", sample->cpu);
 762        }
 763
 764        if (PRINT_FIELD(MISC)) {
 765                int ret = 0;
 766
 767                #define has(m) \
 768                        (sample->misc & PERF_RECORD_MISC_##m) == PERF_RECORD_MISC_##m
 769
 770                if (has(KERNEL))
 771                        ret += fprintf(fp, "K");
 772                if (has(USER))
 773                        ret += fprintf(fp, "U");
 774                if (has(HYPERVISOR))
 775                        ret += fprintf(fp, "H");
 776                if (has(GUEST_KERNEL))
 777                        ret += fprintf(fp, "G");
 778                if (has(GUEST_USER))
 779                        ret += fprintf(fp, "g");
 780
 781                switch (type) {
 782                case PERF_RECORD_MMAP:
 783                case PERF_RECORD_MMAP2:
 784                        if (has(MMAP_DATA))
 785                                ret += fprintf(fp, "M");
 786                        break;
 787                case PERF_RECORD_COMM:
 788                        if (has(COMM_EXEC))
 789                                ret += fprintf(fp, "E");
 790                        break;
 791                case PERF_RECORD_SWITCH:
 792                case PERF_RECORD_SWITCH_CPU_WIDE:
 793                        if (has(SWITCH_OUT)) {
 794                                ret += fprintf(fp, "S");
 795                                if (sample->misc & PERF_RECORD_MISC_SWITCH_OUT_PREEMPT)
 796                                        ret += fprintf(fp, "p");
 797                        }
 798                default:
 799                        break;
 800                }
 801
 802                #undef has
 803
 804                ret += fprintf(fp, "%*s", 6 - ret, " ");
 805                printed += ret;
 806        }
 807
 808        if (PRINT_FIELD(TOD)) {
 809                tod_scnprintf(script, tstr, sizeof(tstr), sample->time);
 810                printed += fprintf(fp, "%s ", tstr);
 811        }
 812
 813        if (PRINT_FIELD(TIME)) {
 814                u64 t = sample->time;
 815                if (reltime) {
 816                        if (!initial_time)
 817                                initial_time = sample->time;
 818                        t = sample->time - initial_time;
 819                } else if (deltatime) {
 820                        if (previous_time)
 821                                t = sample->time - previous_time;
 822                        else {
 823                                t = 0;
 824                        }
 825                        previous_time = sample->time;
 826                }
 827                nsecs = t;
 828                secs = nsecs / NSEC_PER_SEC;
 829                nsecs -= secs * NSEC_PER_SEC;
 830
 831                if (symbol_conf.nanosecs)
 832                        printed += fprintf(fp, "%5lu.%09llu: ", secs, nsecs);
 833                else {
 834                        char sample_time[32];
 835                        timestamp__scnprintf_usec(t, sample_time, sizeof(sample_time));
 836                        printed += fprintf(fp, "%12s: ", sample_time);
 837                }
 838        }
 839
 840        return printed;
 841}
 842
 843static inline char
 844mispred_str(struct branch_entry *br)
 845{
 846        if (!(br->flags.mispred  || br->flags.predicted))
 847                return '-';
 848
 849        return br->flags.predicted ? 'P' : 'M';
 850}
 851
 852static int perf_sample__fprintf_brstack(struct perf_sample *sample,
 853                                        struct thread *thread,
 854                                        struct perf_event_attr *attr, FILE *fp)
 855{
 856        struct branch_stack *br = sample->branch_stack;
 857        struct branch_entry *entries = perf_sample__branch_entries(sample);
 858        struct addr_location alf, alt;
 859        u64 i, from, to;
 860        int printed = 0;
 861
 862        if (!(br && br->nr))
 863                return 0;
 864
 865        for (i = 0; i < br->nr; i++) {
 866                from = entries[i].from;
 867                to   = entries[i].to;
 868
 869                if (PRINT_FIELD(DSO)) {
 870                        memset(&alf, 0, sizeof(alf));
 871                        memset(&alt, 0, sizeof(alt));
 872                        thread__find_map_fb(thread, sample->cpumode, from, &alf);
 873                        thread__find_map_fb(thread, sample->cpumode, to, &alt);
 874                }
 875
 876                printed += fprintf(fp, " 0x%"PRIx64, from);
 877                if (PRINT_FIELD(DSO)) {
 878                        printed += fprintf(fp, "(");
 879                        printed += map__fprintf_dsoname(alf.map, fp);
 880                        printed += fprintf(fp, ")");
 881                }
 882
 883                printed += fprintf(fp, "/0x%"PRIx64, to);
 884                if (PRINT_FIELD(DSO)) {
 885                        printed += fprintf(fp, "(");
 886                        printed += map__fprintf_dsoname(alt.map, fp);
 887                        printed += fprintf(fp, ")");
 888                }
 889
 890                printed += fprintf(fp, "/%c/%c/%c/%d ",
 891                        mispred_str(entries + i),
 892                        entries[i].flags.in_tx ? 'X' : '-',
 893                        entries[i].flags.abort ? 'A' : '-',
 894                        entries[i].flags.cycles);
 895        }
 896
 897        return printed;
 898}
 899
 900static int perf_sample__fprintf_brstacksym(struct perf_sample *sample,
 901                                           struct thread *thread,
 902                                           struct perf_event_attr *attr, FILE *fp)
 903{
 904        struct branch_stack *br = sample->branch_stack;
 905        struct branch_entry *entries = perf_sample__branch_entries(sample);
 906        struct addr_location alf, alt;
 907        u64 i, from, to;
 908        int printed = 0;
 909
 910        if (!(br && br->nr))
 911                return 0;
 912
 913        for (i = 0; i < br->nr; i++) {
 914
 915                memset(&alf, 0, sizeof(alf));
 916                memset(&alt, 0, sizeof(alt));
 917                from = entries[i].from;
 918                to   = entries[i].to;
 919
 920                thread__find_symbol_fb(thread, sample->cpumode, from, &alf);
 921                thread__find_symbol_fb(thread, sample->cpumode, to, &alt);
 922
 923                printed += symbol__fprintf_symname_offs(alf.sym, &alf, fp);
 924                if (PRINT_FIELD(DSO)) {
 925                        printed += fprintf(fp, "(");
 926                        printed += map__fprintf_dsoname(alf.map, fp);
 927                        printed += fprintf(fp, ")");
 928                }
 929                printed += fprintf(fp, "%c", '/');
 930                printed += symbol__fprintf_symname_offs(alt.sym, &alt, fp);
 931                if (PRINT_FIELD(DSO)) {
 932                        printed += fprintf(fp, "(");
 933                        printed += map__fprintf_dsoname(alt.map, fp);
 934                        printed += fprintf(fp, ")");
 935                }
 936                printed += fprintf(fp, "/%c/%c/%c/%d ",
 937                        mispred_str(entries + i),
 938                        entries[i].flags.in_tx ? 'X' : '-',
 939                        entries[i].flags.abort ? 'A' : '-',
 940                        entries[i].flags.cycles);
 941        }
 942
 943        return printed;
 944}
 945
 946static int perf_sample__fprintf_brstackoff(struct perf_sample *sample,
 947                                           struct thread *thread,
 948                                           struct perf_event_attr *attr, FILE *fp)
 949{
 950        struct branch_stack *br = sample->branch_stack;
 951        struct branch_entry *entries = perf_sample__branch_entries(sample);
 952        struct addr_location alf, alt;
 953        u64 i, from, to;
 954        int printed = 0;
 955
 956        if (!(br && br->nr))
 957                return 0;
 958
 959        for (i = 0; i < br->nr; i++) {
 960
 961                memset(&alf, 0, sizeof(alf));
 962                memset(&alt, 0, sizeof(alt));
 963                from = entries[i].from;
 964                to   = entries[i].to;
 965
 966                if (thread__find_map_fb(thread, sample->cpumode, from, &alf) &&
 967                    !alf.map->dso->adjust_symbols)
 968                        from = map__map_ip(alf.map, from);
 969
 970                if (thread__find_map_fb(thread, sample->cpumode, to, &alt) &&
 971                    !alt.map->dso->adjust_symbols)
 972                        to = map__map_ip(alt.map, to);
 973
 974                printed += fprintf(fp, " 0x%"PRIx64, from);
 975                if (PRINT_FIELD(DSO)) {
 976                        printed += fprintf(fp, "(");
 977                        printed += map__fprintf_dsoname(alf.map, fp);
 978                        printed += fprintf(fp, ")");
 979                }
 980                printed += fprintf(fp, "/0x%"PRIx64, to);
 981                if (PRINT_FIELD(DSO)) {
 982                        printed += fprintf(fp, "(");
 983                        printed += map__fprintf_dsoname(alt.map, fp);
 984                        printed += fprintf(fp, ")");
 985                }
 986                printed += fprintf(fp, "/%c/%c/%c/%d ",
 987                        mispred_str(entries + i),
 988                        entries[i].flags.in_tx ? 'X' : '-',
 989                        entries[i].flags.abort ? 'A' : '-',
 990                        entries[i].flags.cycles);
 991        }
 992
 993        return printed;
 994}
 995#define MAXBB 16384UL
 996
 997static int grab_bb(u8 *buffer, u64 start, u64 end,
 998                    struct machine *machine, struct thread *thread,
 999                    bool *is64bit, u8 *cpumode, bool last)
1000{
1001        long offset, len;
1002        struct addr_location al;
1003        bool kernel;
1004
1005        if (!start || !end)
1006                return 0;
1007
1008        kernel = machine__kernel_ip(machine, start);
1009        if (kernel)
1010                *cpumode = PERF_RECORD_MISC_KERNEL;
1011        else
1012                *cpumode = PERF_RECORD_MISC_USER;
1013
1014        /*
1015         * Block overlaps between kernel and user.
1016         * This can happen due to ring filtering
1017         * On Intel CPUs the entry into the kernel is filtered,
1018         * but the exit is not. Let the caller patch it up.
1019         */
1020        if (kernel != machine__kernel_ip(machine, end)) {
1021                pr_debug("\tblock %" PRIx64 "-%" PRIx64 " transfers between kernel and user\n", start, end);
1022                return -ENXIO;
1023        }
1024
1025        memset(&al, 0, sizeof(al));
1026        if (end - start > MAXBB - MAXINSN) {
1027                if (last)
1028                        pr_debug("\tbrstack does not reach to final jump (%" PRIx64 "-%" PRIx64 ")\n", start, end);
1029                else
1030                        pr_debug("\tblock %" PRIx64 "-%" PRIx64 " (%" PRIu64 ") too long to dump\n", start, end, end - start);
1031                return 0;
1032        }
1033
1034        if (!thread__find_map(thread, *cpumode, start, &al) || !al.map->dso) {
1035                pr_debug("\tcannot resolve %" PRIx64 "-%" PRIx64 "\n", start, end);
1036                return 0;
1037        }
1038        if (al.map->dso->data.status == DSO_DATA_STATUS_ERROR) {
1039                pr_debug("\tcannot resolve %" PRIx64 "-%" PRIx64 "\n", start, end);
1040                return 0;
1041        }
1042
1043        /* Load maps to ensure dso->is_64_bit has been updated */
1044        map__load(al.map);
1045
1046        offset = al.map->map_ip(al.map, start);
1047        len = dso__data_read_offset(al.map->dso, machine, offset, (u8 *)buffer,
1048                                    end - start + MAXINSN);
1049
1050        *is64bit = al.map->dso->is_64_bit;
1051        if (len <= 0)
1052                pr_debug("\tcannot fetch code for block at %" PRIx64 "-%" PRIx64 "\n",
1053                        start, end);
1054        return len;
1055}
1056
1057static int map__fprintf_srccode(struct map *map, u64 addr, FILE *fp, struct srccode_state *state)
1058{
1059        char *srcfile;
1060        int ret = 0;
1061        unsigned line;
1062        int len;
1063        char *srccode;
1064
1065        if (!map || !map->dso)
1066                return 0;
1067        srcfile = get_srcline_split(map->dso,
1068                                    map__rip_2objdump(map, addr),
1069                                    &line);
1070        if (!srcfile)
1071                return 0;
1072
1073        /* Avoid redundant printing */
1074        if (state &&
1075            state->srcfile &&
1076            !strcmp(state->srcfile, srcfile) &&
1077            state->line == line) {
1078                free(srcfile);
1079                return 0;
1080        }
1081
1082        srccode = find_sourceline(srcfile, line, &len);
1083        if (!srccode)
1084                goto out_free_line;
1085
1086        ret = fprintf(fp, "|%-8d %.*s", line, len, srccode);
1087
1088        if (state) {
1089                state->srcfile = srcfile;
1090                state->line = line;
1091        }
1092        return ret;
1093
1094out_free_line:
1095        free(srcfile);
1096        return ret;
1097}
1098
1099static int print_srccode(struct thread *thread, u8 cpumode, uint64_t addr)
1100{
1101        struct addr_location al;
1102        int ret = 0;
1103
1104        memset(&al, 0, sizeof(al));
1105        thread__find_map(thread, cpumode, addr, &al);
1106        if (!al.map)
1107                return 0;
1108        ret = map__fprintf_srccode(al.map, al.addr, stdout,
1109                    &thread->srccode_state);
1110        if (ret)
1111                ret += printf("\n");
1112        return ret;
1113}
1114
1115static int ip__fprintf_jump(uint64_t ip, struct branch_entry *en,
1116                            struct perf_insn *x, u8 *inbuf, int len,
1117                            int insn, FILE *fp, int *total_cycles)
1118{
1119        int printed = fprintf(fp, "\t%016" PRIx64 "\t%-30s\t#%s%s%s%s", ip,
1120                              dump_insn(x, ip, inbuf, len, NULL),
1121                              en->flags.predicted ? " PRED" : "",
1122                              en->flags.mispred ? " MISPRED" : "",
1123                              en->flags.in_tx ? " INTX" : "",
1124                              en->flags.abort ? " ABORT" : "");
1125        if (en->flags.cycles) {
1126                *total_cycles += en->flags.cycles;
1127                printed += fprintf(fp, " %d cycles [%d]", en->flags.cycles, *total_cycles);
1128                if (insn)
1129                        printed += fprintf(fp, " %.2f IPC", (float)insn / en->flags.cycles);
1130        }
1131        return printed + fprintf(fp, "\n");
1132}
1133
1134static int ip__fprintf_sym(uint64_t addr, struct thread *thread,
1135                           u8 cpumode, int cpu, struct symbol **lastsym,
1136                           struct perf_event_attr *attr, FILE *fp)
1137{
1138        struct addr_location al;
1139        int off, printed = 0;
1140
1141        memset(&al, 0, sizeof(al));
1142
1143        thread__find_map(thread, cpumode, addr, &al);
1144
1145        if ((*lastsym) && al.addr >= (*lastsym)->start && al.addr < (*lastsym)->end)
1146                return 0;
1147
1148        al.cpu = cpu;
1149        al.sym = NULL;
1150        if (al.map)
1151                al.sym = map__find_symbol(al.map, al.addr);
1152
1153        if (!al.sym)
1154                return 0;
1155
1156        if (al.addr < al.sym->end)
1157                off = al.addr - al.sym->start;
1158        else
1159                off = al.addr - al.map->start - al.sym->start;
1160        printed += fprintf(fp, "\t%s", al.sym->name);
1161        if (off)
1162                printed += fprintf(fp, "%+d", off);
1163        printed += fprintf(fp, ":");
1164        if (PRINT_FIELD(SRCLINE))
1165                printed += map__fprintf_srcline(al.map, al.addr, "\t", fp);
1166        printed += fprintf(fp, "\n");
1167        *lastsym = al.sym;
1168
1169        return printed;
1170}
1171
1172static int perf_sample__fprintf_brstackinsn(struct perf_sample *sample,
1173                                            struct thread *thread,
1174                                            struct perf_event_attr *attr,
1175                                            struct machine *machine, FILE *fp)
1176{
1177        struct branch_stack *br = sample->branch_stack;
1178        struct branch_entry *entries = perf_sample__branch_entries(sample);
1179        u64 start, end;
1180        int i, insn, len, nr, ilen, printed = 0;
1181        struct perf_insn x;
1182        u8 buffer[MAXBB];
1183        unsigned off;
1184        struct symbol *lastsym = NULL;
1185        int total_cycles = 0;
1186
1187        if (!(br && br->nr))
1188                return 0;
1189        nr = br->nr;
1190        if (max_blocks && nr > max_blocks + 1)
1191                nr = max_blocks + 1;
1192
1193        x.thread = thread;
1194        x.cpu = sample->cpu;
1195
1196        printed += fprintf(fp, "%c", '\n');
1197
1198        /* Handle first from jump, of which we don't know the entry. */
1199        len = grab_bb(buffer, entries[nr-1].from,
1200                        entries[nr-1].from,
1201                        machine, thread, &x.is64bit, &x.cpumode, false);
1202        if (len > 0) {
1203                printed += ip__fprintf_sym(entries[nr - 1].from, thread,
1204                                           x.cpumode, x.cpu, &lastsym, attr, fp);
1205                printed += ip__fprintf_jump(entries[nr - 1].from, &entries[nr - 1],
1206                                            &x, buffer, len, 0, fp, &total_cycles);
1207                if (PRINT_FIELD(SRCCODE))
1208                        printed += print_srccode(thread, x.cpumode, entries[nr - 1].from);
1209        }
1210
1211        /* Print all blocks */
1212        for (i = nr - 2; i >= 0; i--) {
1213                if (entries[i].from || entries[i].to)
1214                        pr_debug("%d: %" PRIx64 "-%" PRIx64 "\n", i,
1215                                 entries[i].from,
1216                                 entries[i].to);
1217                start = entries[i + 1].to;
1218                end   = entries[i].from;
1219
1220                len = grab_bb(buffer, start, end, machine, thread, &x.is64bit, &x.cpumode, false);
1221                /* Patch up missing kernel transfers due to ring filters */
1222                if (len == -ENXIO && i > 0) {
1223                        end = entries[--i].from;
1224                        pr_debug("\tpatching up to %" PRIx64 "-%" PRIx64 "\n", start, end);
1225                        len = grab_bb(buffer, start, end, machine, thread, &x.is64bit, &x.cpumode, false);
1226                }
1227                if (len <= 0)
1228                        continue;
1229
1230                insn = 0;
1231                for (off = 0; off < (unsigned)len; off += ilen) {
1232                        uint64_t ip = start + off;
1233
1234                        printed += ip__fprintf_sym(ip, thread, x.cpumode, x.cpu, &lastsym, attr, fp);
1235                        if (ip == end) {
1236                                printed += ip__fprintf_jump(ip, &entries[i], &x, buffer + off, len - off, ++insn, fp,
1237                                                            &total_cycles);
1238                                if (PRINT_FIELD(SRCCODE))
1239                                        printed += print_srccode(thread, x.cpumode, ip);
1240                                break;
1241                        } else {
1242                                ilen = 0;
1243                                printed += fprintf(fp, "\t%016" PRIx64 "\t%s\n", ip,
1244                                                   dump_insn(&x, ip, buffer + off, len - off, &ilen));
1245                                if (ilen == 0)
1246                                        break;
1247                                if (PRINT_FIELD(SRCCODE))
1248                                        print_srccode(thread, x.cpumode, ip);
1249                                insn++;
1250                        }
1251                }
1252                if (off != end - start)
1253                        printed += fprintf(fp, "\tmismatch of LBR data and executable\n");
1254        }
1255
1256        /*
1257         * Hit the branch? In this case we are already done, and the target
1258         * has not been executed yet.
1259         */
1260        if (entries[0].from == sample->ip)
1261                goto out;
1262        if (entries[0].flags.abort)
1263                goto out;
1264
1265        /*
1266         * Print final block upto sample
1267         *
1268         * Due to pipeline delays the LBRs might be missing a branch
1269         * or two, which can result in very large or negative blocks
1270         * between final branch and sample. When this happens just
1271         * continue walking after the last TO until we hit a branch.
1272         */
1273        start = entries[0].to;
1274        end = sample->ip;
1275        if (end < start) {
1276                /* Missing jump. Scan 128 bytes for the next branch */
1277                end = start + 128;
1278        }
1279        len = grab_bb(buffer, start, end, machine, thread, &x.is64bit, &x.cpumode, true);
1280        printed += ip__fprintf_sym(start, thread, x.cpumode, x.cpu, &lastsym, attr, fp);
1281        if (len <= 0) {
1282                /* Print at least last IP if basic block did not work */
1283                len = grab_bb(buffer, sample->ip, sample->ip,
1284                              machine, thread, &x.is64bit, &x.cpumode, false);
1285                if (len <= 0)
1286                        goto out;
1287                printed += fprintf(fp, "\t%016" PRIx64 "\t%s\n", sample->ip,
1288                        dump_insn(&x, sample->ip, buffer, len, NULL));
1289                if (PRINT_FIELD(SRCCODE))
1290                        print_srccode(thread, x.cpumode, sample->ip);
1291                goto out;
1292        }
1293        for (off = 0; off <= end - start; off += ilen) {
1294                ilen = 0;
1295                printed += fprintf(fp, "\t%016" PRIx64 "\t%s\n", start + off,
1296                                   dump_insn(&x, start + off, buffer + off, len - off, &ilen));
1297                if (ilen == 0)
1298                        break;
1299                if (arch_is_branch(buffer + off, len - off, x.is64bit) && start + off != sample->ip) {
1300                        /*
1301                         * Hit a missing branch. Just stop.
1302                         */
1303                        printed += fprintf(fp, "\t... not reaching sample ...\n");
1304                        break;
1305                }
1306                if (PRINT_FIELD(SRCCODE))
1307                        print_srccode(thread, x.cpumode, start + off);
1308        }
1309out:
1310        return printed;
1311}
1312
1313static int perf_sample__fprintf_addr(struct perf_sample *sample,
1314                                     struct thread *thread,
1315                                     struct perf_event_attr *attr, FILE *fp)
1316{
1317        struct addr_location al;
1318        int printed = fprintf(fp, "%16" PRIx64, sample->addr);
1319
1320        if (!sample_addr_correlates_sym(attr))
1321                goto out;
1322
1323        thread__resolve(thread, &al, sample);
1324
1325        if (PRINT_FIELD(SYM)) {
1326                printed += fprintf(fp, " ");
1327                if (PRINT_FIELD(SYMOFFSET))
1328                        printed += symbol__fprintf_symname_offs(al.sym, &al, fp);
1329                else
1330                        printed += symbol__fprintf_symname(al.sym, fp);
1331        }
1332
1333        if (PRINT_FIELD(DSO)) {
1334                printed += fprintf(fp, " (");
1335                printed += map__fprintf_dsoname(al.map, fp);
1336                printed += fprintf(fp, ")");
1337        }
1338out:
1339        return printed;
1340}
1341
1342static const char *resolve_branch_sym(struct perf_sample *sample,
1343                                      struct evsel *evsel,
1344                                      struct thread *thread,
1345                                      struct addr_location *al,
1346                                      struct addr_location *addr_al,
1347                                      u64 *ip)
1348{
1349        struct perf_event_attr *attr = &evsel->core.attr;
1350        const char *name = NULL;
1351
1352        if (sample->flags & (PERF_IP_FLAG_CALL | PERF_IP_FLAG_TRACE_BEGIN)) {
1353                if (sample_addr_correlates_sym(attr)) {
1354                        if (!addr_al->thread)
1355                                thread__resolve(thread, addr_al, sample);
1356                        if (addr_al->sym)
1357                                name = addr_al->sym->name;
1358                        else
1359                                *ip = sample->addr;
1360                } else {
1361                        *ip = sample->addr;
1362                }
1363        } else if (sample->flags & (PERF_IP_FLAG_RETURN | PERF_IP_FLAG_TRACE_END)) {
1364                if (al->sym)
1365                        name = al->sym->name;
1366                else
1367                        *ip = sample->ip;
1368        }
1369        return name;
1370}
1371
1372static int perf_sample__fprintf_callindent(struct perf_sample *sample,
1373                                           struct evsel *evsel,
1374                                           struct thread *thread,
1375                                           struct addr_location *al,
1376                                           struct addr_location *addr_al,
1377                                           FILE *fp)
1378{
1379        struct perf_event_attr *attr = &evsel->core.attr;
1380        size_t depth = thread_stack__depth(thread, sample->cpu);
1381        const char *name = NULL;
1382        static int spacing;
1383        int len = 0;
1384        int dlen = 0;
1385        u64 ip = 0;
1386
1387        /*
1388         * The 'return' has already been popped off the stack so the depth has
1389         * to be adjusted to match the 'call'.
1390         */
1391        if (thread->ts && sample->flags & PERF_IP_FLAG_RETURN)
1392                depth += 1;
1393
1394        name = resolve_branch_sym(sample, evsel, thread, al, addr_al, &ip);
1395
1396        if (PRINT_FIELD(DSO) && !(PRINT_FIELD(IP) || PRINT_FIELD(ADDR))) {
1397                dlen += fprintf(fp, "(");
1398                dlen += map__fprintf_dsoname(al->map, fp);
1399                dlen += fprintf(fp, ")\t");
1400        }
1401
1402        if (name)
1403                len = fprintf(fp, "%*s%s", (int)depth * 4, "", name);
1404        else if (ip)
1405                len = fprintf(fp, "%*s%16" PRIx64, (int)depth * 4, "", ip);
1406
1407        if (len < 0)
1408                return len;
1409
1410        /*
1411         * Try to keep the output length from changing frequently so that the
1412         * output lines up more nicely.
1413         */
1414        if (len > spacing || (len && len < spacing - 52))
1415                spacing = round_up(len + 4, 32);
1416
1417        if (len < spacing)
1418                len += fprintf(fp, "%*s", spacing - len, "");
1419
1420        return len + dlen;
1421}
1422
1423__weak void arch_fetch_insn(struct perf_sample *sample __maybe_unused,
1424                            struct thread *thread __maybe_unused,
1425                            struct machine *machine __maybe_unused)
1426{
1427}
1428
1429void script_fetch_insn(struct perf_sample *sample, struct thread *thread,
1430                       struct machine *machine)
1431{
1432        if (sample->insn_len == 0 && native_arch)
1433                arch_fetch_insn(sample, thread, machine);
1434}
1435
1436static int perf_sample__fprintf_insn(struct perf_sample *sample,
1437                                     struct perf_event_attr *attr,
1438                                     struct thread *thread,
1439                                     struct machine *machine, FILE *fp)
1440{
1441        int printed = 0;
1442
1443        script_fetch_insn(sample, thread, machine);
1444
1445        if (PRINT_FIELD(INSNLEN))
1446                printed += fprintf(fp, " ilen: %d", sample->insn_len);
1447        if (PRINT_FIELD(INSN) && sample->insn_len) {
1448                int i;
1449
1450                printed += fprintf(fp, " insn:");
1451                for (i = 0; i < sample->insn_len; i++)
1452                        printed += fprintf(fp, " %02x", (unsigned char)sample->insn[i]);
1453        }
1454        if (PRINT_FIELD(BRSTACKINSN))
1455                printed += perf_sample__fprintf_brstackinsn(sample, thread, attr, machine, fp);
1456
1457        return printed;
1458}
1459
1460static int perf_sample__fprintf_ipc(struct perf_sample *sample,
1461                                    struct perf_event_attr *attr, FILE *fp)
1462{
1463        unsigned int ipc;
1464
1465        if (!PRINT_FIELD(IPC) || !sample->cyc_cnt || !sample->insn_cnt)
1466                return 0;
1467
1468        ipc = (sample->insn_cnt * 100) / sample->cyc_cnt;
1469
1470        return fprintf(fp, " \t IPC: %u.%02u (%" PRIu64 "/%" PRIu64 ") ",
1471                       ipc / 100, ipc % 100, sample->insn_cnt, sample->cyc_cnt);
1472}
1473
1474static int perf_sample__fprintf_bts(struct perf_sample *sample,
1475                                    struct evsel *evsel,
1476                                    struct thread *thread,
1477                                    struct addr_location *al,
1478                                    struct addr_location *addr_al,
1479                                    struct machine *machine, FILE *fp)
1480{
1481        struct perf_event_attr *attr = &evsel->core.attr;
1482        unsigned int type = output_type(attr->type);
1483        bool print_srcline_last = false;
1484        int printed = 0;
1485
1486        if (PRINT_FIELD(CALLINDENT))
1487                printed += perf_sample__fprintf_callindent(sample, evsel, thread, al, addr_al, fp);
1488
1489        /* print branch_from information */
1490        if (PRINT_FIELD(IP)) {
1491                unsigned int print_opts = output[type].print_ip_opts;
1492                struct callchain_cursor *cursor = NULL;
1493
1494                if (symbol_conf.use_callchain && sample->callchain &&
1495                    thread__resolve_callchain(al->thread, &callchain_cursor, evsel,
1496                                              sample, NULL, NULL, scripting_max_stack) == 0)
1497                        cursor = &callchain_cursor;
1498
1499                if (cursor == NULL) {
1500                        printed += fprintf(fp, " ");
1501                        if (print_opts & EVSEL__PRINT_SRCLINE) {
1502                                print_srcline_last = true;
1503                                print_opts &= ~EVSEL__PRINT_SRCLINE;
1504                        }
1505                } else
1506                        printed += fprintf(fp, "\n");
1507
1508                printed += sample__fprintf_sym(sample, al, 0, print_opts, cursor,
1509                                               symbol_conf.bt_stop_list, fp);
1510        }
1511
1512        /* print branch_to information */
1513        if (PRINT_FIELD(ADDR) ||
1514            ((evsel->core.attr.sample_type & PERF_SAMPLE_ADDR) &&
1515             !output[type].user_set)) {
1516                printed += fprintf(fp, " => ");
1517                printed += perf_sample__fprintf_addr(sample, thread, attr, fp);
1518        }
1519
1520        printed += perf_sample__fprintf_ipc(sample, attr, fp);
1521
1522        if (print_srcline_last)
1523                printed += map__fprintf_srcline(al->map, al->addr, "\n  ", fp);
1524
1525        printed += perf_sample__fprintf_insn(sample, attr, thread, machine, fp);
1526        printed += fprintf(fp, "\n");
1527        if (PRINT_FIELD(SRCCODE)) {
1528                int ret = map__fprintf_srccode(al->map, al->addr, stdout,
1529                                         &thread->srccode_state);
1530                if (ret) {
1531                        printed += ret;
1532                        printed += printf("\n");
1533                }
1534        }
1535        return printed;
1536}
1537
1538static struct {
1539        u32 flags;
1540        const char *name;
1541} sample_flags[] = {
1542        {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_CALL, "call"},
1543        {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_RETURN, "return"},
1544        {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_CONDITIONAL, "jcc"},
1545        {PERF_IP_FLAG_BRANCH, "jmp"},
1546        {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_CALL | PERF_IP_FLAG_INTERRUPT, "int"},
1547        {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_RETURN | PERF_IP_FLAG_INTERRUPT, "iret"},
1548        {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_CALL | PERF_IP_FLAG_SYSCALLRET, "syscall"},
1549        {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_RETURN | PERF_IP_FLAG_SYSCALLRET, "sysret"},
1550        {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_ASYNC, "async"},
1551        {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_CALL | PERF_IP_FLAG_ASYNC | PERF_IP_FLAG_INTERRUPT, "hw int"},
1552        {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_TX_ABORT, "tx abrt"},
1553        {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_TRACE_BEGIN, "tr strt"},
1554        {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_TRACE_END, "tr end"},
1555        {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_CALL | PERF_IP_FLAG_VMENTRY, "vmentry"},
1556        {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_CALL | PERF_IP_FLAG_VMEXIT, "vmexit"},
1557        {0, NULL}
1558};
1559
1560static const char *sample_flags_to_name(u32 flags)
1561{
1562        int i;
1563
1564        for (i = 0; sample_flags[i].name ; i++) {
1565                if (sample_flags[i].flags == flags)
1566                        return sample_flags[i].name;
1567        }
1568
1569        return NULL;
1570}
1571
1572int perf_sample__sprintf_flags(u32 flags, char *str, size_t sz)
1573{
1574        const char *chars = PERF_IP_FLAG_CHARS;
1575        const size_t n = strlen(PERF_IP_FLAG_CHARS);
1576        bool in_tx = flags & PERF_IP_FLAG_IN_TX;
1577        const char *name = NULL;
1578        size_t i, pos = 0;
1579
1580        name = sample_flags_to_name(flags & ~PERF_IP_FLAG_IN_TX);
1581        if (name)
1582                return snprintf(str, sz, "%-15s%4s", name, in_tx ? "(x)" : "");
1583
1584        if (flags & PERF_IP_FLAG_TRACE_BEGIN) {
1585                name = sample_flags_to_name(flags & ~(PERF_IP_FLAG_IN_TX | PERF_IP_FLAG_TRACE_BEGIN));
1586                if (name)
1587                        return snprintf(str, sz, "tr strt %-7s%4s", name, in_tx ? "(x)" : "");
1588        }
1589
1590        if (flags & PERF_IP_FLAG_TRACE_END) {
1591                name = sample_flags_to_name(flags & ~(PERF_IP_FLAG_IN_TX | PERF_IP_FLAG_TRACE_END));
1592                if (name)
1593                        return snprintf(str, sz, "tr end  %-7s%4s", name, in_tx ? "(x)" : "");
1594        }
1595
1596        for (i = 0; i < n; i++, flags >>= 1) {
1597                if ((flags & 1) && pos < sz)
1598                        str[pos++] = chars[i];
1599        }
1600        for (; i < 32; i++, flags >>= 1) {
1601                if ((flags & 1) && pos < sz)
1602                        str[pos++] = '?';
1603        }
1604        if (pos < sz)
1605                str[pos] = 0;
1606
1607        return pos;
1608}
1609
1610static int perf_sample__fprintf_flags(u32 flags, FILE *fp)
1611{
1612        char str[SAMPLE_FLAGS_BUF_SIZE];
1613
1614        perf_sample__sprintf_flags(flags, str, sizeof(str));
1615        return fprintf(fp, "  %-19s ", str);
1616}
1617
1618struct printer_data {
1619        int line_no;
1620        bool hit_nul;
1621        bool is_printable;
1622};
1623
1624static int sample__fprintf_bpf_output(enum binary_printer_ops op,
1625                                      unsigned int val,
1626                                      void *extra, FILE *fp)
1627{
1628        unsigned char ch = (unsigned char)val;
1629        struct printer_data *printer_data = extra;
1630        int printed = 0;
1631
1632        switch (op) {
1633        case BINARY_PRINT_DATA_BEGIN:
1634                printed += fprintf(fp, "\n");
1635                break;
1636        case BINARY_PRINT_LINE_BEGIN:
1637                printed += fprintf(fp, "%17s", !printer_data->line_no ? "BPF output:" :
1638                                                        "           ");
1639                break;
1640        case BINARY_PRINT_ADDR:
1641                printed += fprintf(fp, " %04x:", val);
1642                break;
1643        case BINARY_PRINT_NUM_DATA:
1644                printed += fprintf(fp, " %02x", val);
1645                break;
1646        case BINARY_PRINT_NUM_PAD:
1647                printed += fprintf(fp, "   ");
1648                break;
1649        case BINARY_PRINT_SEP:
1650                printed += fprintf(fp, "  ");
1651                break;
1652        case BINARY_PRINT_CHAR_DATA:
1653                if (printer_data->hit_nul && ch)
1654                        printer_data->is_printable = false;
1655
1656                if (!isprint(ch)) {
1657                        printed += fprintf(fp, "%c", '.');
1658
1659                        if (!printer_data->is_printable)
1660                                break;
1661
1662                        if (ch == '\0')
1663                                printer_data->hit_nul = true;
1664                        else
1665                                printer_data->is_printable = false;
1666                } else {
1667                        printed += fprintf(fp, "%c", ch);
1668                }
1669                break;
1670        case BINARY_PRINT_CHAR_PAD:
1671                printed += fprintf(fp, " ");
1672                break;
1673        case BINARY_PRINT_LINE_END:
1674                printed += fprintf(fp, "\n");
1675                printer_data->line_no++;
1676                break;
1677        case BINARY_PRINT_DATA_END:
1678        default:
1679                break;
1680        }
1681
1682        return printed;
1683}
1684
1685static int perf_sample__fprintf_bpf_output(struct perf_sample *sample, FILE *fp)
1686{
1687        unsigned int nr_bytes = sample->raw_size;
1688        struct printer_data printer_data = {0, false, true};
1689        int printed = binary__fprintf(sample->raw_data, nr_bytes, 8,
1690                                      sample__fprintf_bpf_output, &printer_data, fp);
1691
1692        if (printer_data.is_printable && printer_data.hit_nul)
1693                printed += fprintf(fp, "%17s \"%s\"\n", "BPF string:", (char *)(sample->raw_data));
1694
1695        return printed;
1696}
1697
1698static int perf_sample__fprintf_spacing(int len, int spacing, FILE *fp)
1699{
1700        if (len > 0 && len < spacing)
1701                return fprintf(fp, "%*s", spacing - len, "");
1702
1703        return 0;
1704}
1705
1706static int perf_sample__fprintf_pt_spacing(int len, FILE *fp)
1707{
1708        return perf_sample__fprintf_spacing(len, 34, fp);
1709}
1710
1711static int perf_sample__fprintf_synth_ptwrite(struct perf_sample *sample, FILE *fp)
1712{
1713        struct perf_synth_intel_ptwrite *data = perf_sample__synth_ptr(sample);
1714        int len;
1715
1716        if (perf_sample__bad_synth_size(sample, *data))
1717                return 0;
1718
1719        len = fprintf(fp, " IP: %u payload: %#" PRIx64 " ",
1720                     data->ip, le64_to_cpu(data->payload));
1721        return len + perf_sample__fprintf_pt_spacing(len, fp);
1722}
1723
1724static int perf_sample__fprintf_synth_mwait(struct perf_sample *sample, FILE *fp)
1725{
1726        struct perf_synth_intel_mwait *data = perf_sample__synth_ptr(sample);
1727        int len;
1728
1729        if (perf_sample__bad_synth_size(sample, *data))
1730                return 0;
1731
1732        len = fprintf(fp, " hints: %#x extensions: %#x ",
1733                      data->hints, data->extensions);
1734        return len + perf_sample__fprintf_pt_spacing(len, fp);
1735}
1736
1737static int perf_sample__fprintf_synth_pwre(struct perf_sample *sample, FILE *fp)
1738{
1739        struct perf_synth_intel_pwre *data = perf_sample__synth_ptr(sample);
1740        int len;
1741
1742        if (perf_sample__bad_synth_size(sample, *data))
1743                return 0;
1744
1745        len = fprintf(fp, " hw: %u cstate: %u sub-cstate: %u ",
1746                      data->hw, data->cstate, data->subcstate);
1747        return len + perf_sample__fprintf_pt_spacing(len, fp);
1748}
1749
1750static int perf_sample__fprintf_synth_exstop(struct perf_sample *sample, FILE *fp)
1751{
1752        struct perf_synth_intel_exstop *data = perf_sample__synth_ptr(sample);
1753        int len;
1754
1755        if (perf_sample__bad_synth_size(sample, *data))
1756                return 0;
1757
1758        len = fprintf(fp, " IP: %u ", data->ip);
1759        return len + perf_sample__fprintf_pt_spacing(len, fp);
1760}
1761
1762static int perf_sample__fprintf_synth_pwrx(struct perf_sample *sample, FILE *fp)
1763{
1764        struct perf_synth_intel_pwrx *data = perf_sample__synth_ptr(sample);
1765        int len;
1766
1767        if (perf_sample__bad_synth_size(sample, *data))
1768                return 0;
1769
1770        len = fprintf(fp, " deepest cstate: %u last cstate: %u wake reason: %#x ",
1771                     data->deepest_cstate, data->last_cstate,
1772                     data->wake_reason);
1773        return len + perf_sample__fprintf_pt_spacing(len, fp);
1774}
1775
1776static int perf_sample__fprintf_synth_cbr(struct perf_sample *sample, FILE *fp)
1777{
1778        struct perf_synth_intel_cbr *data = perf_sample__synth_ptr(sample);
1779        unsigned int percent, freq;
1780        int len;
1781
1782        if (perf_sample__bad_synth_size(sample, *data))
1783                return 0;
1784
1785        freq = (le32_to_cpu(data->freq) + 500) / 1000;
1786        len = fprintf(fp, " cbr: %2u freq: %4u MHz ", data->cbr, freq);
1787        if (data->max_nonturbo) {
1788                percent = (5 + (1000 * data->cbr) / data->max_nonturbo) / 10;
1789                len += fprintf(fp, "(%3u%%) ", percent);
1790        }
1791        return len + perf_sample__fprintf_pt_spacing(len, fp);
1792}
1793
1794static int perf_sample__fprintf_synth_psb(struct perf_sample *sample, FILE *fp)
1795{
1796        struct perf_synth_intel_psb *data = perf_sample__synth_ptr(sample);
1797        int len;
1798
1799        if (perf_sample__bad_synth_size(sample, *data))
1800                return 0;
1801
1802        len = fprintf(fp, " psb offs: %#" PRIx64, data->offset);
1803        return len + perf_sample__fprintf_pt_spacing(len, fp);
1804}
1805
1806static int perf_sample__fprintf_synth(struct perf_sample *sample,
1807                                      struct evsel *evsel, FILE *fp)
1808{
1809        switch (evsel->core.attr.config) {
1810        case PERF_SYNTH_INTEL_PTWRITE:
1811                return perf_sample__fprintf_synth_ptwrite(sample, fp);
1812        case PERF_SYNTH_INTEL_MWAIT:
1813                return perf_sample__fprintf_synth_mwait(sample, fp);
1814        case PERF_SYNTH_INTEL_PWRE:
1815                return perf_sample__fprintf_synth_pwre(sample, fp);
1816        case PERF_SYNTH_INTEL_EXSTOP:
1817                return perf_sample__fprintf_synth_exstop(sample, fp);
1818        case PERF_SYNTH_INTEL_PWRX:
1819                return perf_sample__fprintf_synth_pwrx(sample, fp);
1820        case PERF_SYNTH_INTEL_CBR:
1821                return perf_sample__fprintf_synth_cbr(sample, fp);
1822        case PERF_SYNTH_INTEL_PSB:
1823                return perf_sample__fprintf_synth_psb(sample, fp);
1824        default:
1825                break;
1826        }
1827
1828        return 0;
1829}
1830
1831static int evlist__max_name_len(struct evlist *evlist)
1832{
1833        struct evsel *evsel;
1834        int max = 0;
1835
1836        evlist__for_each_entry(evlist, evsel) {
1837                int len = strlen(evsel__name(evsel));
1838
1839                max = MAX(len, max);
1840        }
1841
1842        return max;
1843}
1844
1845static int data_src__fprintf(u64 data_src, FILE *fp)
1846{
1847        struct mem_info mi = { .data_src.val = data_src };
1848        char decode[100];
1849        char out[100];
1850        static int maxlen;
1851        int len;
1852
1853        perf_script__meminfo_scnprintf(decode, 100, &mi);
1854
1855        len = scnprintf(out, 100, "%16" PRIx64 " %s", data_src, decode);
1856        if (maxlen < len)
1857                maxlen = len;
1858
1859        return fprintf(fp, "%-*s", maxlen, out);
1860}
1861
1862struct metric_ctx {
1863        struct perf_sample      *sample;
1864        struct thread           *thread;
1865        struct evsel    *evsel;
1866        FILE                    *fp;
1867};
1868
1869static void script_print_metric(struct perf_stat_config *config __maybe_unused,
1870                                void *ctx, const char *color,
1871                                const char *fmt,
1872                                const char *unit, double val)
1873{
1874        struct metric_ctx *mctx = ctx;
1875
1876        if (!fmt)
1877                return;
1878        perf_sample__fprintf_start(NULL, mctx->sample, mctx->thread, mctx->evsel,
1879                                   PERF_RECORD_SAMPLE, mctx->fp);
1880        fputs("\tmetric: ", mctx->fp);
1881        if (color)
1882                color_fprintf(mctx->fp, color, fmt, val);
1883        else
1884                printf(fmt, val);
1885        fprintf(mctx->fp, " %s\n", unit);
1886}
1887
1888static void script_new_line(struct perf_stat_config *config __maybe_unused,
1889                            void *ctx)
1890{
1891        struct metric_ctx *mctx = ctx;
1892
1893        perf_sample__fprintf_start(NULL, mctx->sample, mctx->thread, mctx->evsel,
1894                                   PERF_RECORD_SAMPLE, mctx->fp);
1895        fputs("\tmetric: ", mctx->fp);
1896}
1897
1898static void perf_sample__fprint_metric(struct perf_script *script,
1899                                       struct thread *thread,
1900                                       struct evsel *evsel,
1901                                       struct perf_sample *sample,
1902                                       FILE *fp)
1903{
1904        struct evsel *leader = evsel__leader(evsel);
1905        struct perf_stat_output_ctx ctx = {
1906                .print_metric = script_print_metric,
1907                .new_line = script_new_line,
1908                .ctx = &(struct metric_ctx) {
1909                                .sample = sample,
1910                                .thread = thread,
1911                                .evsel  = evsel,
1912                                .fp     = fp,
1913                         },
1914                .force_header = false,
1915        };
1916        struct evsel *ev2;
1917        u64 val;
1918
1919        if (!evsel->stats)
1920                evlist__alloc_stats(script->session->evlist, false);
1921        if (evsel_script(leader)->gnum++ == 0)
1922                perf_stat__reset_shadow_stats();
1923        val = sample->period * evsel->scale;
1924        perf_stat__update_shadow_stats(evsel,
1925                                       val,
1926                                       sample->cpu,
1927                                       &rt_stat);
1928        evsel_script(evsel)->val = val;
1929        if (evsel_script(leader)->gnum == leader->core.nr_members) {
1930                for_each_group_member (ev2, leader) {
1931                        perf_stat__print_shadow_stats(&stat_config, ev2,
1932                                                      evsel_script(ev2)->val,
1933                                                      sample->cpu,
1934                                                      &ctx,
1935                                                      NULL,
1936                                                      &rt_stat);
1937                }
1938                evsel_script(leader)->gnum = 0;
1939        }
1940}
1941
1942static bool show_event(struct perf_sample *sample,
1943                       struct evsel *evsel,
1944                       struct thread *thread,
1945                       struct addr_location *al,
1946                       struct addr_location *addr_al)
1947{
1948        int depth = thread_stack__depth(thread, sample->cpu);
1949
1950        if (!symbol_conf.graph_function)
1951                return true;
1952
1953        if (thread->filter) {
1954                if (depth <= thread->filter_entry_depth) {
1955                        thread->filter = false;
1956                        return false;
1957                }
1958                return true;
1959        } else {
1960                const char *s = symbol_conf.graph_function;
1961                u64 ip;
1962                const char *name = resolve_branch_sym(sample, evsel, thread, al, addr_al,
1963                                &ip);
1964                unsigned nlen;
1965
1966                if (!name)
1967                        return false;
1968                nlen = strlen(name);
1969                while (*s) {
1970                        unsigned len = strcspn(s, ",");
1971                        if (nlen == len && !strncmp(name, s, len)) {
1972                                thread->filter = true;
1973                                thread->filter_entry_depth = depth;
1974                                return true;
1975                        }
1976                        s += len;
1977                        if (*s == ',')
1978                                s++;
1979                }
1980                return false;
1981        }
1982}
1983
1984static void process_event(struct perf_script *script,
1985                          struct perf_sample *sample, struct evsel *evsel,
1986                          struct addr_location *al,
1987                          struct addr_location *addr_al,
1988                          struct machine *machine)
1989{
1990        struct thread *thread = al->thread;
1991        struct perf_event_attr *attr = &evsel->core.attr;
1992        unsigned int type = output_type(attr->type);
1993        struct evsel_script *es = evsel->priv;
1994        FILE *fp = es->fp;
1995        char str[PAGE_SIZE_NAME_LEN];
1996
1997        if (output[type].fields == 0)
1998                return;
1999
2000        ++es->samples;
2001
2002        perf_sample__fprintf_start(script, sample, thread, evsel,
2003                                   PERF_RECORD_SAMPLE, fp);
2004
2005        if (PRINT_FIELD(PERIOD))
2006                fprintf(fp, "%10" PRIu64 " ", sample->period);
2007
2008        if (PRINT_FIELD(EVNAME)) {
2009                const char *evname = evsel__name(evsel);
2010
2011                if (!script->name_width)
2012                        script->name_width = evlist__max_name_len(script->session->evlist);
2013
2014                fprintf(fp, "%*s: ", script->name_width, evname ?: "[unknown]");
2015        }
2016
2017        if (print_flags)
2018                perf_sample__fprintf_flags(sample->flags, fp);
2019
2020        if (is_bts_event(attr)) {
2021                perf_sample__fprintf_bts(sample, evsel, thread, al, addr_al, machine, fp);
2022                return;
2023        }
2024
2025        if (PRINT_FIELD(TRACE) && sample->raw_data) {
2026                event_format__fprintf(evsel->tp_format, sample->cpu,
2027                                      sample->raw_data, sample->raw_size, fp);
2028        }
2029
2030        if (attr->type == PERF_TYPE_SYNTH && PRINT_FIELD(SYNTH))
2031                perf_sample__fprintf_synth(sample, evsel, fp);
2032
2033        if (PRINT_FIELD(ADDR))
2034                perf_sample__fprintf_addr(sample, thread, attr, fp);
2035
2036        if (PRINT_FIELD(DATA_SRC))
2037                data_src__fprintf(sample->data_src, fp);
2038
2039        if (PRINT_FIELD(WEIGHT))
2040                fprintf(fp, "%16" PRIu64, sample->weight);
2041
2042        if (PRINT_FIELD(IP)) {
2043                struct callchain_cursor *cursor = NULL;
2044
2045                if (script->stitch_lbr)
2046                        al->thread->lbr_stitch_enable = true;
2047
2048                if (symbol_conf.use_callchain && sample->callchain &&
2049                    thread__resolve_callchain(al->thread, &callchain_cursor, evsel,
2050                                              sample, NULL, NULL, scripting_max_stack) == 0)
2051                        cursor = &callchain_cursor;
2052
2053                fputc(cursor ? '\n' : ' ', fp);
2054                sample__fprintf_sym(sample, al, 0, output[type].print_ip_opts, cursor,
2055                                    symbol_conf.bt_stop_list, fp);
2056        }
2057
2058        if (PRINT_FIELD(IREGS))
2059                perf_sample__fprintf_iregs(sample, attr, fp);
2060
2061        if (PRINT_FIELD(UREGS))
2062                perf_sample__fprintf_uregs(sample, attr, fp);
2063
2064        if (PRINT_FIELD(BRSTACK))
2065                perf_sample__fprintf_brstack(sample, thread, attr, fp);
2066        else if (PRINT_FIELD(BRSTACKSYM))
2067                perf_sample__fprintf_brstacksym(sample, thread, attr, fp);
2068        else if (PRINT_FIELD(BRSTACKOFF))
2069                perf_sample__fprintf_brstackoff(sample, thread, attr, fp);
2070
2071        if (evsel__is_bpf_output(evsel) && PRINT_FIELD(BPF_OUTPUT))
2072                perf_sample__fprintf_bpf_output(sample, fp);
2073        perf_sample__fprintf_insn(sample, attr, thread, machine, fp);
2074
2075        if (PRINT_FIELD(PHYS_ADDR))
2076                fprintf(fp, "%16" PRIx64, sample->phys_addr);
2077
2078        if (PRINT_FIELD(DATA_PAGE_SIZE))
2079                fprintf(fp, " %s", get_page_size_name(sample->data_page_size, str));
2080
2081        if (PRINT_FIELD(CODE_PAGE_SIZE))
2082                fprintf(fp, " %s", get_page_size_name(sample->code_page_size, str));
2083
2084        perf_sample__fprintf_ipc(sample, attr, fp);
2085
2086        fprintf(fp, "\n");
2087
2088        if (PRINT_FIELD(SRCCODE)) {
2089                if (map__fprintf_srccode(al->map, al->addr, stdout,
2090                                         &thread->srccode_state))
2091                        printf("\n");
2092        }
2093
2094        if (PRINT_FIELD(METRIC))
2095                perf_sample__fprint_metric(script, thread, evsel, sample, fp);
2096
2097        if (verbose)
2098                fflush(fp);
2099}
2100
2101static struct scripting_ops     *scripting_ops;
2102
2103static void __process_stat(struct evsel *counter, u64 tstamp)
2104{
2105        int nthreads = perf_thread_map__nr(counter->core.threads);
2106        int ncpus = evsel__nr_cpus(counter);
2107        int cpu, thread;
2108        static int header_printed;
2109
2110        if (counter->core.system_wide)
2111                nthreads = 1;
2112
2113        if (!header_printed) {
2114                printf("%3s %8s %15s %15s %15s %15s %s\n",
2115                       "CPU", "THREAD", "VAL", "ENA", "RUN", "TIME", "EVENT");
2116                header_printed = 1;
2117        }
2118
2119        for (thread = 0; thread < nthreads; thread++) {
2120                for (cpu = 0; cpu < ncpus; cpu++) {
2121                        struct perf_counts_values *counts;
2122
2123                        counts = perf_counts(counter->counts, cpu, thread);
2124
2125                        printf("%3d %8d %15" PRIu64 " %15" PRIu64 " %15" PRIu64 " %15" PRIu64 " %s\n",
2126                                counter->core.cpus->map[cpu],
2127                                perf_thread_map__pid(counter->core.threads, thread),
2128                                counts->val,
2129                                counts->ena,
2130                                counts->run,
2131                                tstamp,
2132                                evsel__name(counter));
2133                }
2134        }
2135}
2136
2137static void process_stat(struct evsel *counter, u64 tstamp)
2138{
2139        if (scripting_ops && scripting_ops->process_stat)
2140                scripting_ops->process_stat(&stat_config, counter, tstamp);
2141        else
2142                __process_stat(counter, tstamp);
2143}
2144
2145static void process_stat_interval(u64 tstamp)
2146{
2147        if (scripting_ops && scripting_ops->process_stat_interval)
2148                scripting_ops->process_stat_interval(tstamp);
2149}
2150
2151static void setup_scripting(void)
2152{
2153        setup_perl_scripting();
2154        setup_python_scripting();
2155}
2156
2157static int flush_scripting(void)
2158{
2159        return scripting_ops ? scripting_ops->flush_script() : 0;
2160}
2161
2162static int cleanup_scripting(void)
2163{
2164        pr_debug("\nperf script stopped\n");
2165
2166        return scripting_ops ? scripting_ops->stop_script() : 0;
2167}
2168
2169static bool filter_cpu(struct perf_sample *sample)
2170{
2171        if (cpu_list && sample->cpu != (u32)-1)
2172                return !test_bit(sample->cpu, cpu_bitmap);
2173        return false;
2174}
2175
2176static int process_sample_event(struct perf_tool *tool,
2177                                union perf_event *event,
2178                                struct perf_sample *sample,
2179                                struct evsel *evsel,
2180                                struct machine *machine)
2181{
2182        struct perf_script *scr = container_of(tool, struct perf_script, tool);
2183        struct addr_location al;
2184        struct addr_location addr_al;
2185        int ret = 0;
2186
2187        /* Set thread to NULL to indicate addr_al and al are not initialized */
2188        addr_al.thread = NULL;
2189        al.thread = NULL;
2190
2191        ret = dlfilter__filter_event_early(dlfilter, event, sample, evsel, machine, &al, &addr_al);
2192        if (ret) {
2193                if (ret > 0)
2194                        ret = 0;
2195                goto out_put;
2196        }
2197
2198        if (perf_time__ranges_skip_sample(scr->ptime_range, scr->range_num,
2199                                          sample->time)) {
2200                goto out_put;
2201        }
2202
2203        if (debug_mode) {
2204                if (sample->time < last_timestamp) {
2205                        pr_err("Samples misordered, previous: %" PRIu64
2206                                " this: %" PRIu64 "\n", last_timestamp,
2207                                sample->time);
2208                        nr_unordered++;
2209                }
2210                last_timestamp = sample->time;
2211                goto out_put;
2212        }
2213
2214        if (filter_cpu(sample))
2215                goto out_put;
2216
2217        if (!al.thread && machine__resolve(machine, &al, sample) < 0) {
2218                pr_err("problem processing %d event, skipping it.\n",
2219                       event->header.type);
2220                ret = -1;
2221                goto out_put;
2222        }
2223
2224        if (al.filtered)
2225                goto out_put;
2226
2227        if (!show_event(sample, evsel, al.thread, &al, &addr_al))
2228                goto out_put;
2229
2230        if (evswitch__discard(&scr->evswitch, evsel))
2231                goto out_put;
2232
2233        ret = dlfilter__filter_event(dlfilter, event, sample, evsel, machine, &al, &addr_al);
2234        if (ret) {
2235                if (ret > 0)
2236                        ret = 0;
2237                goto out_put;
2238        }
2239
2240        if (scripting_ops) {
2241                struct addr_location *addr_al_ptr = NULL;
2242
2243                if ((evsel->core.attr.sample_type & PERF_SAMPLE_ADDR) &&
2244                    sample_addr_correlates_sym(&evsel->core.attr)) {
2245                        if (!addr_al.thread)
2246                                thread__resolve(al.thread, &addr_al, sample);
2247                        addr_al_ptr = &addr_al;
2248                }
2249                scripting_ops->process_event(event, sample, evsel, &al, addr_al_ptr);
2250        } else {
2251                process_event(scr, sample, evsel, &al, &addr_al, machine);
2252        }
2253
2254out_put:
2255        if (al.thread)
2256                addr_location__put(&al);
2257        return ret;
2258}
2259
2260static int process_attr(struct perf_tool *tool, union perf_event *event,
2261                        struct evlist **pevlist)
2262{
2263        struct perf_script *scr = container_of(tool, struct perf_script, tool);
2264        struct evlist *evlist;
2265        struct evsel *evsel, *pos;
2266        u64 sample_type;
2267        int err;
2268        static struct evsel_script *es;
2269
2270        err = perf_event__process_attr(tool, event, pevlist);
2271        if (err)
2272                return err;
2273
2274        evlist = *pevlist;
2275        evsel = evlist__last(*pevlist);
2276
2277        if (!evsel->priv) {
2278                if (scr->per_event_dump) {
2279                        evsel->priv = evsel_script__new(evsel, scr->session->data);
2280                } else {
2281                        es = zalloc(sizeof(*es));
2282                        if (!es)
2283                                return -ENOMEM;
2284                        es->fp = stdout;
2285                        evsel->priv = es;
2286                }
2287        }
2288
2289        if (evsel->core.attr.type >= PERF_TYPE_MAX &&
2290            evsel->core.attr.type != PERF_TYPE_SYNTH)
2291                return 0;
2292
2293        evlist__for_each_entry(evlist, pos) {
2294                if (pos->core.attr.type == evsel->core.attr.type && pos != evsel)
2295                        return 0;
2296        }
2297
2298        if (evsel->core.attr.sample_type) {
2299                err = evsel__check_attr(evsel, scr->session);
2300                if (err)
2301                        return err;
2302        }
2303
2304        /*
2305         * Check if we need to enable callchains based
2306         * on events sample_type.
2307         */
2308        sample_type = evlist__combined_sample_type(evlist);
2309        callchain_param_setup(sample_type);
2310
2311        /* Enable fields for callchain entries */
2312        if (symbol_conf.use_callchain &&
2313            (sample_type & PERF_SAMPLE_CALLCHAIN ||
2314             sample_type & PERF_SAMPLE_BRANCH_STACK ||
2315             (sample_type & PERF_SAMPLE_REGS_USER &&
2316              sample_type & PERF_SAMPLE_STACK_USER))) {
2317                int type = output_type(evsel->core.attr.type);
2318
2319                if (!(output[type].user_unset_fields & PERF_OUTPUT_IP))
2320                        output[type].fields |= PERF_OUTPUT_IP;
2321                if (!(output[type].user_unset_fields & PERF_OUTPUT_SYM))
2322                        output[type].fields |= PERF_OUTPUT_SYM;
2323        }
2324        set_print_ip_opts(&evsel->core.attr);
2325        return 0;
2326}
2327
2328static int print_event_with_time(struct perf_tool *tool,
2329                                 union perf_event *event,
2330                                 struct perf_sample *sample,
2331                                 struct machine *machine,
2332                                 pid_t pid, pid_t tid, u64 timestamp)
2333{
2334        struct perf_script *script = container_of(tool, struct perf_script, tool);
2335        struct perf_session *session = script->session;
2336        struct evsel *evsel = evlist__id2evsel(session->evlist, sample->id);
2337        struct thread *thread = NULL;
2338
2339        if (evsel && !evsel->core.attr.sample_id_all) {
2340                sample->cpu = 0;
2341                sample->time = timestamp;
2342                sample->pid = pid;
2343                sample->tid = tid;
2344        }
2345
2346        if (filter_cpu(sample))
2347                return 0;
2348
2349        if (tid != -1)
2350                thread = machine__findnew_thread(machine, pid, tid);
2351
2352        if (evsel) {
2353                perf_sample__fprintf_start(script, sample, thread, evsel,
2354                                           event->header.type, stdout);
2355        }
2356
2357        perf_event__fprintf(event, machine, stdout);
2358
2359        thread__put(thread);
2360
2361        return 0;
2362}
2363
2364static int print_event(struct perf_tool *tool, union perf_event *event,
2365                       struct perf_sample *sample, struct machine *machine,
2366                       pid_t pid, pid_t tid)
2367{
2368        return print_event_with_time(tool, event, sample, machine, pid, tid, 0);
2369}
2370
2371static int process_comm_event(struct perf_tool *tool,
2372                              union perf_event *event,
2373                              struct perf_sample *sample,
2374                              struct machine *machine)
2375{
2376        if (perf_event__process_comm(tool, event, sample, machine) < 0)
2377                return -1;
2378
2379        return print_event(tool, event, sample, machine, event->comm.pid,
2380                           event->comm.tid);
2381}
2382
2383static int process_namespaces_event(struct perf_tool *tool,
2384                                    union perf_event *event,
2385                                    struct perf_sample *sample,
2386                                    struct machine *machine)
2387{
2388        if (perf_event__process_namespaces(tool, event, sample, machine) < 0)
2389                return -1;
2390
2391        return print_event(tool, event, sample, machine, event->namespaces.pid,
2392                           event->namespaces.tid);
2393}
2394
2395static int process_cgroup_event(struct perf_tool *tool,
2396                                union perf_event *event,
2397                                struct perf_sample *sample,
2398                                struct machine *machine)
2399{
2400        if (perf_event__process_cgroup(tool, event, sample, machine) < 0)
2401                return -1;
2402
2403        return print_event(tool, event, sample, machine, sample->pid,
2404                            sample->tid);
2405}
2406
2407static int process_fork_event(struct perf_tool *tool,
2408                              union perf_event *event,
2409                              struct perf_sample *sample,
2410                              struct machine *machine)
2411{
2412        if (perf_event__process_fork(tool, event, sample, machine) < 0)
2413                return -1;
2414
2415        return print_event_with_time(tool, event, sample, machine,
2416                                     event->fork.pid, event->fork.tid,
2417                                     event->fork.time);
2418}
2419static int process_exit_event(struct perf_tool *tool,
2420                              union perf_event *event,
2421                              struct perf_sample *sample,
2422                              struct machine *machine)
2423{
2424        /* Print before 'exit' deletes anything */
2425        if (print_event_with_time(tool, event, sample, machine, event->fork.pid,
2426                                  event->fork.tid, event->fork.time))
2427                return -1;
2428
2429        return perf_event__process_exit(tool, event, sample, machine);
2430}
2431
2432static int process_mmap_event(struct perf_tool *tool,
2433                              union perf_event *event,
2434                              struct perf_sample *sample,
2435                              struct machine *machine)
2436{
2437        if (perf_event__process_mmap(tool, event, sample, machine) < 0)
2438                return -1;
2439
2440        return print_event(tool, event, sample, machine, event->mmap.pid,
2441                           event->mmap.tid);
2442}
2443
2444static int process_mmap2_event(struct perf_tool *tool,
2445                              union perf_event *event,
2446                              struct perf_sample *sample,
2447                              struct machine *machine)
2448{
2449        if (perf_event__process_mmap2(tool, event, sample, machine) < 0)
2450                return -1;
2451
2452        return print_event(tool, event, sample, machine, event->mmap2.pid,
2453                           event->mmap2.tid);
2454}
2455
2456static int process_switch_event(struct perf_tool *tool,
2457                                union perf_event *event,
2458                                struct perf_sample *sample,
2459                                struct machine *machine)
2460{
2461        struct perf_script *script = container_of(tool, struct perf_script, tool);
2462
2463        if (perf_event__process_switch(tool, event, sample, machine) < 0)
2464                return -1;
2465
2466        if (scripting_ops && scripting_ops->process_switch)
2467                scripting_ops->process_switch(event, sample, machine);
2468
2469        if (!script->show_switch_events)
2470                return 0;
2471
2472        return print_event(tool, event, sample, machine, sample->pid,
2473                           sample->tid);
2474}
2475
2476static int process_auxtrace_error(struct perf_session *session,
2477                                  union perf_event *event)
2478{
2479        if (scripting_ops && scripting_ops->process_auxtrace_error) {
2480                scripting_ops->process_auxtrace_error(session, event);
2481                return 0;
2482        }
2483
2484        return perf_event__process_auxtrace_error(session, event);
2485}
2486
2487static int
2488process_lost_event(struct perf_tool *tool,
2489                   union perf_event *event,
2490                   struct perf_sample *sample,
2491                   struct machine *machine)
2492{
2493        return print_event(tool, event, sample, machine, sample->pid,
2494                           sample->tid);
2495}
2496
2497static int
2498process_throttle_event(struct perf_tool *tool __maybe_unused,
2499                       union perf_event *event,
2500                       struct perf_sample *sample,
2501                       struct machine *machine)
2502{
2503        if (scripting_ops && scripting_ops->process_throttle)
2504                scripting_ops->process_throttle(event, sample, machine);
2505        return 0;
2506}
2507
2508static int
2509process_finished_round_event(struct perf_tool *tool __maybe_unused,
2510                             union perf_event *event,
2511                             struct ordered_events *oe __maybe_unused)
2512
2513{
2514        perf_event__fprintf(event, NULL, stdout);
2515        return 0;
2516}
2517
2518static int
2519process_bpf_events(struct perf_tool *tool __maybe_unused,
2520                   union perf_event *event,
2521                   struct perf_sample *sample,
2522                   struct machine *machine)
2523{
2524        if (machine__process_ksymbol(machine, event, sample) < 0)
2525                return -1;
2526
2527        return print_event(tool, event, sample, machine, sample->pid,
2528                           sample->tid);
2529}
2530
2531static int process_text_poke_events(struct perf_tool *tool,
2532                                    union perf_event *event,
2533                                    struct perf_sample *sample,
2534                                    struct machine *machine)
2535{
2536        if (perf_event__process_text_poke(tool, event, sample, machine) < 0)
2537                return -1;
2538
2539        return print_event(tool, event, sample, machine, sample->pid,
2540                           sample->tid);
2541}
2542
2543static void sig_handler(int sig __maybe_unused)
2544{
2545        session_done = 1;
2546}
2547
2548static void perf_script__fclose_per_event_dump(struct perf_script *script)
2549{
2550        struct evlist *evlist = script->session->evlist;
2551        struct evsel *evsel;
2552
2553        evlist__for_each_entry(evlist, evsel) {
2554                if (!evsel->priv)
2555                        break;
2556                evsel_script__delete(evsel->priv);
2557                evsel->priv = NULL;
2558        }
2559}
2560
2561static int perf_script__fopen_per_event_dump(struct perf_script *script)
2562{
2563        struct evsel *evsel;
2564
2565        evlist__for_each_entry(script->session->evlist, evsel) {
2566                /*
2567                 * Already setup? I.e. we may be called twice in cases like
2568                 * Intel PT, one for the intel_pt// and dummy events, then
2569                 * for the evsels synthesized from the auxtrace info.
2570                 *
2571                 * Ses perf_script__process_auxtrace_info.
2572                 */
2573                if (evsel->priv != NULL)
2574                        continue;
2575
2576                evsel->priv = evsel_script__new(evsel, script->session->data);
2577                if (evsel->priv == NULL)
2578                        goto out_err_fclose;
2579        }
2580
2581        return 0;
2582
2583out_err_fclose:
2584        perf_script__fclose_per_event_dump(script);
2585        return -1;
2586}
2587
2588static int perf_script__setup_per_event_dump(struct perf_script *script)
2589{
2590        struct evsel *evsel;
2591        static struct evsel_script es_stdout;
2592
2593        if (script->per_event_dump)
2594                return perf_script__fopen_per_event_dump(script);
2595
2596        es_stdout.fp = stdout;
2597
2598        evlist__for_each_entry(script->session->evlist, evsel)
2599                evsel->priv = &es_stdout;
2600
2601        return 0;
2602}
2603
2604static void perf_script__exit_per_event_dump_stats(struct perf_script *script)
2605{
2606        struct evsel *evsel;
2607
2608        evlist__for_each_entry(script->session->evlist, evsel) {
2609                struct evsel_script *es = evsel->priv;
2610
2611                evsel_script__fprintf(es, stdout);
2612                evsel_script__delete(es);
2613                evsel->priv = NULL;
2614        }
2615}
2616
2617static void perf_script__exit(struct perf_script *script)
2618{
2619        perf_thread_map__put(script->threads);
2620        perf_cpu_map__put(script->cpus);
2621}
2622
2623static int __cmd_script(struct perf_script *script)
2624{
2625        int ret;
2626
2627        signal(SIGINT, sig_handler);
2628
2629        perf_stat__init_shadow_stats();
2630
2631        /* override event processing functions */
2632        if (script->show_task_events) {
2633                script->tool.comm = process_comm_event;
2634                script->tool.fork = process_fork_event;
2635                script->tool.exit = process_exit_event;
2636        }
2637        if (script->show_mmap_events) {
2638                script->tool.mmap = process_mmap_event;
2639                script->tool.mmap2 = process_mmap2_event;
2640        }
2641        if (script->show_switch_events || (scripting_ops && scripting_ops->process_switch))
2642                script->tool.context_switch = process_switch_event;
2643        if (scripting_ops && scripting_ops->process_auxtrace_error)
2644                script->tool.auxtrace_error = process_auxtrace_error;
2645        if (script->show_namespace_events)
2646                script->tool.namespaces = process_namespaces_event;
2647        if (script->show_cgroup_events)
2648                script->tool.cgroup = process_cgroup_event;
2649        if (script->show_lost_events)
2650                script->tool.lost = process_lost_event;
2651        if (script->show_round_events) {
2652                script->tool.ordered_events = false;
2653                script->tool.finished_round = process_finished_round_event;
2654        }
2655        if (script->show_bpf_events) {
2656                script->tool.ksymbol = process_bpf_events;
2657                script->tool.bpf     = process_bpf_events;
2658        }
2659        if (script->show_text_poke_events) {
2660                script->tool.ksymbol   = process_bpf_events;
2661                script->tool.text_poke = process_text_poke_events;
2662        }
2663
2664        if (perf_script__setup_per_event_dump(script)) {
2665                pr_err("Couldn't create the per event dump files\n");
2666                return -1;
2667        }
2668
2669        ret = perf_session__process_events(script->session);
2670
2671        if (script->per_event_dump)
2672                perf_script__exit_per_event_dump_stats(script);
2673
2674        if (debug_mode)
2675                pr_err("Misordered timestamps: %" PRIu64 "\n", nr_unordered);
2676
2677        return ret;
2678}
2679
2680struct script_spec {
2681        struct list_head        node;
2682        struct scripting_ops    *ops;
2683        char                    spec[];
2684};
2685
2686static LIST_HEAD(script_specs);
2687
2688static struct script_spec *script_spec__new(const char *spec,
2689                                            struct scripting_ops *ops)
2690{
2691        struct script_spec *s = malloc(sizeof(*s) + strlen(spec) + 1);
2692
2693        if (s != NULL) {
2694                strcpy(s->spec, spec);
2695                s->ops = ops;
2696        }
2697
2698        return s;
2699}
2700
2701static void script_spec__add(struct script_spec *s)
2702{
2703        list_add_tail(&s->node, &script_specs);
2704}
2705
2706static struct script_spec *script_spec__find(const char *spec)
2707{
2708        struct script_spec *s;
2709
2710        list_for_each_entry(s, &script_specs, node)
2711                if (strcasecmp(s->spec, spec) == 0)
2712                        return s;
2713        return NULL;
2714}
2715
2716int script_spec_register(const char *spec, struct scripting_ops *ops)
2717{
2718        struct script_spec *s;
2719
2720        s = script_spec__find(spec);
2721        if (s)
2722                return -1;
2723
2724        s = script_spec__new(spec, ops);
2725        if (!s)
2726                return -1;
2727        else
2728                script_spec__add(s);
2729
2730        return 0;
2731}
2732
2733static struct scripting_ops *script_spec__lookup(const char *spec)
2734{
2735        struct script_spec *s = script_spec__find(spec);
2736        if (!s)
2737                return NULL;
2738
2739        return s->ops;
2740}
2741
2742static void list_available_languages(void)
2743{
2744        struct script_spec *s;
2745
2746        fprintf(stderr, "\n");
2747        fprintf(stderr, "Scripting language extensions (used in "
2748                "perf script -s [spec:]script.[spec]):\n\n");
2749
2750        list_for_each_entry(s, &script_specs, node)
2751                fprintf(stderr, "  %-42s [%s]\n", s->spec, s->ops->name);
2752
2753        fprintf(stderr, "\n");
2754}
2755
2756/* Find script file relative to current directory or exec path */
2757static char *find_script(const char *script)
2758{
2759        char path[PATH_MAX];
2760
2761        if (!scripting_ops) {
2762                const char *ext = strrchr(script, '.');
2763
2764                if (!ext)
2765                        return NULL;
2766
2767                scripting_ops = script_spec__lookup(++ext);
2768                if (!scripting_ops)
2769                        return NULL;
2770        }
2771
2772        if (access(script, R_OK)) {
2773                char *exec_path = get_argv_exec_path();
2774
2775                if (!exec_path)
2776                        return NULL;
2777                snprintf(path, sizeof(path), "%s/scripts/%s/%s",
2778                         exec_path, scripting_ops->dirname, script);
2779                free(exec_path);
2780                script = path;
2781                if (access(script, R_OK))
2782                        return NULL;
2783        }
2784        return strdup(script);
2785}
2786
2787static int parse_scriptname(const struct option *opt __maybe_unused,
2788                            const char *str, int unset __maybe_unused)
2789{
2790        char spec[PATH_MAX];
2791        const char *script, *ext;
2792        int len;
2793
2794        if (strcmp(str, "lang") == 0) {
2795                list_available_languages();
2796                exit(0);
2797        }
2798
2799        script = strchr(str, ':');
2800        if (script) {
2801                len = script - str;
2802                if (len >= PATH_MAX) {
2803                        fprintf(stderr, "invalid language specifier");
2804                        return -1;
2805                }
2806                strncpy(spec, str, len);
2807                spec[len] = '\0';
2808                scripting_ops = script_spec__lookup(spec);
2809                if (!scripting_ops) {
2810                        fprintf(stderr, "invalid language specifier");
2811                        return -1;
2812                }
2813                script++;
2814        } else {
2815                script = str;
2816                ext = strrchr(script, '.');
2817                if (!ext) {
2818                        fprintf(stderr, "invalid script extension");
2819                        return -1;
2820                }
2821                scripting_ops = script_spec__lookup(++ext);
2822                if (!scripting_ops) {
2823                        fprintf(stderr, "invalid script extension");
2824                        return -1;
2825                }
2826        }
2827
2828        script_name = find_script(script);
2829        if (!script_name)
2830                script_name = strdup(script);
2831
2832        return 0;
2833}
2834
2835static int parse_output_fields(const struct option *opt __maybe_unused,
2836                            const char *arg, int unset __maybe_unused)
2837{
2838        char *tok, *strtok_saveptr = NULL;
2839        int i, imax = ARRAY_SIZE(all_output_options);
2840        int j;
2841        int rc = 0;
2842        char *str = strdup(arg);
2843        int type = -1;
2844        enum { DEFAULT, SET, ADD, REMOVE } change = DEFAULT;
2845
2846        if (!str)
2847                return -ENOMEM;
2848
2849        /* first word can state for which event type the user is specifying
2850         * the fields. If no type exists, the specified fields apply to all
2851         * event types found in the file minus the invalid fields for a type.
2852         */
2853        tok = strchr(str, ':');
2854        if (tok) {
2855                *tok = '\0';
2856                tok++;
2857                if (!strcmp(str, "hw"))
2858                        type = PERF_TYPE_HARDWARE;
2859                else if (!strcmp(str, "sw"))
2860                        type = PERF_TYPE_SOFTWARE;
2861                else if (!strcmp(str, "trace"))
2862                        type = PERF_TYPE_TRACEPOINT;
2863                else if (!strcmp(str, "raw"))
2864                        type = PERF_TYPE_RAW;
2865                else if (!strcmp(str, "break"))
2866                        type = PERF_TYPE_BREAKPOINT;
2867                else if (!strcmp(str, "synth"))
2868                        type = OUTPUT_TYPE_SYNTH;
2869                else {
2870                        fprintf(stderr, "Invalid event type in field string.\n");
2871                        rc = -EINVAL;
2872                        goto out;
2873                }
2874
2875                if (output[type].user_set)
2876                        pr_warning("Overriding previous field request for %s events.\n",
2877                                   event_type(type));
2878
2879                /* Don't override defaults for +- */
2880                if (strchr(tok, '+') || strchr(tok, '-'))
2881                        goto parse;
2882
2883                output[type].fields = 0;
2884                output[type].user_set = true;
2885                output[type].wildcard_set = false;
2886
2887        } else {
2888                tok = str;
2889                if (strlen(str) == 0) {
2890                        fprintf(stderr,
2891                                "Cannot set fields to 'none' for all event types.\n");
2892                        rc = -EINVAL;
2893                        goto out;
2894                }
2895
2896                /* Don't override defaults for +- */
2897                if (strchr(str, '+') || strchr(str, '-'))
2898                        goto parse;
2899
2900                if (output_set_by_user())
2901                        pr_warning("Overriding previous field request for all events.\n");
2902
2903                for (j = 0; j < OUTPUT_TYPE_MAX; ++j) {
2904                        output[j].fields = 0;
2905                        output[j].user_set = true;
2906                        output[j].wildcard_set = true;
2907                }
2908        }
2909
2910parse:
2911        for (tok = strtok_r(tok, ",", &strtok_saveptr); tok; tok = strtok_r(NULL, ",", &strtok_saveptr)) {
2912                if (*tok == '+') {
2913                        if (change == SET)
2914                                goto out_badmix;
2915                        change = ADD;
2916                        tok++;
2917                } else if (*tok == '-') {
2918                        if (change == SET)
2919                                goto out_badmix;
2920                        change = REMOVE;
2921                        tok++;
2922                } else {
2923                        if (change != SET && change != DEFAULT)
2924                                goto out_badmix;
2925                        change = SET;
2926                }
2927
2928                for (i = 0; i < imax; ++i) {
2929                        if (strcmp(tok, all_output_options[i].str) == 0)
2930                                break;
2931                }
2932                if (i == imax && strcmp(tok, "flags") == 0) {
2933                        print_flags = change != REMOVE;
2934                        continue;
2935                }
2936                if (i == imax) {
2937                        fprintf(stderr, "Invalid field requested.\n");
2938                        rc = -EINVAL;
2939                        goto out;
2940                }
2941
2942                if (type == -1) {
2943                        /* add user option to all events types for
2944                         * which it is valid
2945                         */
2946                        for (j = 0; j < OUTPUT_TYPE_MAX; ++j) {
2947                                if (output[j].invalid_fields & all_output_options[i].field) {
2948                                        pr_warning("\'%s\' not valid for %s events. Ignoring.\n",
2949                                                   all_output_options[i].str, event_type(j));
2950                                } else {
2951                                        if (change == REMOVE) {
2952                                                output[j].fields &= ~all_output_options[i].field;
2953                                                output[j].user_set_fields &= ~all_output_options[i].field;
2954                                                output[j].user_unset_fields |= all_output_options[i].field;
2955                                        } else {
2956                                                output[j].fields |= all_output_options[i].field;
2957                                                output[j].user_set_fields |= all_output_options[i].field;
2958                                                output[j].user_unset_fields &= ~all_output_options[i].field;
2959                                        }
2960                                        output[j].user_set = true;
2961                                        output[j].wildcard_set = true;
2962                                }
2963                        }
2964                } else {
2965                        if (output[type].invalid_fields & all_output_options[i].field) {
2966                                fprintf(stderr, "\'%s\' not valid for %s events.\n",
2967                                         all_output_options[i].str, event_type(type));
2968
2969                                rc = -EINVAL;
2970                                goto out;
2971                        }
2972                        if (change == REMOVE)
2973                                output[type].fields &= ~all_output_options[i].field;
2974                        else
2975                                output[type].fields |= all_output_options[i].field;
2976                        output[type].user_set = true;
2977                        output[type].wildcard_set = true;
2978                }
2979        }
2980
2981        if (type >= 0) {
2982                if (output[type].fields == 0) {
2983                        pr_debug("No fields requested for %s type. "
2984                                 "Events will not be displayed.\n", event_type(type));
2985                }
2986        }
2987        goto out;
2988
2989out_badmix:
2990        fprintf(stderr, "Cannot mix +-field with overridden fields\n");
2991        rc = -EINVAL;
2992out:
2993        free(str);
2994        return rc;
2995}
2996
2997#define for_each_lang(scripts_path, scripts_dir, lang_dirent)           \
2998        while ((lang_dirent = readdir(scripts_dir)) != NULL)            \
2999                if ((lang_dirent->d_type == DT_DIR ||                   \
3000                     (lang_dirent->d_type == DT_UNKNOWN &&              \
3001                      is_directory(scripts_path, lang_dirent))) &&      \
3002                    (strcmp(lang_dirent->d_name, ".")) &&               \
3003                    (strcmp(lang_dirent->d_name, "..")))
3004
3005#define for_each_script(lang_path, lang_dir, script_dirent)             \
3006        while ((script_dirent = readdir(lang_dir)) != NULL)             \
3007                if (script_dirent->d_type != DT_DIR &&                  \
3008                    (script_dirent->d_type != DT_UNKNOWN ||             \
3009                     !is_directory(lang_path, script_dirent)))
3010
3011
3012#define RECORD_SUFFIX                   "-record"
3013#define REPORT_SUFFIX                   "-report"
3014
3015struct script_desc {
3016        struct list_head        node;
3017        char                    *name;
3018        char                    *half_liner;
3019        char                    *args;
3020};
3021
3022static LIST_HEAD(script_descs);
3023
3024static struct script_desc *script_desc__new(const char *name)
3025{
3026        struct script_desc *s = zalloc(sizeof(*s));
3027
3028        if (s != NULL && name)
3029                s->name = strdup(name);
3030
3031        return s;
3032}
3033
3034static void script_desc__delete(struct script_desc *s)
3035{
3036        zfree(&s->name);
3037        zfree(&s->half_liner);
3038        zfree(&s->args);
3039        free(s);
3040}
3041
3042static void script_desc__add(struct script_desc *s)
3043{
3044        list_add_tail(&s->node, &script_descs);
3045}
3046
3047static struct script_desc *script_desc__find(const char *name)
3048{
3049        struct script_desc *s;
3050
3051        list_for_each_entry(s, &script_descs, node)
3052                if (strcasecmp(s->name, name) == 0)
3053                        return s;
3054        return NULL;
3055}
3056
3057static struct script_desc *script_desc__findnew(const char *name)
3058{
3059        struct script_desc *s = script_desc__find(name);
3060
3061        if (s)
3062                return s;
3063
3064        s = script_desc__new(name);
3065        if (!s)
3066                return NULL;
3067
3068        script_desc__add(s);
3069
3070        return s;
3071}
3072
3073static const char *ends_with(const char *str, const char *suffix)
3074{
3075        size_t suffix_len = strlen(suffix);
3076        const char *p = str;
3077
3078        if (strlen(str) > suffix_len) {
3079                p = str + strlen(str) - suffix_len;
3080                if (!strncmp(p, suffix, suffix_len))
3081                        return p;
3082        }
3083
3084        return NULL;
3085}
3086
3087static int read_script_info(struct script_desc *desc, const char *filename)
3088{
3089        char line[BUFSIZ], *p;
3090        FILE *fp;
3091
3092        fp = fopen(filename, "r");
3093        if (!fp)
3094                return -1;
3095
3096        while (fgets(line, sizeof(line), fp)) {
3097                p = skip_spaces(line);
3098                if (strlen(p) == 0)
3099                        continue;
3100                if (*p != '#')
3101                        continue;
3102                p++;
3103                if (strlen(p) && *p == '!')
3104                        continue;
3105
3106                p = skip_spaces(p);
3107                if (strlen(p) && p[strlen(p) - 1] == '\n')
3108                        p[strlen(p) - 1] = '\0';
3109
3110                if (!strncmp(p, "description:", strlen("description:"))) {
3111                        p += strlen("description:");
3112                        desc->half_liner = strdup(skip_spaces(p));
3113                        continue;
3114                }
3115
3116                if (!strncmp(p, "args:", strlen("args:"))) {
3117                        p += strlen("args:");
3118                        desc->args = strdup(skip_spaces(p));
3119                        continue;
3120                }
3121        }
3122
3123        fclose(fp);
3124
3125        return 0;
3126}
3127
3128static char *get_script_root(struct dirent *script_dirent, const char *suffix)
3129{
3130        char *script_root, *str;
3131
3132        script_root = strdup(script_dirent->d_name);
3133        if (!script_root)
3134                return NULL;
3135
3136        str = (char *)ends_with(script_root, suffix);
3137        if (!str) {
3138                free(script_root);
3139                return NULL;
3140        }
3141
3142        *str = '\0';
3143        return script_root;
3144}
3145
3146static int list_available_scripts(const struct option *opt __maybe_unused,
3147                                  const char *s __maybe_unused,
3148                                  int unset __maybe_unused)
3149{
3150        struct dirent *script_dirent, *lang_dirent;
3151        char scripts_path[MAXPATHLEN];
3152        DIR *scripts_dir, *lang_dir;
3153        char script_path[MAXPATHLEN];
3154        char lang_path[MAXPATHLEN];
3155        struct script_desc *desc;
3156        char first_half[BUFSIZ];
3157        char *script_root;
3158
3159        snprintf(scripts_path, MAXPATHLEN, "%s/scripts", get_argv_exec_path());
3160
3161        scripts_dir = opendir(scripts_path);
3162        if (!scripts_dir) {
3163                fprintf(stdout,
3164                        "open(%s) failed.\n"
3165                        "Check \"PERF_EXEC_PATH\" env to set scripts dir.\n",
3166                        scripts_path);
3167                exit(-1);
3168        }
3169
3170        for_each_lang(scripts_path, scripts_dir, lang_dirent) {
3171                scnprintf(lang_path, MAXPATHLEN, "%s/%s/bin", scripts_path,
3172                          lang_dirent->d_name);
3173                lang_dir = opendir(lang_path);
3174                if (!lang_dir)
3175                        continue;
3176
3177                for_each_script(lang_path, lang_dir, script_dirent) {
3178                        script_root = get_script_root(script_dirent, REPORT_SUFFIX);
3179                        if (script_root) {
3180                                desc = script_desc__findnew(script_root);
3181                                scnprintf(script_path, MAXPATHLEN, "%s/%s",
3182                                          lang_path, script_dirent->d_name);
3183                                read_script_info(desc, script_path);
3184                                free(script_root);
3185                        }
3186                }
3187        }
3188
3189        fprintf(stdout, "List of available trace scripts:\n");
3190        list_for_each_entry(desc, &script_descs, node) {
3191                sprintf(first_half, "%s %s", desc->name,
3192                        desc->args ? desc->args : "");
3193                fprintf(stdout, "  %-36s %s\n", first_half,
3194                        desc->half_liner ? desc->half_liner : "");
3195        }
3196
3197        exit(0);
3198}
3199
3200static int add_dlarg(const struct option *opt __maybe_unused,
3201                     const char *s, int unset __maybe_unused)
3202{
3203        char *arg = strdup(s);
3204        void *a;
3205
3206        if (!arg)
3207                return -1;
3208
3209        a = realloc(dlargv, sizeof(dlargv[0]) * (dlargc + 1));
3210        if (!a) {
3211                free(arg);
3212                return -1;
3213        }
3214
3215        dlargv = a;
3216        dlargv[dlargc++] = arg;
3217
3218        return 0;
3219}
3220
3221static void free_dlarg(void)
3222{
3223        while (dlargc--)
3224                free(dlargv[dlargc]);
3225        free(dlargv);
3226}
3227
3228/*
3229 * Some scripts specify the required events in their "xxx-record" file,
3230 * this function will check if the events in perf.data match those
3231 * mentioned in the "xxx-record".
3232 *
3233 * Fixme: All existing "xxx-record" are all in good formats "-e event ",
3234 * which is covered well now. And new parsing code should be added to
3235 * cover the future complex formats like event groups etc.
3236 */
3237static int check_ev_match(char *dir_name, char *scriptname,
3238                        struct perf_session *session)
3239{
3240        char filename[MAXPATHLEN], evname[128];
3241        char line[BUFSIZ], *p;
3242        struct evsel *pos;
3243        int match, len;
3244        FILE *fp;
3245
3246        scnprintf(filename, MAXPATHLEN, "%s/bin/%s-record", dir_name, scriptname);
3247
3248        fp = fopen(filename, "r");
3249        if (!fp)
3250                return -1;
3251
3252        while (fgets(line, sizeof(line), fp)) {
3253                p = skip_spaces(line);
3254                if (*p == '#')
3255                        continue;
3256
3257                while (strlen(p)) {
3258                        p = strstr(p, "-e");
3259                        if (!p)
3260                                break;
3261
3262                        p += 2;
3263                        p = skip_spaces(p);
3264                        len = strcspn(p, " \t");
3265                        if (!len)
3266                                break;
3267
3268                        snprintf(evname, len + 1, "%s", p);
3269
3270                        match = 0;
3271                        evlist__for_each_entry(session->evlist, pos) {
3272                                if (!strcmp(evsel__name(pos), evname)) {
3273                                        match = 1;
3274                                        break;
3275                                }
3276                        }
3277
3278                        if (!match) {
3279                                fclose(fp);
3280                                return -1;
3281                        }
3282                }
3283        }
3284
3285        fclose(fp);
3286        return 0;
3287}
3288
3289/*
3290 * Return -1 if none is found, otherwise the actual scripts number.
3291 *
3292 * Currently the only user of this function is the script browser, which
3293 * will list all statically runnable scripts, select one, execute it and
3294 * show the output in a perf browser.
3295 */
3296int find_scripts(char **scripts_array, char **scripts_path_array, int num,
3297                 int pathlen)
3298{
3299        struct dirent *script_dirent, *lang_dirent;
3300        char scripts_path[MAXPATHLEN], lang_path[MAXPATHLEN];
3301        DIR *scripts_dir, *lang_dir;
3302        struct perf_session *session;
3303        struct perf_data data = {
3304                .path = input_name,
3305                .mode = PERF_DATA_MODE_READ,
3306        };
3307        char *temp;
3308        int i = 0;
3309
3310        session = perf_session__new(&data, NULL);
3311        if (IS_ERR(session))
3312                return PTR_ERR(session);
3313
3314        snprintf(scripts_path, MAXPATHLEN, "%s/scripts", get_argv_exec_path());
3315
3316        scripts_dir = opendir(scripts_path);
3317        if (!scripts_dir) {
3318                perf_session__delete(session);
3319                return -1;
3320        }
3321
3322        for_each_lang(scripts_path, scripts_dir, lang_dirent) {
3323                scnprintf(lang_path, MAXPATHLEN, "%s/%s", scripts_path,
3324                          lang_dirent->d_name);
3325#ifndef HAVE_LIBPERL_SUPPORT
3326                if (strstr(lang_path, "perl"))
3327                        continue;
3328#endif
3329#ifndef HAVE_LIBPYTHON_SUPPORT
3330                if (strstr(lang_path, "python"))
3331                        continue;
3332#endif
3333
3334                lang_dir = opendir(lang_path);
3335                if (!lang_dir)
3336                        continue;
3337
3338                for_each_script(lang_path, lang_dir, script_dirent) {
3339                        /* Skip those real time scripts: xxxtop.p[yl] */
3340                        if (strstr(script_dirent->d_name, "top."))
3341                                continue;
3342                        if (i >= num)
3343                                break;
3344                        snprintf(scripts_path_array[i], pathlen, "%s/%s",
3345                                lang_path,
3346                                script_dirent->d_name);
3347                        temp = strchr(script_dirent->d_name, '.');
3348                        snprintf(scripts_array[i],
3349                                (temp - script_dirent->d_name) + 1,
3350                                "%s", script_dirent->d_name);
3351
3352                        if (check_ev_match(lang_path,
3353                                        scripts_array[i], session))
3354                                continue;
3355
3356                        i++;
3357                }
3358                closedir(lang_dir);
3359        }
3360
3361        closedir(scripts_dir);
3362        perf_session__delete(session);
3363        return i;
3364}
3365
3366static char *get_script_path(const char *script_root, const char *suffix)
3367{
3368        struct dirent *script_dirent, *lang_dirent;
3369        char scripts_path[MAXPATHLEN];
3370        char script_path[MAXPATHLEN];
3371        DIR *scripts_dir, *lang_dir;
3372        char lang_path[MAXPATHLEN];
3373        char *__script_root;
3374
3375        snprintf(scripts_path, MAXPATHLEN, "%s/scripts", get_argv_exec_path());
3376
3377        scripts_dir = opendir(scripts_path);
3378        if (!scripts_dir)
3379                return NULL;
3380
3381        for_each_lang(scripts_path, scripts_dir, lang_dirent) {
3382                scnprintf(lang_path, MAXPATHLEN, "%s/%s/bin", scripts_path,
3383                          lang_dirent->d_name);
3384                lang_dir = opendir(lang_path);
3385                if (!lang_dir)
3386                        continue;
3387
3388                for_each_script(lang_path, lang_dir, script_dirent) {
3389                        __script_root = get_script_root(script_dirent, suffix);
3390                        if (__script_root && !strcmp(script_root, __script_root)) {
3391                                free(__script_root);
3392                                closedir(scripts_dir);
3393                                scnprintf(script_path, MAXPATHLEN, "%s/%s",
3394                                          lang_path, script_dirent->d_name);
3395                                closedir(lang_dir);
3396                                return strdup(script_path);
3397                        }
3398                        free(__script_root);
3399                }
3400                closedir(lang_dir);
3401        }
3402        closedir(scripts_dir);
3403
3404        return NULL;
3405}
3406
3407static bool is_top_script(const char *script_path)
3408{
3409        return ends_with(script_path, "top") != NULL;
3410}
3411
3412static int has_required_arg(char *script_path)
3413{
3414        struct script_desc *desc;
3415        int n_args = 0;
3416        char *p;
3417
3418        desc = script_desc__new(NULL);
3419
3420        if (read_script_info(desc, script_path))
3421                goto out;
3422
3423        if (!desc->args)
3424                goto out;
3425
3426        for (p = desc->args; *p; p++)
3427                if (*p == '<')
3428                        n_args++;
3429out:
3430        script_desc__delete(desc);
3431
3432        return n_args;
3433}
3434
3435static int have_cmd(int argc, const char **argv)
3436{
3437        char **__argv = malloc(sizeof(const char *) * argc);
3438
3439        if (!__argv) {
3440                pr_err("malloc failed\n");
3441                return -1;
3442        }
3443
3444        memcpy(__argv, argv, sizeof(const char *) * argc);
3445        argc = parse_options(argc, (const char **)__argv, record_options,
3446                             NULL, PARSE_OPT_STOP_AT_NON_OPTION);
3447        free(__argv);
3448
3449        system_wide = (argc == 0);
3450
3451        return 0;
3452}
3453
3454static void script__setup_sample_type(struct perf_script *script)
3455{
3456        struct perf_session *session = script->session;
3457        u64 sample_type = evlist__combined_sample_type(session->evlist);
3458
3459        if (symbol_conf.use_callchain || symbol_conf.cumulate_callchain) {
3460                if ((sample_type & PERF_SAMPLE_REGS_USER) &&
3461                    (sample_type & PERF_SAMPLE_STACK_USER)) {
3462                        callchain_param.record_mode = CALLCHAIN_DWARF;
3463                        dwarf_callchain_users = true;
3464                } else if (sample_type & PERF_SAMPLE_BRANCH_STACK)
3465                        callchain_param.record_mode = CALLCHAIN_LBR;
3466                else
3467                        callchain_param.record_mode = CALLCHAIN_FP;
3468        }
3469
3470        if (script->stitch_lbr && (callchain_param.record_mode != CALLCHAIN_LBR)) {
3471                pr_warning("Can't find LBR callchain. Switch off --stitch-lbr.\n"
3472                           "Please apply --call-graph lbr when recording.\n");
3473                script->stitch_lbr = false;
3474        }
3475}
3476
3477static int process_stat_round_event(struct perf_session *session,
3478                                    union perf_event *event)
3479{
3480        struct perf_record_stat_round *round = &event->stat_round;
3481        struct evsel *counter;
3482
3483        evlist__for_each_entry(session->evlist, counter) {
3484                perf_stat_process_counter(&stat_config, counter);
3485                process_stat(counter, round->time);
3486        }
3487
3488        process_stat_interval(round->time);
3489        return 0;
3490}
3491
3492static int process_stat_config_event(struct perf_session *session __maybe_unused,
3493                                     union perf_event *event)
3494{
3495        perf_event__read_stat_config(&stat_config, &event->stat_config);
3496        return 0;
3497}
3498
3499static int set_maps(struct perf_script *script)
3500{
3501        struct evlist *evlist = script->session->evlist;
3502
3503        if (!script->cpus || !script->threads)
3504                return 0;
3505
3506        if (WARN_ONCE(script->allocated, "stats double allocation\n"))
3507                return -EINVAL;
3508
3509        perf_evlist__set_maps(&evlist->core, script->cpus, script->threads);
3510
3511        if (evlist__alloc_stats(evlist, true))
3512                return -ENOMEM;
3513
3514        script->allocated = true;
3515        return 0;
3516}
3517
3518static
3519int process_thread_map_event(struct perf_session *session,
3520                             union perf_event *event)
3521{
3522        struct perf_tool *tool = session->tool;
3523        struct perf_script *script = container_of(tool, struct perf_script, tool);
3524
3525        if (script->threads) {
3526                pr_warning("Extra thread map event, ignoring.\n");
3527                return 0;
3528        }
3529
3530        script->threads = thread_map__new_event(&event->thread_map);
3531        if (!script->threads)
3532                return -ENOMEM;
3533
3534        return set_maps(script);
3535}
3536
3537static
3538int process_cpu_map_event(struct perf_session *session,
3539                          union perf_event *event)
3540{
3541        struct perf_tool *tool = session->tool;
3542        struct perf_script *script = container_of(tool, struct perf_script, tool);
3543
3544        if (script->cpus) {
3545                pr_warning("Extra cpu map event, ignoring.\n");
3546                return 0;
3547        }
3548
3549        script->cpus = cpu_map__new_data(&event->cpu_map.data);
3550        if (!script->cpus)
3551                return -ENOMEM;
3552
3553        return set_maps(script);
3554}
3555
3556static int process_feature_event(struct perf_session *session,
3557                                 union perf_event *event)
3558{
3559        if (event->feat.feat_id < HEADER_LAST_FEATURE)
3560                return perf_event__process_feature(session, event);
3561        return 0;
3562}
3563
3564#ifdef HAVE_AUXTRACE_SUPPORT
3565static int perf_script__process_auxtrace_info(struct perf_session *session,
3566                                              union perf_event *event)
3567{
3568        struct perf_tool *tool = session->tool;
3569
3570        int ret = perf_event__process_auxtrace_info(session, event);
3571
3572        if (ret == 0) {
3573                struct perf_script *script = container_of(tool, struct perf_script, tool);
3574
3575                ret = perf_script__setup_per_event_dump(script);
3576        }
3577
3578        return ret;
3579}
3580#else
3581#define perf_script__process_auxtrace_info 0
3582#endif
3583
3584static int parse_insn_trace(const struct option *opt __maybe_unused,
3585                            const char *str __maybe_unused,
3586                            int unset __maybe_unused)
3587{
3588        parse_output_fields(NULL, "+insn,-event,-period", 0);
3589        itrace_parse_synth_opts(opt, "i0ns", 0);
3590        symbol_conf.nanosecs = true;
3591        return 0;
3592}
3593
3594static int parse_xed(const struct option *opt __maybe_unused,
3595                     const char *str __maybe_unused,
3596                     int unset __maybe_unused)
3597{
3598        if (isatty(1))
3599                force_pager("xed -F insn: -A -64 | less");
3600        else
3601                force_pager("xed -F insn: -A -64");
3602        return 0;
3603}
3604
3605static int parse_call_trace(const struct option *opt __maybe_unused,
3606                            const char *str __maybe_unused,
3607                            int unset __maybe_unused)
3608{
3609        parse_output_fields(NULL, "-ip,-addr,-event,-period,+callindent", 0);
3610        itrace_parse_synth_opts(opt, "cewp", 0);
3611        symbol_conf.nanosecs = true;
3612        symbol_conf.pad_output_len_dso = 50;
3613        return 0;
3614}
3615
3616static int parse_callret_trace(const struct option *opt __maybe_unused,
3617                            const char *str __maybe_unused,
3618                            int unset __maybe_unused)
3619{
3620        parse_output_fields(NULL, "-ip,-addr,-event,-period,+callindent,+flags", 0);
3621        itrace_parse_synth_opts(opt, "crewp", 0);
3622        symbol_conf.nanosecs = true;
3623        return 0;
3624}
3625
3626int cmd_script(int argc, const char **argv)
3627{
3628        bool show_full_info = false;
3629        bool header = false;
3630        bool header_only = false;
3631        bool script_started = false;
3632        char *rec_script_path = NULL;
3633        char *rep_script_path = NULL;
3634        struct perf_session *session;
3635        struct itrace_synth_opts itrace_synth_opts = {
3636                .set = false,
3637                .default_no_sample = true,
3638        };
3639        struct utsname uts;
3640        char *script_path = NULL;
3641        const char *dlfilter_file = NULL;
3642        const char **__argv;
3643        int i, j, err = 0;
3644        struct perf_script script = {
3645                .tool = {
3646                        .sample          = process_sample_event,
3647                        .mmap            = perf_event__process_mmap,
3648                        .mmap2           = perf_event__process_mmap2,
3649                        .comm            = perf_event__process_comm,
3650                        .namespaces      = perf_event__process_namespaces,
3651                        .cgroup          = perf_event__process_cgroup,
3652                        .exit            = perf_event__process_exit,
3653                        .fork            = perf_event__process_fork,
3654                        .attr            = process_attr,
3655                        .event_update   = perf_event__process_event_update,
3656                        .tracing_data    = perf_event__process_tracing_data,
3657                        .feature         = process_feature_event,
3658                        .build_id        = perf_event__process_build_id,
3659                        .id_index        = perf_event__process_id_index,
3660                        .auxtrace_info   = perf_script__process_auxtrace_info,
3661                        .auxtrace        = perf_event__process_auxtrace,
3662                        .auxtrace_error  = perf_event__process_auxtrace_error,
3663                        .stat            = perf_event__process_stat_event,
3664                        .stat_round      = process_stat_round_event,
3665                        .stat_config     = process_stat_config_event,
3666                        .thread_map      = process_thread_map_event,
3667                        .cpu_map         = process_cpu_map_event,
3668                        .throttle        = process_throttle_event,
3669                        .unthrottle      = process_throttle_event,
3670                        .ordered_events  = true,
3671                        .ordering_requires_timestamps = true,
3672                },
3673        };
3674        struct perf_data data = {
3675                .mode = PERF_DATA_MODE_READ,
3676        };
3677        const struct option options[] = {
3678        OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
3679                    "dump raw trace in ASCII"),
3680        OPT_INCR('v', "verbose", &verbose,
3681                 "be more verbose (show symbol address, etc)"),
3682        OPT_BOOLEAN('L', "Latency", &latency_format,
3683                    "show latency attributes (irqs/preemption disabled, etc)"),
3684        OPT_CALLBACK_NOOPT('l', "list", NULL, NULL, "list available scripts",
3685                           list_available_scripts),
3686        OPT_CALLBACK_NOOPT(0, "list-dlfilters", NULL, NULL, "list available dlfilters",
3687                           list_available_dlfilters),
3688        OPT_CALLBACK('s', "script", NULL, "name",
3689                     "script file name (lang:script name, script name, or *)",
3690                     parse_scriptname),
3691        OPT_STRING('g', "gen-script", &generate_script_lang, "lang",
3692                   "generate perf-script.xx script in specified language"),
3693        OPT_STRING(0, "dlfilter", &dlfilter_file, "file", "filter .so file name"),
3694        OPT_CALLBACK(0, "dlarg", NULL, "argument", "filter argument",
3695                     add_dlarg),
3696        OPT_STRING('i', "input", &input_name, "file", "input file name"),
3697        OPT_BOOLEAN('d', "debug-mode", &debug_mode,
3698                   "do various checks like samples ordering and lost events"),
3699        OPT_BOOLEAN(0, "header", &header, "Show data header."),
3700        OPT_BOOLEAN(0, "header-only", &header_only, "Show only data header."),
3701        OPT_STRING('k', "vmlinux", &symbol_conf.vmlinux_name,
3702                   "file", "vmlinux pathname"),
3703        OPT_STRING(0, "kallsyms", &symbol_conf.kallsyms_name,
3704                   "file", "kallsyms pathname"),
3705        OPT_BOOLEAN('G', "hide-call-graph", &no_callchain,
3706                    "When printing symbols do not display call chain"),
3707        OPT_CALLBACK(0, "symfs", NULL, "directory",
3708                     "Look for files with symbols relative to this directory",
3709                     symbol__config_symfs),
3710        OPT_CALLBACK('F', "fields", NULL, "str",
3711                     "comma separated output fields prepend with 'type:'. "
3712                     "+field to add and -field to remove."
3713                     "Valid types: hw,sw,trace,raw,synth. "
3714                     "Fields: comm,tid,pid,time,cpu,event,trace,ip,sym,dso,"
3715                     "addr,symoff,srcline,period,iregs,uregs,brstack,"
3716                     "brstacksym,flags,bpf-output,brstackinsn,brstackoff,"
3717                     "callindent,insn,insnlen,synth,phys_addr,metric,misc,ipc,tod,"
3718                     "data_page_size,code_page_size",
3719                     parse_output_fields),
3720        OPT_BOOLEAN('a', "all-cpus", &system_wide,
3721                    "system-wide collection from all CPUs"),
3722        OPT_STRING(0, "dsos", &symbol_conf.dso_list_str, "dso[,dso...]",
3723                   "only consider symbols in these DSOs"),
3724        OPT_STRING('S', "symbols", &symbol_conf.sym_list_str, "symbol[,symbol...]",
3725                   "only consider these symbols"),
3726        OPT_INTEGER(0, "addr-range", &symbol_conf.addr_range,
3727                    "Use with -S to list traced records within address range"),
3728        OPT_CALLBACK_OPTARG(0, "insn-trace", &itrace_synth_opts, NULL, NULL,
3729                        "Decode instructions from itrace", parse_insn_trace),
3730        OPT_CALLBACK_OPTARG(0, "xed", NULL, NULL, NULL,
3731                        "Run xed disassembler on output", parse_xed),
3732        OPT_CALLBACK_OPTARG(0, "call-trace", &itrace_synth_opts, NULL, NULL,
3733                        "Decode calls from from itrace", parse_call_trace),
3734        OPT_CALLBACK_OPTARG(0, "call-ret-trace", &itrace_synth_opts, NULL, NULL,
3735                        "Decode calls and returns from itrace", parse_callret_trace),
3736        OPT_STRING(0, "graph-function", &symbol_conf.graph_function, "symbol[,symbol...]",
3737                        "Only print symbols and callees with --call-trace/--call-ret-trace"),
3738        OPT_STRING(0, "stop-bt", &symbol_conf.bt_stop_list_str, "symbol[,symbol...]",
3739                   "Stop display of callgraph at these symbols"),
3740        OPT_STRING('C', "cpu", &cpu_list, "cpu", "list of cpus to profile"),
3741        OPT_STRING('c', "comms", &symbol_conf.comm_list_str, "comm[,comm...]",
3742                   "only display events for these comms"),
3743        OPT_STRING(0, "pid", &symbol_conf.pid_list_str, "pid[,pid...]",
3744                   "only consider symbols in these pids"),
3745        OPT_STRING(0, "tid", &symbol_conf.tid_list_str, "tid[,tid...]",
3746                   "only consider symbols in these tids"),
3747        OPT_UINTEGER(0, "max-stack", &scripting_max_stack,
3748                     "Set the maximum stack depth when parsing the callchain, "
3749                     "anything beyond the specified depth will be ignored. "
3750                     "Default: kernel.perf_event_max_stack or " __stringify(PERF_MAX_STACK_DEPTH)),
3751        OPT_BOOLEAN(0, "reltime", &reltime, "Show time stamps relative to start"),
3752        OPT_BOOLEAN(0, "deltatime", &deltatime, "Show time stamps relative to previous event"),
3753        OPT_BOOLEAN('I', "show-info", &show_full_info,
3754                    "display extended information from perf.data file"),
3755        OPT_BOOLEAN('\0', "show-kernel-path", &symbol_conf.show_kernel_path,
3756                    "Show the path of [kernel.kallsyms]"),
3757        OPT_BOOLEAN('\0', "show-task-events", &script.show_task_events,
3758                    "Show the fork/comm/exit events"),
3759        OPT_BOOLEAN('\0', "show-mmap-events", &script.show_mmap_events,
3760                    "Show the mmap events"),
3761        OPT_BOOLEAN('\0', "show-switch-events", &script.show_switch_events,
3762                    "Show context switch events (if recorded)"),
3763        OPT_BOOLEAN('\0', "show-namespace-events", &script.show_namespace_events,
3764                    "Show namespace events (if recorded)"),
3765        OPT_BOOLEAN('\0', "show-cgroup-events", &script.show_cgroup_events,
3766                    "Show cgroup events (if recorded)"),
3767        OPT_BOOLEAN('\0', "show-lost-events", &script.show_lost_events,
3768                    "Show lost events (if recorded)"),
3769        OPT_BOOLEAN('\0', "show-round-events", &script.show_round_events,
3770                    "Show round events (if recorded)"),
3771        OPT_BOOLEAN('\0', "show-bpf-events", &script.show_bpf_events,
3772                    "Show bpf related events (if recorded)"),
3773        OPT_BOOLEAN('\0', "show-text-poke-events", &script.show_text_poke_events,
3774                    "Show text poke related events (if recorded)"),
3775        OPT_BOOLEAN('\0', "per-event-dump", &script.per_event_dump,
3776                    "Dump trace output to files named by the monitored events"),
3777        OPT_BOOLEAN('f', "force", &symbol_conf.force, "don't complain, do it"),
3778        OPT_INTEGER(0, "max-blocks", &max_blocks,
3779                    "Maximum number of code blocks to dump with brstackinsn"),
3780        OPT_BOOLEAN(0, "ns", &symbol_conf.nanosecs,
3781                    "Use 9 decimal places when displaying time"),
3782        OPT_CALLBACK_OPTARG(0, "itrace", &itrace_synth_opts, NULL, "opts",
3783                            "Instruction Tracing options\n" ITRACE_HELP,
3784                            itrace_parse_synth_opts),
3785        OPT_BOOLEAN(0, "full-source-path", &srcline_full_filename,
3786                        "Show full source file name path for source lines"),
3787        OPT_BOOLEAN(0, "demangle", &symbol_conf.demangle,
3788                        "Enable symbol demangling"),
3789        OPT_BOOLEAN(0, "demangle-kernel", &symbol_conf.demangle_kernel,
3790                        "Enable kernel symbol demangling"),
3791        OPT_STRING(0, "time", &script.time_str, "str",
3792                   "Time span of interest (start,stop)"),
3793        OPT_BOOLEAN(0, "inline", &symbol_conf.inline_name,
3794                    "Show inline function"),
3795        OPT_STRING(0, "guestmount", &symbol_conf.guestmount, "directory",
3796                   "guest mount directory under which every guest os"
3797                   " instance has a subdir"),
3798        OPT_STRING(0, "guestvmlinux", &symbol_conf.default_guest_vmlinux_name,
3799                   "file", "file saving guest os vmlinux"),
3800        OPT_STRING(0, "guestkallsyms", &symbol_conf.default_guest_kallsyms,
3801                   "file", "file saving guest os /proc/kallsyms"),
3802        OPT_STRING(0, "guestmodules", &symbol_conf.default_guest_modules,
3803                   "file", "file saving guest os /proc/modules"),
3804        OPT_BOOLEAN('\0', "stitch-lbr", &script.stitch_lbr,
3805                    "Enable LBR callgraph stitching approach"),
3806        OPTS_EVSWITCH(&script.evswitch),
3807        OPT_END()
3808        };
3809        const char * const script_subcommands[] = { "record", "report", NULL };
3810        const char *script_usage[] = {
3811                "perf script [<options>]",
3812                "perf script [<options>] record <script> [<record-options>] <command>",
3813                "perf script [<options>] report <script> [script-args]",
3814                "perf script [<options>] <script> [<record-options>] <command>",
3815                "perf script [<options>] <top-script> [script-args]",
3816                NULL
3817        };
3818
3819        perf_set_singlethreaded();
3820
3821        setup_scripting();
3822
3823        argc = parse_options_subcommand(argc, argv, options, script_subcommands, script_usage,
3824                             PARSE_OPT_STOP_AT_NON_OPTION);
3825
3826        if (symbol_conf.guestmount ||
3827            symbol_conf.default_guest_vmlinux_name ||
3828            symbol_conf.default_guest_kallsyms ||
3829            symbol_conf.default_guest_modules) {
3830                /*
3831                 * Enable guest sample processing.
3832                 */
3833                perf_guest = true;
3834        }
3835
3836        data.path  = input_name;
3837        data.force = symbol_conf.force;
3838
3839        if (argc > 1 && !strncmp(argv[0], "rec", strlen("rec"))) {
3840                rec_script_path = get_script_path(argv[1], RECORD_SUFFIX);
3841                if (!rec_script_path)
3842                        return cmd_record(argc, argv);
3843        }
3844
3845        if (argc > 1 && !strncmp(argv[0], "rep", strlen("rep"))) {
3846                rep_script_path = get_script_path(argv[1], REPORT_SUFFIX);
3847                if (!rep_script_path) {
3848                        fprintf(stderr,
3849                                "Please specify a valid report script"
3850                                "(see 'perf script -l' for listing)\n");
3851                        return -1;
3852                }
3853        }
3854
3855        if (reltime && deltatime) {
3856                fprintf(stderr,
3857                        "reltime and deltatime - the two don't get along well. "
3858                        "Please limit to --reltime or --deltatime.\n");
3859                return -1;
3860        }
3861
3862        if ((itrace_synth_opts.callchain || itrace_synth_opts.add_callchain) &&
3863            itrace_synth_opts.callchain_sz > scripting_max_stack)
3864                scripting_max_stack = itrace_synth_opts.callchain_sz;
3865
3866        /* make sure PERF_EXEC_PATH is set for scripts */
3867        set_argv_exec_path(get_argv_exec_path());
3868
3869        if (argc && !script_name && !rec_script_path && !rep_script_path) {
3870                int live_pipe[2];
3871                int rep_args;
3872                pid_t pid;
3873
3874                rec_script_path = get_script_path(argv[0], RECORD_SUFFIX);
3875                rep_script_path = get_script_path(argv[0], REPORT_SUFFIX);
3876
3877                if (!rec_script_path && !rep_script_path) {
3878                        script_name = find_script(argv[0]);
3879                        if (script_name) {
3880                                argc -= 1;
3881                                argv += 1;
3882                                goto script_found;
3883                        }
3884                        usage_with_options_msg(script_usage, options,
3885                                "Couldn't find script `%s'\n\n See perf"
3886                                " script -l for available scripts.\n", argv[0]);
3887                }
3888
3889                if (is_top_script(argv[0])) {
3890                        rep_args = argc - 1;
3891                } else {
3892                        int rec_args;
3893
3894                        rep_args = has_required_arg(rep_script_path);
3895                        rec_args = (argc - 1) - rep_args;
3896                        if (rec_args < 0) {
3897                                usage_with_options_msg(script_usage, options,
3898                                        "`%s' script requires options."
3899                                        "\n\n See perf script -l for available "
3900                                        "scripts and options.\n", argv[0]);
3901                        }
3902                }
3903
3904                if (pipe(live_pipe) < 0) {
3905                        perror("failed to create pipe");
3906                        return -1;
3907                }
3908
3909                pid = fork();
3910                if (pid < 0) {
3911                        perror("failed to fork");
3912                        return -1;
3913                }
3914
3915                if (!pid) {
3916                        j = 0;
3917
3918                        dup2(live_pipe[1], 1);
3919                        close(live_pipe[0]);
3920
3921                        if (is_top_script(argv[0])) {
3922                                system_wide = true;
3923                        } else if (!system_wide) {
3924                                if (have_cmd(argc - rep_args, &argv[rep_args]) != 0) {
3925                                        err = -1;
3926                                        goto out;
3927                                }
3928                        }
3929
3930                        __argv = malloc((argc + 6) * sizeof(const char *));
3931                        if (!__argv) {
3932                                pr_err("malloc failed\n");
3933                                err = -ENOMEM;
3934                                goto out;
3935                        }
3936
3937                        __argv[j++] = "/bin/sh";
3938                        __argv[j++] = rec_script_path;
3939                        if (system_wide)
3940                                __argv[j++] = "-a";
3941                        __argv[j++] = "-q";
3942                        __argv[j++] = "-o";
3943                        __argv[j++] = "-";
3944                        for (i = rep_args + 1; i < argc; i++)
3945                                __argv[j++] = argv[i];
3946                        __argv[j++] = NULL;
3947
3948                        execvp("/bin/sh", (char **)__argv);
3949                        free(__argv);
3950                        exit(-1);
3951                }
3952
3953                dup2(live_pipe[0], 0);
3954                close(live_pipe[1]);
3955
3956                __argv = malloc((argc + 4) * sizeof(const char *));
3957                if (!__argv) {
3958                        pr_err("malloc failed\n");
3959                        err = -ENOMEM;
3960                        goto out;
3961                }
3962
3963                j = 0;
3964                __argv[j++] = "/bin/sh";
3965                __argv[j++] = rep_script_path;
3966                for (i = 1; i < rep_args + 1; i++)
3967                        __argv[j++] = argv[i];
3968                __argv[j++] = "-i";
3969                __argv[j++] = "-";
3970                __argv[j++] = NULL;
3971
3972                execvp("/bin/sh", (char **)__argv);
3973                free(__argv);
3974                exit(-1);
3975        }
3976script_found:
3977        if (rec_script_path)
3978                script_path = rec_script_path;
3979        if (rep_script_path)
3980                script_path = rep_script_path;
3981
3982        if (script_path) {
3983                j = 0;
3984
3985                if (!rec_script_path)
3986                        system_wide = false;
3987                else if (!system_wide) {
3988                        if (have_cmd(argc - 1, &argv[1]) != 0) {
3989                                err = -1;
3990                                goto out;
3991                        }
3992                }
3993
3994                __argv = malloc((argc + 2) * sizeof(const char *));
3995                if (!__argv) {
3996                        pr_err("malloc failed\n");
3997                        err = -ENOMEM;
3998                        goto out;
3999                }
4000
4001                __argv[j++] = "/bin/sh";
4002                __argv[j++] = script_path;
4003                if (system_wide)
4004                        __argv[j++] = "-a";
4005                for (i = 2; i < argc; i++)
4006                        __argv[j++] = argv[i];
4007                __argv[j++] = NULL;
4008
4009                execvp("/bin/sh", (char **)__argv);
4010                free(__argv);
4011                exit(-1);
4012        }
4013
4014        if (dlfilter_file) {
4015                dlfilter = dlfilter__new(dlfilter_file, dlargc, dlargv);
4016                if (!dlfilter)
4017                        return -1;
4018        }
4019
4020        if (!script_name) {
4021                setup_pager();
4022                use_browser = 0;
4023        }
4024
4025        session = perf_session__new(&data, &script.tool);
4026        if (IS_ERR(session))
4027                return PTR_ERR(session);
4028
4029        if (header || header_only) {
4030                script.tool.show_feat_hdr = SHOW_FEAT_HEADER;
4031                perf_session__fprintf_info(session, stdout, show_full_info);
4032                if (header_only)
4033                        goto out_delete;
4034        }
4035        if (show_full_info)
4036                script.tool.show_feat_hdr = SHOW_FEAT_HEADER_FULL_INFO;
4037
4038        if (symbol__init(&session->header.env) < 0)
4039                goto out_delete;
4040
4041        uname(&uts);
4042        if (data.is_pipe) { /* Assume pipe_mode indicates native_arch */
4043                native_arch = true;
4044        } else if (session->header.env.arch) {
4045                if (!strcmp(uts.machine, session->header.env.arch))
4046                        native_arch = true;
4047                else if (!strcmp(uts.machine, "x86_64") &&
4048                         !strcmp(session->header.env.arch, "i386"))
4049                        native_arch = true;
4050        }
4051
4052        script.session = session;
4053        script__setup_sample_type(&script);
4054
4055        if ((output[PERF_TYPE_HARDWARE].fields & PERF_OUTPUT_CALLINDENT) ||
4056            symbol_conf.graph_function)
4057                itrace_synth_opts.thread_stack = true;
4058
4059        session->itrace_synth_opts = &itrace_synth_opts;
4060
4061        if (cpu_list) {
4062                err = perf_session__cpu_bitmap(session, cpu_list, cpu_bitmap);
4063                if (err < 0)
4064                        goto out_delete;
4065                itrace_synth_opts.cpu_bitmap = cpu_bitmap;
4066        }
4067
4068        if (!no_callchain)
4069                symbol_conf.use_callchain = true;
4070        else
4071                symbol_conf.use_callchain = false;
4072
4073        if (session->tevent.pevent &&
4074            tep_set_function_resolver(session->tevent.pevent,
4075                                      machine__resolve_kernel_addr,
4076                                      &session->machines.host) < 0) {
4077                pr_err("%s: failed to set libtraceevent function resolver\n", __func__);
4078                err = -1;
4079                goto out_delete;
4080        }
4081
4082        if (generate_script_lang) {
4083                struct stat perf_stat;
4084                int input;
4085
4086                if (output_set_by_user()) {
4087                        fprintf(stderr,
4088                                "custom fields not supported for generated scripts");
4089                        err = -EINVAL;
4090                        goto out_delete;
4091                }
4092
4093                input = open(data.path, O_RDONLY);      /* input_name */
4094                if (input < 0) {
4095                        err = -errno;
4096                        perror("failed to open file");
4097                        goto out_delete;
4098                }
4099
4100                err = fstat(input, &perf_stat);
4101                if (err < 0) {
4102                        perror("failed to stat file");
4103                        goto out_delete;
4104                }
4105
4106                if (!perf_stat.st_size) {
4107                        fprintf(stderr, "zero-sized file, nothing to do!\n");
4108                        goto out_delete;
4109                }
4110
4111                scripting_ops = script_spec__lookup(generate_script_lang);
4112                if (!scripting_ops) {
4113                        fprintf(stderr, "invalid language specifier");
4114                        err = -ENOENT;
4115                        goto out_delete;
4116                }
4117
4118                err = scripting_ops->generate_script(session->tevent.pevent,
4119                                                     "perf-script");
4120                goto out_delete;
4121        }
4122
4123        err = dlfilter__start(dlfilter, session);
4124        if (err)
4125                goto out_delete;
4126
4127        if (script_name) {
4128                err = scripting_ops->start_script(script_name, argc, argv, session);
4129                if (err)
4130                        goto out_delete;
4131                pr_debug("perf script started with script %s\n\n", script_name);
4132                script_started = true;
4133        }
4134
4135
4136        err = perf_session__check_output_opt(session);
4137        if (err < 0)
4138                goto out_delete;
4139
4140        if (script.time_str) {
4141                err = perf_time__parse_for_ranges_reltime(script.time_str, session,
4142                                                  &script.ptime_range,
4143                                                  &script.range_size,
4144                                                  &script.range_num,
4145                                                  reltime);
4146                if (err < 0)
4147                        goto out_delete;
4148
4149                itrace_synth_opts__set_time_range(&itrace_synth_opts,
4150                                                  script.ptime_range,
4151                                                  script.range_num);
4152        }
4153
4154        err = evswitch__init(&script.evswitch, session->evlist, stderr);
4155        if (err)
4156                goto out_delete;
4157
4158        if (zstd_init(&(session->zstd_data), 0) < 0)
4159                pr_warning("Decompression initialization failed. Reported data may be incomplete.\n");
4160
4161        err = __cmd_script(&script);
4162
4163        flush_scripting();
4164
4165out_delete:
4166        if (script.ptime_range) {
4167                itrace_synth_opts__clear_time_range(&itrace_synth_opts);
4168                zfree(&script.ptime_range);
4169        }
4170
4171        zstd_fini(&(session->zstd_data));
4172        evlist__free_stats(session->evlist);
4173        perf_session__delete(session);
4174        perf_script__exit(&script);
4175
4176        if (script_started)
4177                cleanup_scripting();
4178        dlfilter__cleanup(dlfilter);
4179        free_dlarg();
4180out:
4181        return err;
4182}
4183