Lines Matching +full:1 +full:br +full:- +full:100
1 // SPDX-License-Identifier: GPL-2.0
7 #include <subcmd/exec-cmd.h>
9 #include <subcmd/parse-options.h>
17 #include "util/trace-event.h"
31 #include "util/thread-stack.h"
32 #include "util/time-utils.h"
35 #include "util/mem-info.h"
47 #include "util/mem-events.h"
48 #include "util/dump-insn.h"
70 #include <event-parse.h>
95 PERF_OUTPUT_COMM = 1ULL << 0,
96 PERF_OUTPUT_TID = 1ULL << 1,
97 PERF_OUTPUT_PID = 1ULL << 2,
98 PERF_OUTPUT_TIME = 1ULL << 3,
99 PERF_OUTPUT_CPU = 1ULL << 4,
100 PERF_OUTPUT_EVNAME = 1ULL << 5,
101 PERF_OUTPUT_TRACE = 1ULL << 6,
102 PERF_OUTPUT_IP = 1ULL << 7,
103 PERF_OUTPUT_SYM = 1ULL << 8,
104 PERF_OUTPUT_DSO = 1ULL << 9,
105 PERF_OUTPUT_ADDR = 1ULL << 10,
106 PERF_OUTPUT_SYMOFFSET = 1ULL << 11,
107 PERF_OUTPUT_SRCLINE = 1ULL << 12,
108 PERF_OUTPUT_PERIOD = 1ULL << 13,
109 PERF_OUTPUT_IREGS = 1ULL << 14,
110 PERF_OUTPUT_BRSTACK = 1ULL << 15,
111 PERF_OUTPUT_BRSTACKSYM = 1ULL << 16,
112 PERF_OUTPUT_DATA_SRC = 1ULL << 17,
113 PERF_OUTPUT_WEIGHT = 1ULL << 18,
114 PERF_OUTPUT_BPF_OUTPUT = 1ULL << 19,
115 PERF_OUTPUT_CALLINDENT = 1ULL << 20,
116 PERF_OUTPUT_INSN = 1ULL << 21,
117 PERF_OUTPUT_INSNLEN = 1ULL << 22,
118 PERF_OUTPUT_BRSTACKINSN = 1ULL << 23,
119 PERF_OUTPUT_BRSTACKOFF = 1ULL << 24,
120 PERF_OUTPUT_SYNTH = 1ULL << 25,
121 PERF_OUTPUT_PHYS_ADDR = 1ULL << 26,
122 PERF_OUTPUT_UREGS = 1ULL << 27,
123 PERF_OUTPUT_METRIC = 1ULL << 28,
124 PERF_OUTPUT_MISC = 1ULL << 29,
125 PERF_OUTPUT_SRCCODE = 1ULL << 30,
126 PERF_OUTPUT_IPC = 1ULL << 31,
127 PERF_OUTPUT_TOD = 1ULL << 32,
128 PERF_OUTPUT_DATA_PAGE_SIZE = 1ULL << 33,
129 PERF_OUTPUT_CODE_PAGE_SIZE = 1ULL << 34,
130 PERF_OUTPUT_INS_LAT = 1ULL << 35,
131 PERF_OUTPUT_BRSTACKINSNLEN = 1ULL << 36,
132 PERF_OUTPUT_MACHINE_PID = 1ULL << 37,
133 PERF_OUTPUT_VCPU = 1ULL << 38,
134 PERF_OUTPUT_CGROUP = 1ULL << 39,
135 PERF_OUTPUT_RETIRE_LAT = 1ULL << 40,
136 PERF_OUTPUT_DSOFF = 1ULL << 41,
137 PERF_OUTPUT_DISASM = 1ULL << 42,
138 PERF_OUTPUT_BRSTACKDISASM = 1ULL << 43,
139 PERF_OUTPUT_BRCNTR = 1ULL << 44,
192 {.str = "bpf-output", .field = PERF_OUTPUT_BPF_OUTPUT},
224 // We need to refactor the evsel->priv use in in 'perf script' to allow for
226 #define OUTPUT_TYPE_UNSET -1
348 return (struct evsel_script *)evsel->priv; in evsel_script()
356 if (asprintf(&es->filename, "%s.%s.dump", data->file.path, evsel__name(evsel)) < 0) in evsel_script__new()
358 es->fp = fopen(es->filename, "w"); in evsel_script__new()
359 if (es->fp == NULL) in evsel_script__new()
365 zfree(&es->filename); in evsel_script__new()
373 zfree(&es->filename); in evsel_script__delete()
374 fclose(es->fp); in evsel_script__delete()
375 es->fp = NULL; in evsel_script__delete()
383 fstat(fileno(es->fp), &st); in evsel_script__fprintf()
385 st.st_size / 1024.0 / 1024.0, es->filename, es->samples); in evsel_script__fprintf()
403 int type = evsel->script_output_type; in evsel__output_type()
406 type = output_type(evsel->core.attr.type); in evsel__output_type()
410 if (pmu && pmu->is_core) in evsel__output_type()
413 evsel->script_output_type = type; in evsel__output_type()
448 struct perf_event_attr *attr = &evsel->core.attr; in evsel__do_check_stype()
452 if (attr->sample_type & sample_type) in evsel__do_check_stype()
462 return -1; in evsel__do_check_stype()
488 if (perf_header__has_feat(&session->header, HEADER_STAT)) in evsel__check_attr()
491 allow_user_set = perf_header__has_feat(&session->header, in evsel__check_attr()
495 !perf_session__has_traces(session, "record -R")) in evsel__check_attr()
496 return -EINVAL; in evsel__check_attr()
500 return -EINVAL; in evsel__check_attr()
505 return -EINVAL; in evsel__check_attr()
509 return -EINVAL; in evsel__check_attr()
513 return -EINVAL; in evsel__check_attr()
516 !(evsel->core.attr.sample_type & (PERF_SAMPLE_IP|PERF_SAMPLE_ADDR))) { in evsel__check_attr()
520 return -EINVAL; in evsel__check_attr()
525 return -EINVAL; in evsel__check_attr()
528 !(evsel->core.attr.sample_type & (PERF_SAMPLE_IP|PERF_SAMPLE_ADDR))) { in evsel__check_attr()
530 return -EINVAL; in evsel__check_attr()
535 return -EINVAL; in evsel__check_attr()
539 !(evlist__combined_branch_type(session->evlist) & PERF_SAMPLE_BRANCH_ANY)) { in evsel__check_attr()
540 pr_err("Display of branch stack assembler requested, but non all-branch filter set\n" in evsel__check_attr()
541 "Hint: run 'perf record -b ...'\n"); in evsel__check_attr()
542 return -EINVAL; in evsel__check_attr()
545 !(evlist__combined_branch_type(session->evlist) & PERF_SAMPLE_BRANCH_COUNTERS)) { in evsel__check_attr()
547 "Hint: run 'perf record -j any,counter ...'\n"); in evsel__check_attr()
548 return -EINVAL; in evsel__check_attr()
552 return -EINVAL; in evsel__check_attr()
556 return -EINVAL; in evsel__check_attr()
560 return -EINVAL; in evsel__check_attr()
564 return -EINVAL; in evsel__check_attr()
568 return -EINVAL; in evsel__check_attr()
572 return -EINVAL; in evsel__check_attr()
576 return -EINVAL; in evsel__check_attr()
580 return -EINVAL; in evsel__check_attr()
584 return -EINVAL; in evsel__check_attr()
588 pr_err("Hint: run 'perf record --all-cgroups ...'\n"); in evsel__check_attr()
589 return -EINVAL; in evsel__check_attr()
594 return -EINVAL; in evsel__check_attr()
648 evsel = find_first_output_type(session->evlist, j); in perf_session__check_output_opt()
657 "Remove corresponding -F option to proceed.\n", in perf_session__check_output_opt()
659 return -1; in perf_session__check_output_opt()
664 return -1; in perf_session__check_output_opt()
681 evlist__for_each_entry(session->evlist, evsel) { in perf_session__check_output_opt()
700 evlist__for_each_entry(session->evlist, evsel) { in perf_session__check_output_opt()
701 if (evsel->core.attr.type != j) in perf_session__check_output_opt()
715 if (tod && !session->header.env.clock.enabled) { in perf_session__check_output_opt()
717 "Please record with -k/--clockid option.\n"); in perf_session__check_output_opt()
718 return -1; in perf_session__check_output_opt()
730 if (!regs || !regs->regs) in perf_sample__fprintf_regs()
733 printed += fprintf(fp, " ABI:%" PRIu64 " ", regs->abi); in perf_sample__fprintf_regs()
736 u64 val = regs->regs[i++]; in perf_sample__fprintf_regs()
760 env = &script->session->header.env; in tod_scnprintf()
761 if (!env->clock.enabled) { in tod_scnprintf()
766 clockid_ns = env->clock.clockid_ns; in tod_scnprintf()
767 tod_ns = env->clock.tod_ns; in tod_scnprintf()
770 tod_ns += timestamp - clockid_ns; in tod_scnprintf()
772 tod_ns -= clockid_ns - timestamp; in tod_scnprintf()
775 nsec = tod_ns - sec * NSEC_PER_SEC; in tod_scnprintf()
796 if (!sample->intr_regs) in perf_sample__fprintf_iregs()
800 attr->sample_regs_intr, arch, fp); in perf_sample__fprintf_iregs()
806 if (!sample->user_regs) in perf_sample__fprintf_uregs()
810 attr->sample_regs_user, arch, fp); in perf_sample__fprintf_uregs()
837 if (PRINT_FIELD(MACHINE_PID) && sample->machine_pid) in perf_sample__fprintf_start()
838 printed += fprintf(fp, "VM:%5d ", sample->machine_pid); in perf_sample__fprintf_start()
841 if (PRINT_FIELD(VCPU) && sample->machine_pid) in perf_sample__fprintf_start()
842 printed += fprintf(fp, "VCPU:%03d ", sample->vcpu); in perf_sample__fprintf_start()
845 const char *comm = thread ? thread__comm_str(thread) : ":-1"; in perf_sample__fprintf_start()
856 printed += fprintf(fp, "%7d/%-7d ", sample->pid, sample->tid); in perf_sample__fprintf_start()
858 printed += fprintf(fp, "%7d ", sample->pid); in perf_sample__fprintf_start()
860 printed += fprintf(fp, "%7d ", sample->tid); in perf_sample__fprintf_start()
864 printed += fprintf(fp, "%3d ", sample->cpu); in perf_sample__fprintf_start()
866 printed += fprintf(fp, "[%03d] ", sample->cpu); in perf_sample__fprintf_start()
873 (sample->misc & PERF_RECORD_MISC_##m) == PERF_RECORD_MISC_##m in perf_sample__fprintf_start()
900 if (sample->misc & PERF_RECORD_MISC_SWITCH_OUT_PREEMPT) in perf_sample__fprintf_start()
909 ret += fprintf(fp, "%*s", 6 - ret, " "); in perf_sample__fprintf_start()
914 tod_scnprintf(script, tstr, sizeof(tstr), sample->time); in perf_sample__fprintf_start()
919 u64 t = sample->time; in perf_sample__fprintf_start()
922 initial_time = sample->time; in perf_sample__fprintf_start()
923 t = sample->time - initial_time; in perf_sample__fprintf_start()
926 t = sample->time - previous_time; in perf_sample__fprintf_start()
930 previous_time = sample->time; in perf_sample__fprintf_start()
934 nsecs -= secs * NSEC_PER_SEC; in perf_sample__fprintf_start()
949 bstack_event_str(struct branch_entry *br, char *buf, size_t sz) in bstack_event_str() argument
951 if (!(br->flags.mispred || br->flags.predicted || br->flags.not_taken)) in bstack_event_str()
952 return snprintf(buf, sz, "-"); in bstack_event_str()
955 br->flags.predicted ? "P" : "M", in bstack_event_str()
956 br->flags.not_taken ? "N" : ""); in bstack_event_str()
959 static int print_bstack_flags(FILE *fp, struct branch_entry *br) in print_bstack_flags() argument
964 pos = bstack_event_str(br, events, sizeof(events)); in print_bstack_flags()
966 pos < 0 ? "-" : events, in print_bstack_flags()
967 br->flags.in_tx ? 'X' : '-', in print_bstack_flags()
968 br->flags.abort ? 'A' : '-', in print_bstack_flags()
969 br->flags.cycles, in print_bstack_flags()
970 get_branch_type(br), in print_bstack_flags()
971 br->flags.spec ? branch_spec_desc(br->flags.spec) : "-"); in print_bstack_flags()
978 struct branch_stack *br = sample->branch_stack; in perf_sample__fprintf_brstack() local
983 if (!(br && br->nr)) in perf_sample__fprintf_brstack()
986 for (i = 0; i < br->nr; i++) { in perf_sample__fprintf_brstack()
996 thread__find_map_fb(thread, sample->cpumode, from, &alf); in perf_sample__fprintf_brstack()
997 thread__find_map_fb(thread, sample->cpumode, to, &alt); in perf_sample__fprintf_brstack()
1017 struct branch_stack *br = sample->branch_stack; in perf_sample__fprintf_brstacksym() local
1022 if (!(br && br->nr)) in perf_sample__fprintf_brstacksym()
1025 for (i = 0; i < br->nr; i++) { in perf_sample__fprintf_brstacksym()
1033 thread__find_symbol_fb(thread, sample->cpumode, from, &alf); in perf_sample__fprintf_brstacksym()
1034 thread__find_symbol_fb(thread, sample->cpumode, to, &alt); in perf_sample__fprintf_brstacksym()
1055 struct branch_stack *br = sample->branch_stack; in perf_sample__fprintf_brstackoff() local
1060 if (!(br && br->nr)) in perf_sample__fprintf_brstackoff()
1063 for (i = 0; i < br->nr; i++) { in perf_sample__fprintf_brstackoff()
1071 if (thread__find_map_fb(thread, sample->cpumode, from, &alf) && in perf_sample__fprintf_brstackoff()
1075 if (thread__find_map_fb(thread, sample->cpumode, to, &alt) && in perf_sample__fprintf_brstackoff()
1120 pr_debug("\tblock %" PRIx64 "-%" PRIx64 " transfers between kernel and user\n", start, end); in grab_bb()
1121 return -ENXIO; in grab_bb()
1124 if (end - start > MAXBB - MAXINSN) { in grab_bb()
1126 pr_debug("\tbrstack does not reach to final jump (%" PRIx64 "-%" PRIx64 ")\n", start, end); in grab_bb()
1128 …pr_debug("\tblock %" PRIx64 "-%" PRIx64 " (%" PRIu64 ") too long to dump\n", start, end, end - sta… in grab_bb()
1134 pr_debug("\tcannot resolve %" PRIx64 "-%" PRIx64 "\n", start, end); in grab_bb()
1137 if (dso__data(dso)->status == DSO_DATA_STATUS_ERROR) { in grab_bb()
1138 pr_debug("\tcannot resolve %" PRIx64 "-%" PRIx64 "\n", start, end); in grab_bb()
1142 /* Load maps to ensure dso->is_64_bit has been updated */ in grab_bb()
1147 end - start + MAXINSN); in grab_bb()
1151 pr_debug("\tcannot fetch code for block at %" PRIx64 "-%" PRIx64 "\n", in grab_bb()
1178 state->srcfile && in map__fprintf_srccode()
1179 !strcmp(state->srcfile, srcfile) && in map__fprintf_srccode()
1180 state->line == line) { in map__fprintf_srccode()
1189 ret = fprintf(fp, "|%-8d %.*s", line, len, srccode); in map__fprintf_srccode()
1192 state->srcfile = srcfile; in map__fprintf_srccode()
1193 state->line = line; in map__fprintf_srccode()
1227 int printed = fprintf_insn_asm(x->machine, x->thread, x->cpumode, x->is64bit, in any_dump_insn()
1241 printed += fprintf(fp, "%*s", padding - printed, ""); in add_padding()
1265 thread__find_map(thread, x->cpumode, ip, &al); in ip__fprintf_jump()
1276 mask = (1L << width) - 1; in ip__fprintf_jump()
1278 evlist__for_each_entry_from(evsel->evlist, pos) { in ip__fprintf_jump()
1279 if (!(pos->core.attr.branch_sample_type & PERF_SAMPLE_BRANCH_COUNTERS)) in ip__fprintf_jump()
1287 printed += fprintf(fp, "%s", pos->abbr_name); in ip__fprintf_jump()
1289 printed += fprintf(fp, "%s %d ", pos->name, num); in ip__fprintf_jump()
1295 en->flags.predicted ? " PRED" : "", in ip__fprintf_jump()
1296 en->flags.mispred ? " MISPRED" : "", in ip__fprintf_jump()
1297 en->flags.in_tx ? " INTX" : "", in ip__fprintf_jump()
1298 en->flags.abort ? " ABORT" : ""); in ip__fprintf_jump()
1299 if (en->flags.cycles) { in ip__fprintf_jump()
1300 *total_cycles += en->flags.cycles; in ip__fprintf_jump()
1301 printed += fprintf(fp, " %d cycles [%d]", en->flags.cycles, *total_cycles); in ip__fprintf_jump()
1303 printed += fprintf(fp, " %.2f IPC", (float)insn / en->flags.cycles); in ip__fprintf_jump()
1319 if ((*lastsym) && al.addr >= (*lastsym)->start && al.addr < (*lastsym)->end) in ip__fprintf_sym()
1330 if (al.addr < al.sym->end) in ip__fprintf_sym()
1331 off = al.addr - al.sym->start; in ip__fprintf_sym()
1333 off = al.addr - map__start(al.map) - al.sym->start; in ip__fprintf_sym()
1334 printed += fprintf(fp, "\t%s", al.sym->name); in ip__fprintf_sym()
1355 struct branch_stack *br = sample->branch_stack; in perf_sample__fprintf_brstackinsn() local
1366 if (!(br && br->nr)) in perf_sample__fprintf_brstackinsn()
1368 nr = br->nr; in perf_sample__fprintf_brstackinsn()
1369 if (max_blocks && nr > max_blocks + 1) in perf_sample__fprintf_brstackinsn()
1370 nr = max_blocks + 1; in perf_sample__fprintf_brstackinsn()
1374 x.cpu = sample->cpu; in perf_sample__fprintf_brstackinsn()
1376 if (PRINT_FIELD(BRCNTR) && sample->branch_stack_cntr) in perf_sample__fprintf_brstackinsn()
1377 br_cntr = sample->branch_stack_cntr[nr - 1]; in perf_sample__fprintf_brstackinsn()
1382 len = grab_bb(buffer, entries[nr-1].from, in perf_sample__fprintf_brstackinsn()
1383 entries[nr-1].from, in perf_sample__fprintf_brstackinsn()
1386 printed += ip__fprintf_sym(entries[nr - 1].from, thread, in perf_sample__fprintf_brstackinsn()
1388 printed += ip__fprintf_jump(entries[nr - 1].from, &entries[nr - 1], in perf_sample__fprintf_brstackinsn()
1392 printed += print_srccode(thread, x.cpumode, entries[nr - 1].from); in perf_sample__fprintf_brstackinsn()
1396 for (i = nr - 2; i >= 0; i--) { in perf_sample__fprintf_brstackinsn()
1398 pr_debug("%d: %" PRIx64 "-%" PRIx64 "\n", i, in perf_sample__fprintf_brstackinsn()
1401 start = entries[i + 1].to; in perf_sample__fprintf_brstackinsn()
1406 if (len == -ENXIO && i > 0) { in perf_sample__fprintf_brstackinsn()
1407 end = entries[--i].from; in perf_sample__fprintf_brstackinsn()
1408 pr_debug("\tpatching up to %" PRIx64 "-%" PRIx64 "\n", start, end); in perf_sample__fprintf_brstackinsn()
1420 if (PRINT_FIELD(BRCNTR) && sample->branch_stack_cntr) in perf_sample__fprintf_brstackinsn()
1421 br_cntr = sample->branch_stack_cntr[i]; in perf_sample__fprintf_brstackinsn()
1422 printed += ip__fprintf_jump(ip, &entries[i], &x, buffer + off, len - off, ++insn, fp, in perf_sample__fprintf_brstackinsn()
1430 printed += any_dump_insn(evsel, &x, ip, buffer + off, len - off, &ilen, fp); in perf_sample__fprintf_brstackinsn()
1441 if (off != end - start) in perf_sample__fprintf_brstackinsn()
1449 if (entries[0].from == sample->ip) in perf_sample__fprintf_brstackinsn()
1463 end = sample->ip; in perf_sample__fprintf_brstackinsn()
1472 len = grab_bb(buffer, sample->ip, sample->ip, in perf_sample__fprintf_brstackinsn()
1477 printed += fprintf(fp, "\t%016" PRIx64 "\t", sample->ip); in perf_sample__fprintf_brstackinsn()
1478 printed += any_dump_insn(evsel, &x, sample->ip, buffer, len, &ilen, fp); in perf_sample__fprintf_brstackinsn()
1483 print_srccode(thread, x.cpumode, sample->ip); in perf_sample__fprintf_brstackinsn()
1486 for (off = 0; off <= end - start; off += ilen) { in perf_sample__fprintf_brstackinsn()
1489 printed += any_dump_insn(evsel, &x, start + off, buffer + off, len - off, &ilen, fp); in perf_sample__fprintf_brstackinsn()
1495 if ((attr->branch_sample_type == 0 || attr->branch_sample_type & PERF_SAMPLE_BRANCH_ANY) in perf_sample__fprintf_brstackinsn()
1496 && arch_is_uncond_branch(buffer + off, len - off, x.is64bit) in perf_sample__fprintf_brstackinsn()
1497 && start + off != sample->ip) { in perf_sample__fprintf_brstackinsn()
1516 int printed = fprintf(fp, "%16" PRIx64, sample->addr); in perf_sample__fprintf_addr()
1519 if (!sample_addr_correlates_sym(&evsel->core.attr)) in perf_sample__fprintf_addr()
1548 if (sample->flags & (PERF_IP_FLAG_CALL | PERF_IP_FLAG_TRACE_BEGIN)) { in resolve_branch_sym()
1549 if (sample_addr_correlates_sym(&evsel->core.attr)) { in resolve_branch_sym()
1550 if (!addr_al->thread) in resolve_branch_sym()
1552 if (addr_al->sym) in resolve_branch_sym()
1553 name = addr_al->sym->name; in resolve_branch_sym()
1555 *ip = sample->addr; in resolve_branch_sym()
1557 *ip = sample->addr; in resolve_branch_sym()
1559 } else if (sample->flags & (PERF_IP_FLAG_RETURN | PERF_IP_FLAG_TRACE_END)) { in resolve_branch_sym()
1560 if (al->sym) in resolve_branch_sym()
1561 name = al->sym->name; in resolve_branch_sym()
1563 *ip = sample->ip; in resolve_branch_sym()
1575 size_t depth = thread_stack__depth(thread, sample->cpu); in perf_sample__fprintf_callindent()
1586 if (thread__ts(thread) && sample->flags & PERF_IP_FLAG_RETURN) in perf_sample__fprintf_callindent()
1587 depth += 1; in perf_sample__fprintf_callindent()
1593 dlen += map__fprintf_dsoname(al->map, fp); in perf_sample__fprintf_callindent()
1609 if (len > spacing || (len && len < spacing - 52)) in perf_sample__fprintf_callindent()
1613 len += fprintf(fp, "%*s", spacing - len, ""); in perf_sample__fprintf_callindent()
1630 printed += fprintf(fp, " ilen: %d", sample->insn_len); in perf_sample__fprintf_insn()
1631 if (PRINT_FIELD(INSN) && sample->insn_len) { in perf_sample__fprintf_insn()
1635 if (PRINT_FIELD(DISASM) && sample->insn_len) { in perf_sample__fprintf_insn()
1650 if (!PRINT_FIELD(IPC) || !sample->cyc_cnt || !sample->insn_cnt) in perf_sample__fprintf_ipc()
1653 ipc = (sample->insn_cnt * 100) / sample->cyc_cnt; in perf_sample__fprintf_ipc()
1656 ipc / 100, ipc % 100, sample->insn_cnt, sample->cyc_cnt); in perf_sample__fprintf_ipc()
1666 struct perf_event_attr *attr = &evsel->core.attr; in perf_sample__fprintf_bts()
1679 if (symbol_conf.use_callchain && sample->callchain) { in perf_sample__fprintf_bts()
1681 if (thread__resolve_callchain(al->thread, cursor, evsel, in perf_sample__fprintf_bts()
1701 ((evsel->core.attr.sample_type & PERF_SAMPLE_ADDR) && in perf_sample__fprintf_bts()
1710 printed += map__fprintf_srcline(al->map, al->addr, "\n ", fp); in perf_sample__fprintf_bts()
1715 int ret = map__fprintf_srccode(al->map, al->addr, stdout, in perf_sample__fprintf_bts()
1732 return fprintf(fp, " raw flags:0x%-*x ", in perf_sample__fprintf_flags()
1733 SAMPLE_FLAGS_STR_ALIGNED_SIZE - 12, flags); in perf_sample__fprintf_flags()
1735 return fprintf(fp, " %-*s ", SAMPLE_FLAGS_STR_ALIGNED_SIZE, str); in perf_sample__fprintf_flags()
1757 printed += fprintf(fp, "%17s", !printer_data->line_no ? "BPF output:" : in sample__fprintf_bpf_output()
1773 if (printer_data->hit_nul && ch) in sample__fprintf_bpf_output()
1774 printer_data->is_printable = false; in sample__fprintf_bpf_output()
1779 if (!printer_data->is_printable) in sample__fprintf_bpf_output()
1783 printer_data->hit_nul = true; in sample__fprintf_bpf_output()
1785 printer_data->is_printable = false; in sample__fprintf_bpf_output()
1795 printer_data->line_no++; in sample__fprintf_bpf_output()
1807 unsigned int nr_bytes = sample->raw_size; in perf_sample__fprintf_bpf_output()
1809 int printed = binary__fprintf(sample->raw_data, nr_bytes, 8, in perf_sample__fprintf_bpf_output()
1813 printed += fprintf(fp, "%17s \"%s\"\n", "BPF string:", (char *)(sample->raw_data)); in perf_sample__fprintf_bpf_output()
1821 return fprintf(fp, "%*s", spacing - len, ""); in perf_sample__fprintf_spacing()
1855 char str[sizeof(u64) + 1] = ""; in perf_sample__fprintf_synth_ptwrite()
1862 val = le64_to_cpu(data->payload); in perf_sample__fprintf_synth_ptwrite()
1868 data->ip, val, str); in perf_sample__fprintf_synth_ptwrite()
1881 data->hints, data->extensions); in perf_sample__fprintf_synth_mwait()
1893 len = fprintf(fp, " hw: %u cstate: %u sub-cstate: %u ", in perf_sample__fprintf_synth_pwre()
1894 data->hw, data->cstate, data->subcstate); in perf_sample__fprintf_synth_pwre()
1906 len = fprintf(fp, " IP: %u ", data->ip); in perf_sample__fprintf_synth_exstop()
1919 data->deepest_cstate, data->last_cstate, in perf_sample__fprintf_synth_pwrx()
1920 data->wake_reason); in perf_sample__fprintf_synth_pwrx()
1933 freq = (le32_to_cpu(data->freq) + 500) / 1000; in perf_sample__fprintf_synth_cbr()
1934 len = fprintf(fp, " cbr: %2u freq: %4u MHz ", data->cbr, freq); in perf_sample__fprintf_synth_cbr()
1935 if (data->max_nonturbo) { in perf_sample__fprintf_synth_cbr()
1936 percent = (5 + (1000 * data->cbr) / data->max_nonturbo) / 10; in perf_sample__fprintf_synth_cbr()
1950 len = fprintf(fp, " psb offs: %#" PRIx64, data->offset); in perf_sample__fprintf_synth_psb()
1968 s = cfe[data->type]; in perf_sample__fprintf_synth_evt()
1971 s, data->ip, data->vector); in perf_sample__fprintf_synth_evt()
1974 data->type, data->ip, data->vector); in perf_sample__fprintf_synth_evt()
1976 for (i = 0; i < data->evd_cnt; i++) { in perf_sample__fprintf_synth_evt()
1977 unsigned int et = data->evd[i].evd_type & 0x3f; in perf_sample__fprintf_synth_evt()
1982 s, data->evd[i].payload); in perf_sample__fprintf_synth_evt()
1985 et, data->evd[i].payload); in perf_sample__fprintf_synth_evt()
1999 len = fprintf(fp, " IFLAG: %d->%d %s branch", !data->iflag, data->iflag, in perf_sample__fprintf_synth_iflag_chg()
2000 data->via_branch ? "via" : "non"); in perf_sample__fprintf_synth_iflag_chg()
2007 switch (evsel->core.attr.config) { in perf_sample__fprintf_synth()
2050 char decode[100]; in data_src__fprintf()
2051 char out[100]; in data_src__fprintf()
2056 return -ENOMEM; in data_src__fprintf()
2058 mem_info__data_src(mi)->val = data_src; in data_src__fprintf()
2059 perf_script__meminfo_scnprintf(decode, 100, mi); in data_src__fprintf()
2062 len = scnprintf(out, 100, "%16" PRIx64 " %s", data_src, decode); in data_src__fprintf()
2066 return fprintf(fp, "%-*s", maxlen, out); in data_src__fprintf()
2085 perf_sample__fprintf_start(NULL, mctx->sample, mctx->thread, mctx->evsel, in script_print_metric()
2086 PERF_RECORD_SAMPLE, mctx->fp); in script_print_metric()
2087 fputs("\tmetric: ", mctx->fp); in script_print_metric()
2089 color_fprintf(mctx->fp, color, fmt, val); in script_print_metric()
2092 fprintf(mctx->fp, " %s\n", unit); in script_print_metric()
2100 perf_sample__fprintf_start(NULL, mctx->sample, mctx->thread, mctx->evsel, in script_new_line()
2101 PERF_RECORD_SAMPLE, mctx->fp); in script_new_line()
2102 fputs("\tmetric: ", mctx->fp); in script_new_line()
2126 if (!evsel->stats) in perf_sample__fprint_metric()
2127 evlist__alloc_stats(&stat_config, script->session->evlist, /*alloc_raw=*/false); in perf_sample__fprint_metric()
2128 if (evsel_script(leader)->gnum++ == 0) in perf_sample__fprint_metric()
2130 val = sample->period * evsel->scale; in perf_sample__fprint_metric()
2131 evsel_script(evsel)->val = val; in perf_sample__fprint_metric()
2132 if (evsel_script(leader)->gnum == leader->core.nr_members) { in perf_sample__fprint_metric()
2135 evsel_script(ev2)->val, in perf_sample__fprint_metric()
2136 sample->cpu, in perf_sample__fprint_metric()
2140 evsel_script(leader)->gnum = 0; in perf_sample__fprint_metric()
2150 int depth = thread_stack__depth(thread, sample->cpu); in show_event()
2192 struct thread *thread = al->thread; in process_event()
2193 struct perf_event_attr *attr = &evsel->core.attr; in process_event()
2195 struct evsel_script *es = evsel->priv; in process_event()
2196 FILE *fp = es->fp; in process_event()
2198 const char *arch = perf_env__arch(machine->env); in process_event()
2203 ++es->samples; in process_event()
2209 fprintf(fp, "%10" PRIu64 " ", sample->period); in process_event()
2214 if (!script->name_width) in process_event()
2215 script->name_width = evlist__max_name_len(script->session->evlist); in process_event()
2217 fprintf(fp, "%*s: ", script->name_width, evname ?: "[unknown]"); in process_event()
2221 perf_sample__fprintf_flags(sample->flags, fp); in process_event()
2228 if (PRINT_FIELD(TRACE) && sample->raw_data) { in process_event()
2232 event_format__fprintf(tp_format, sample->cpu, in process_event()
2233 sample->raw_data, sample->raw_size, in process_event()
2238 if (attr->type == PERF_TYPE_SYNTH && PRINT_FIELD(SYNTH)) in process_event()
2245 data_src__fprintf(sample->data_src, fp); in process_event()
2248 fprintf(fp, "%16" PRIu64, sample->weight); in process_event()
2251 fprintf(fp, "%16" PRIu16, sample->ins_lat); in process_event()
2254 fprintf(fp, "%16" PRIu16, sample->retire_lat); in process_event()
2258 struct cgroup *cgrp = cgroup__find(machine->env, in process_event()
2259 sample->cgroup); in process_event()
2261 cgrp_name = cgrp->name; in process_event()
2270 if (script->stitch_lbr) in process_event()
2271 thread__set_lbr_stitch_enable(al->thread, true); in process_event()
2273 if (symbol_conf.use_callchain && sample->callchain) { in process_event()
2275 if (thread__resolve_callchain(al->thread, cursor, evsel, in process_event()
2303 fprintf(fp, "%16" PRIx64, sample->phys_addr); in process_event()
2306 fprintf(fp, " %s", get_page_size_name(sample->data_page_size, str)); in process_event()
2309 fprintf(fp, " %s", get_page_size_name(sample->code_page_size, str)); in process_event()
2316 if (map__fprintf_srccode(al->map, al->addr, stdout, in process_event()
2332 int nthreads = perf_thread_map__nr(counter->core.threads); in __process_stat()
2340 header_printed = 1; in __process_stat()
2347 counts = perf_counts(counter->counts, idx, thread); in __process_stat()
2351 perf_thread_map__pid(counter->core.threads, thread), in __process_stat()
2352 counts->val, in __process_stat()
2353 counts->ena, in __process_stat()
2354 counts->run, in __process_stat()
2363 if (scripting_ops && scripting_ops->process_stat) in process_stat()
2364 scripting_ops->process_stat(&stat_config, counter, tstamp); in process_stat()
2371 if (scripting_ops && scripting_ops->process_stat_interval) in process_stat_interval()
2372 scripting_ops->process_stat_interval(tstamp); in process_stat_interval()
2385 return scripting_ops ? scripting_ops->flush_script() : 0; in flush_scripting()
2392 return scripting_ops ? scripting_ops->stop_script() : 0; in cleanup_scripting()
2397 if (cpu_list && sample->cpu != (u32)-1) in filter_cpu()
2398 return !test_bit(sample->cpu, cpu_bitmap); in filter_cpu()
2424 if (perf_time__ranges_skip_sample(scr->ptime_range, scr->range_num, in process_sample_event()
2425 sample->time)) { in process_sample_event()
2430 if (sample->time < last_timestamp) { in process_sample_event()
2433 sample->time); in process_sample_event()
2436 last_timestamp = sample->time; in process_sample_event()
2445 event->header.type); in process_sample_event()
2446 ret = -1; in process_sample_event()
2456 if (evswitch__discard(&scr->evswitch, evsel)) in process_sample_event()
2469 if ((evsel->core.attr.sample_type & PERF_SAMPLE_ADDR) && in process_sample_event()
2470 sample_addr_correlates_sym(&evsel->core.attr)) { in process_sample_event()
2475 scripting_ops->process_event(event, sample, evsel, &al, addr_al_ptr); in process_sample_event()
2486 // Used when scr->per_event_dump is not set
2505 if (!evsel->priv) { in process_attr()
2506 if (scr->per_event_dump) { in process_attr()
2507 evsel->priv = evsel_script__new(evsel, scr->session->data); in process_attr()
2508 if (!evsel->priv) in process_attr()
2509 return -ENOMEM; in process_attr()
2512 evsel->priv = &es_stdout; in process_attr()
2516 if (evsel->core.attr.type >= PERF_TYPE_MAX && in process_attr()
2517 evsel->core.attr.type != PERF_TYPE_SYNTH) in process_attr()
2521 if (pos->core.attr.type == evsel->core.attr.type && pos != evsel) in process_attr()
2525 if (evsel->core.attr.sample_type) { in process_attr()
2526 err = evsel__check_attr(evsel, scr->session); in process_attr()
2536 callchain_param_setup(sample_type, perf_env__arch((*pevlist)->env)); in process_attr()
2562 struct perf_session *session = script->session; in print_event_with_time()
2563 struct evsel *evsel = evlist__id2evsel(session->evlist, sample->id); in print_event_with_time()
2566 if (evsel && !evsel->core.attr.sample_id_all) { in print_event_with_time()
2567 sample->cpu = 0; in print_event_with_time()
2568 sample->time = timestamp; in print_event_with_time()
2569 sample->pid = pid; in print_event_with_time()
2570 sample->tid = tid; in print_event_with_time()
2576 if (tid != -1) in print_event_with_time()
2581 event->header.type, stdout); in print_event_with_time()
2604 return -1; in process_comm_event()
2606 return print_event(tool, event, sample, machine, event->comm.pid, in process_comm_event()
2607 event->comm.tid); in process_comm_event()
2616 return -1; in process_namespaces_event()
2618 return print_event(tool, event, sample, machine, event->namespaces.pid, in process_namespaces_event()
2619 event->namespaces.tid); in process_namespaces_event()
2628 return -1; in process_cgroup_event()
2630 return print_event(tool, event, sample, machine, sample->pid, in process_cgroup_event()
2631 sample->tid); in process_cgroup_event()
2640 return -1; in process_fork_event()
2643 event->fork.pid, event->fork.tid, in process_fork_event()
2644 event->fork.time); in process_fork_event()
2652 if (print_event_with_time(tool, event, sample, machine, event->fork.pid, in process_exit_event()
2653 event->fork.tid, event->fork.time)) in process_exit_event()
2654 return -1; in process_exit_event()
2665 return -1; in process_mmap_event()
2667 return print_event(tool, event, sample, machine, event->mmap.pid, in process_mmap_event()
2668 event->mmap.tid); in process_mmap_event()
2677 return -1; in process_mmap2_event()
2679 return print_event(tool, event, sample, machine, event->mmap2.pid, in process_mmap2_event()
2680 event->mmap2.tid); in process_mmap2_event()
2691 return -1; in process_switch_event()
2693 if (scripting_ops && scripting_ops->process_switch && !filter_cpu(sample)) in process_switch_event()
2694 scripting_ops->process_switch(event, sample, machine); in process_switch_event()
2696 if (!script->show_switch_events) in process_switch_event()
2699 return print_event(tool, event, sample, machine, sample->pid, in process_switch_event()
2700 sample->tid); in process_switch_event()
2706 if (scripting_ops && scripting_ops->process_auxtrace_error) { in process_auxtrace_error()
2707 scripting_ops->process_auxtrace_error(session, event); in process_auxtrace_error()
2720 return print_event(tool, event, sample, machine, sample->pid, in process_lost_event()
2721 sample->tid); in process_lost_event()
2730 if (scripting_ops && scripting_ops->process_throttle) in process_throttle_event()
2731 scripting_ops->process_throttle(event, sample, machine); in process_throttle_event()
2752 return -1; in process_bpf_events()
2754 return print_event(tool, event, sample, machine, sample->pid, in process_bpf_events()
2755 sample->tid); in process_bpf_events()
2764 return -1; in process_text_poke_events()
2766 return print_event(tool, event, sample, machine, sample->pid, in process_text_poke_events()
2767 sample->tid); in process_text_poke_events()
2772 session_done = 1; in sig_handler()
2777 struct evlist *evlist = script->session->evlist; in perf_script__fclose_per_event_dump()
2781 if (!evsel->priv) in perf_script__fclose_per_event_dump()
2783 evsel_script__delete(evsel->priv); in perf_script__fclose_per_event_dump()
2784 evsel->priv = NULL; in perf_script__fclose_per_event_dump()
2792 evlist__for_each_entry(script->session->evlist, evsel) { in perf_script__fopen_per_event_dump()
2800 if (evsel->priv != NULL) in perf_script__fopen_per_event_dump()
2803 evsel->priv = evsel_script__new(evsel, script->session->data); in perf_script__fopen_per_event_dump()
2804 if (evsel->priv == NULL) in perf_script__fopen_per_event_dump()
2812 return -1; in perf_script__fopen_per_event_dump()
2819 if (script->per_event_dump) in perf_script__setup_per_event_dump()
2824 evlist__for_each_entry(script->session->evlist, evsel) in perf_script__setup_per_event_dump()
2825 evsel->priv = &es_stdout; in perf_script__setup_per_event_dump()
2834 evlist__for_each_entry(script->session->evlist, evsel) { in perf_script__exit_per_event_dump_stats()
2835 struct evsel_script *es = evsel->priv; in perf_script__exit_per_event_dump_stats()
2839 evsel->priv = NULL; in perf_script__exit_per_event_dump_stats()
2845 perf_thread_map__put(script->threads); in perf_script__exit()
2846 perf_cpu_map__put(script->cpus); in perf_script__exit()
2856 if (script->show_task_events) { in __cmd_script()
2857 script->tool.comm = process_comm_event; in __cmd_script()
2858 script->tool.fork = process_fork_event; in __cmd_script()
2859 script->tool.exit = process_exit_event; in __cmd_script()
2861 if (script->show_mmap_events) { in __cmd_script()
2862 script->tool.mmap = process_mmap_event; in __cmd_script()
2863 script->tool.mmap2 = process_mmap2_event; in __cmd_script()
2865 if (script->show_switch_events || (scripting_ops && scripting_ops->process_switch)) in __cmd_script()
2866 script->tool.context_switch = process_switch_event; in __cmd_script()
2867 if (scripting_ops && scripting_ops->process_auxtrace_error) in __cmd_script()
2868 script->tool.auxtrace_error = process_auxtrace_error; in __cmd_script()
2869 if (script->show_namespace_events) in __cmd_script()
2870 script->tool.namespaces = process_namespaces_event; in __cmd_script()
2871 if (script->show_cgroup_events) in __cmd_script()
2872 script->tool.cgroup = process_cgroup_event; in __cmd_script()
2873 if (script->show_lost_events) in __cmd_script()
2874 script->tool.lost = process_lost_event; in __cmd_script()
2875 if (script->show_round_events) { in __cmd_script()
2876 script->tool.ordered_events = false; in __cmd_script()
2877 script->tool.finished_round = process_finished_round_event; in __cmd_script()
2879 if (script->show_bpf_events) { in __cmd_script()
2880 script->tool.ksymbol = process_bpf_events; in __cmd_script()
2881 script->tool.bpf = process_bpf_events; in __cmd_script()
2883 if (script->show_text_poke_events) { in __cmd_script()
2884 script->tool.ksymbol = process_bpf_events; in __cmd_script()
2885 script->tool.text_poke = process_text_poke_events; in __cmd_script()
2890 return -1; in __cmd_script()
2893 ret = perf_session__process_events(script->session); in __cmd_script()
2895 if (script->per_event_dump) in __cmd_script()
2906 fprintf(stderr, " %-42s [%s]\n", spec, ops->name); in list_available_languages_cb()
2914 "perf script -s [spec:]script.[spec]):\n\n"); in list_available_languages()
2941 exec_path, scripting_ops->dirname, script); in find_script()
2964 len = script - str; in parse_scriptname()
2967 return -1; in parse_scriptname()
2974 return -1; in parse_scriptname()
2982 return -1; in parse_scriptname()
2987 return -1; in parse_scriptname()
3006 int type = -1; in parse_output_fields()
3010 return -ENOMEM; in parse_output_fields()
3034 rc = -EINVAL; in parse_output_fields()
3042 /* Don't override defaults for +- */ in parse_output_fields()
3043 if (strchr(tok, '+') || strchr(tok, '-')) in parse_output_fields()
3055 rc = -EINVAL; in parse_output_fields()
3059 /* Don't override defaults for +- */ in parse_output_fields()
3060 if (strchr(str, '+') || strchr(str, '-')) in parse_output_fields()
3080 } else if (*tok == '-') { in parse_output_fields()
3101 rc = -EINVAL; in parse_output_fields()
3107 rc = -EINVAL; in parse_output_fields()
3112 if (type == -1) { in parse_output_fields()
3139 rc = -EINVAL; in parse_output_fields()
3160 fprintf(stderr, "Cannot mix +-field with overridden fields\n"); in parse_output_fields()
3161 rc = -EINVAL; in parse_output_fields()
3169 if ((lang_dirent->d_type == DT_DIR || \
3170 (lang_dirent->d_type == DT_UNKNOWN && \
3172 (strcmp(lang_dirent->d_name, ".")) && \
3173 (strcmp(lang_dirent->d_name, "..")))
3177 if (script_dirent->d_type != DT_DIR && \
3178 (script_dirent->d_type != DT_UNKNOWN || \
3182 #define RECORD_SUFFIX "-record"
3183 #define REPORT_SUFFIX "-report"
3199 s->name = strdup(name); in script_desc__new()
3206 zfree(&s->name); in script_desc__delete()
3207 zfree(&s->half_liner); in script_desc__delete()
3208 zfree(&s->args); in script_desc__delete()
3214 list_add_tail(&s->node, &script_descs); in script_desc__add()
3222 if (strcasecmp(s->name, name) == 0) in script_desc__find()
3249 p = str + strlen(str) - suffix_len; in ends_with()
3264 return -1; in read_script_info()
3277 if (strlen(p) && p[strlen(p) - 1] == '\n') in read_script_info()
3278 p[strlen(p) - 1] = '\0'; in read_script_info()
3282 desc->half_liner = strdup(skip_spaces(p)); in read_script_info()
3288 desc->args = strdup(skip_spaces(p)); in read_script_info()
3302 script_root = strdup(script_dirent->d_name); in get_script_root()
3329 exit(-1); in list_available_scripts()
3345 exit(-1); in list_available_scripts()
3350 lang_dirent->d_name); in list_available_scripts()
3360 lang_path, script_dirent->d_name); in list_available_scripts()
3369 sprintf(first_half, "%s %s", desc->name, in list_available_scripts()
3370 desc->args ? desc->args : ""); in list_available_scripts()
3371 fprintf(stdout, " %-36s %s\n", first_half, in list_available_scripts()
3372 desc->half_liner ? desc->half_liner : ""); in list_available_scripts()
3386 return -1; in add_dlarg()
3388 a = realloc(dlargv, sizeof(dlargv[0]) * (dlargc + 1)); in add_dlarg()
3391 return -1; in add_dlarg()
3402 while (dlargc--) in free_dlarg()
3424 lang_dirent->d_name); in get_script_path()
3435 lang_path, script_dirent->d_name); in get_script_path()
3464 if (!desc->args) in has_required_arg()
3467 for (p = desc->args; *p; p++) in has_required_arg()
3482 return -1; in have_cmd()
3497 struct perf_session *session = script->session; in script__setup_sample_type()
3498 u64 sample_type = evlist__combined_sample_type(session->evlist); in script__setup_sample_type()
3500 callchain_param_setup(sample_type, perf_env__arch(session->machines.host.env)); in script__setup_sample_type()
3502 if (script->stitch_lbr && (callchain_param.record_mode != CALLCHAIN_LBR)) { in script__setup_sample_type()
3503 pr_warning("Can't find LBR callchain. Switch off --stitch-lbr.\n" in script__setup_sample_type()
3504 "Please apply --call-graph lbr when recording.\n"); in script__setup_sample_type()
3505 script->stitch_lbr = false; in script__setup_sample_type()
3512 struct perf_record_stat_round *round = &event->stat_round; in process_stat_round_event()
3515 evlist__for_each_entry(session->evlist, counter) { in process_stat_round_event()
3517 process_stat(counter, round->time); in process_stat_round_event()
3520 process_stat_interval(round->time); in process_stat_round_event()
3527 perf_event__read_stat_config(&stat_config, &event->stat_config); in process_stat_config_event()
3530 * Aggregation modes are not used since post-processing scripts are in process_stat_config_event()
3540 struct evlist *evlist = script->session->evlist; in set_maps()
3542 if (!script->cpus || !script->threads) in set_maps()
3545 if (WARN_ONCE(script->allocated, "stats double allocation\n")) in set_maps()
3546 return -EINVAL; in set_maps()
3548 perf_evlist__set_maps(&evlist->core, script->cpus, script->threads); in set_maps()
3551 return -ENOMEM; in set_maps()
3553 script->allocated = true; in set_maps()
3561 const struct perf_tool *tool = session->tool; in process_thread_map_event()
3567 if (script->threads) { in process_thread_map_event()
3572 script->threads = thread_map__new_event(&event->thread_map); in process_thread_map_event()
3573 if (!script->threads) in process_thread_map_event()
3574 return -ENOMEM; in process_thread_map_event()
3583 const struct perf_tool *tool = session->tool; in process_cpu_map_event()
3589 if (script->cpus) { in process_cpu_map_event()
3594 script->cpus = cpu_map__new_data(&event->cpu_map.data); in process_cpu_map_event()
3595 if (!script->cpus) in process_cpu_map_event()
3596 return -ENOMEM; in process_cpu_map_event()
3604 if (event->feat.feat_id < HEADER_LAST_FEATURE) in process_feature_event()
3616 const struct perf_tool *tool = session->tool; in perf_script__process_auxtrace_info()
3631 const char *fields = "+insn,-event,-period"; in parse_insn_trace()
3636 fields = "+disasm,-event,-period"; in parse_insn_trace()
3639 return -EINVAL; in parse_insn_trace()
3656 if (isatty(1)) in parse_xed()
3657 force_pager("xed -F insn: -A -64 | less"); in parse_xed()
3659 force_pager("xed -F insn: -A -64"); in parse_xed()
3667 parse_output_fields(NULL, "-ip,-addr,-event,-period,+callindent", 0); in parse_call_trace()
3678 parse_output_fields(NULL, "-ip,-addr,-event,-period,+callindent,+flags", 0); in parse_callret_trace()
3708 OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace, in cmd_script()
3710 OPT_BOOLEAN(0, "dump-unsorted-raw-trace", &unsorted_dump, in cmd_script()
3718 OPT_CALLBACK_NOOPT(0, "list-dlfilters", NULL, NULL, "list available dlfilters", in cmd_script()
3723 OPT_STRING('g', "gen-script", &generate_script_lang, "lang", in cmd_script()
3724 "generate perf-script.xx script in specified language"), in cmd_script()
3729 OPT_BOOLEAN('d', "debug-mode", &debug_mode, in cmd_script()
3732 OPT_BOOLEAN(0, "header-only", &header_only, "Show only data header."), in cmd_script()
3737 OPT_BOOLEAN('G', "hide-call-graph", &no_callchain, in cmd_script()
3744 "+field to add and -field to remove." in cmd_script()
3748 "brstacksym,flags,data_src,weight,bpf-output,brstackinsn," in cmd_script()
3754 OPT_BOOLEAN('a', "all-cpus", &system_wide, in cmd_script()
3755 "system-wide collection from all CPUs"), in cmd_script()
3760 OPT_INTEGER(0, "addr-range", &symbol_conf.addr_range, in cmd_script()
3761 "Use with -S to list traced records within address range"), in cmd_script()
3762 OPT_CALLBACK_OPTARG(0, "insn-trace", &itrace_synth_opts, NULL, "raw|disasm", in cmd_script()
3766 OPT_CALLBACK_OPTARG(0, "call-trace", &itrace_synth_opts, NULL, NULL, in cmd_script()
3768 OPT_CALLBACK_OPTARG(0, "call-ret-trace", &itrace_synth_opts, NULL, NULL, in cmd_script()
3770 OPT_STRING(0, "graph-function", &symbol_conf.graph_function, "symbol[,symbol...]", in cmd_script()
3771 "Only print symbols and callees with --call-trace/--call-ret-trace"), in cmd_script()
3772 OPT_STRING(0, "stop-bt", &symbol_conf.bt_stop_list_str, "symbol[,symbol...]", in cmd_script()
3781 OPT_UINTEGER(0, "max-stack", &scripting_max_stack, in cmd_script()
3787 OPT_BOOLEAN('I', "show-info", &show_full_info, in cmd_script()
3789 OPT_BOOLEAN('\0', "show-kernel-path", &symbol_conf.show_kernel_path, in cmd_script()
3791 OPT_BOOLEAN('\0', "show-task-events", &script.show_task_events, in cmd_script()
3793 OPT_BOOLEAN('\0', "show-mmap-events", &script.show_mmap_events, in cmd_script()
3795 OPT_BOOLEAN('\0', "show-switch-events", &script.show_switch_events, in cmd_script()
3797 OPT_BOOLEAN('\0', "show-namespace-events", &script.show_namespace_events, in cmd_script()
3799 OPT_BOOLEAN('\0', "show-cgroup-events", &script.show_cgroup_events, in cmd_script()
3801 OPT_BOOLEAN('\0', "show-lost-events", &script.show_lost_events, in cmd_script()
3803 OPT_BOOLEAN('\0', "show-round-events", &script.show_round_events, in cmd_script()
3805 OPT_BOOLEAN('\0', "show-bpf-events", &script.show_bpf_events, in cmd_script()
3807 OPT_BOOLEAN('\0', "show-text-poke-events", &script.show_text_poke_events, in cmd_script()
3809 OPT_BOOLEAN('\0', "per-event-dump", &script.per_event_dump, in cmd_script()
3812 OPT_INTEGER(0, "max-blocks", &max_blocks, in cmd_script()
3819 OPT_BOOLEAN(0, "full-source-path", &srcline_full_filename, in cmd_script()
3823 OPT_BOOLEAN(0, "demangle-kernel", &symbol_conf.demangle_kernel, in cmd_script()
3840 OPT_BOOLEAN(0, "guest-code", &symbol_conf.guest_code, in cmd_script()
3842 OPT_BOOLEAN('\0', "stitch-lbr", &script.stitch_lbr, in cmd_script()
3850 "perf script [<options>] record <script> [<record-options>] <command>", in cmd_script()
3851 "perf script [<options>] report <script> [script-args]", in cmd_script()
3852 "perf script [<options>] <script> [<record-options>] <command>", in cmd_script()
3853 "perf script [<options>] <top-script> [script-args]", in cmd_script()
3882 return -1; in cmd_script()
3884 if (argc > 1 && strlen(argv[0]) > 2 && strstarts("record", argv[0])) { in cmd_script()
3885 rec_script_path = get_script_path(argv[1], RECORD_SUFFIX); in cmd_script()
3890 if (argc > 1 && strlen(argv[0]) > 2 && strstarts("report", argv[0])) { in cmd_script()
3891 rep_script_path = get_script_path(argv[1], REPORT_SUFFIX); in cmd_script()
3895 "(see 'perf script -l' for listing)\n"); in cmd_script()
3896 return -1; in cmd_script()
3902 "reltime and deltatime - the two don't get along well. " in cmd_script()
3903 "Please limit to --reltime or --deltatime.\n"); in cmd_script()
3904 return -1; in cmd_script()
3925 argc -= 1; in cmd_script()
3926 argv += 1; in cmd_script()
3931 " script -l for available scripts.\n", argv[0]); in cmd_script()
3935 rep_args = argc - 1; in cmd_script()
3940 rec_args = (argc - 1) - rep_args; in cmd_script()
3944 "\n\n See perf script -l for available " in cmd_script()
3951 return -1; in cmd_script()
3957 return -1; in cmd_script()
3963 dup2(live_pipe[1], 1); in cmd_script()
3969 if (have_cmd(argc - rep_args, &argv[rep_args]) != 0) { in cmd_script()
3970 err = -1; in cmd_script()
3978 err = -ENOMEM; in cmd_script()
3985 __argv[j++] = "-a"; in cmd_script()
3986 __argv[j++] = "-q"; in cmd_script()
3987 __argv[j++] = "-o"; in cmd_script()
3988 __argv[j++] = "-"; in cmd_script()
3989 for (i = rep_args + 1; i < argc; i++) in cmd_script()
3995 exit(-1); in cmd_script()
3999 close(live_pipe[1]); in cmd_script()
4004 err = -ENOMEM; in cmd_script()
4011 for (i = 1; i < rep_args + 1; i++) in cmd_script()
4013 __argv[j++] = "-i"; in cmd_script()
4014 __argv[j++] = "-"; in cmd_script()
4019 exit(-1); in cmd_script()
4033 if (have_cmd(argc - 1, &argv[1]) != 0) { in cmd_script()
4034 err = -1; in cmd_script()
4042 err = -ENOMEM; in cmd_script()
4049 __argv[j++] = "-a"; in cmd_script()
4056 exit(-1); in cmd_script()
4062 return -1; in cmd_script()
4111 if (symbol__init(&session->header.env) < 0) in cmd_script()
4117 } else if (session->header.env.arch) { in cmd_script()
4118 if (!strcmp(uts.machine, session->header.env.arch)) in cmd_script()
4121 !strcmp(session->header.env.arch, "i386")) in cmd_script()
4132 session->itrace_synth_opts = &itrace_synth_opts; in cmd_script()
4147 if (session->tevent.pevent && in cmd_script()
4148 tep_set_function_resolver(session->tevent.pevent, in cmd_script()
4150 &session->machines.host) < 0) { in cmd_script()
4152 err = -1; in cmd_script()
4163 err = -EINVAL; in cmd_script()
4169 err = -errno; in cmd_script()
4181 fprintf(stderr, "zero-sized file, nothing to do!\n"); in cmd_script()
4188 err = -ENOENT; in cmd_script()
4192 err = scripting_ops->generate_script(session->tevent.pevent, in cmd_script()
4193 "perf-script"); in cmd_script()
4195 err = scripting_ops->generate_script(NULL, "perf-script"); in cmd_script()
4205 err = scripting_ops->start_script(script_name, argc, argv, session); in cmd_script()
4231 err = evswitch__init(&script.evswitch, session->evlist, stderr); in cmd_script()
4235 if (zstd_init(&(session->zstd_data), 0) < 0) in cmd_script()
4251 zstd_fini(&(session->zstd_data)); in cmd_script()
4252 evlist__free_stats(session->evlist); in cmd_script()