builtin-script.c (820e9906cf64142169134f35b996108303cf22ca) builtin-script.c (7cc72553ac03ec20afe2dec91dce4624ccd379b8)
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"

--- 108 unchanged lines hidden (view full) ---

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,
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"

--- 108 unchanged lines hidden (view full) ---

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 PERF_OUTPUT_INS_LAT = 1ULL << 35,
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;

--- 50 unchanged lines hidden (view full) ---

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},
126};
127
128struct perf_script {
129 struct perf_tool tool;
130 struct perf_session *session;
131 bool show_task_events;
132 bool show_mmap_events;
133 bool show_switch_events;

--- 50 unchanged lines hidden (view full) ---

184 {.str = "phys_addr", .field = PERF_OUTPUT_PHYS_ADDR},
185 {.str = "metric", .field = PERF_OUTPUT_METRIC},
186 {.str = "misc", .field = PERF_OUTPUT_MISC},
187 {.str = "srccode", .field = PERF_OUTPUT_SRCCODE},
188 {.str = "ipc", .field = PERF_OUTPUT_IPC},
189 {.str = "tod", .field = PERF_OUTPUT_TOD},
190 {.str = "data_page_size", .field = PERF_OUTPUT_DATA_PAGE_SIZE},
191 {.str = "code_page_size", .field = PERF_OUTPUT_CODE_PAGE_SIZE},
192 {.str = "ins_lat", .field = PERF_OUTPUT_INS_LAT},
191};
192
193enum {
194 OUTPUT_TYPE_SYNTH = PERF_TYPE_MAX,
195 OUTPUT_TYPE_OTHER,
196 OUTPUT_TYPE_MAX
197};
198

--- 58 unchanged lines hidden (view full) ---

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 |
193};
194
195enum {
196 OUTPUT_TYPE_SYNTH = PERF_TYPE_MAX,
197 OUTPUT_TYPE_OTHER,
198 OUTPUT_TYPE_MAX
199};
200

--- 58 unchanged lines hidden (view full) ---

259
260 .fields = PERF_OUTPUT_COMM | PERF_OUTPUT_TID |
261 PERF_OUTPUT_CPU | PERF_OUTPUT_TIME |
262 PERF_OUTPUT_EVNAME | PERF_OUTPUT_IP |
263 PERF_OUTPUT_SYM | PERF_OUTPUT_SYMOFFSET |
264 PERF_OUTPUT_DSO | PERF_OUTPUT_PERIOD |
265 PERF_OUTPUT_ADDR | PERF_OUTPUT_DATA_SRC |
266 PERF_OUTPUT_WEIGHT | PERF_OUTPUT_PHYS_ADDR |
265 PERF_OUTPUT_DATA_PAGE_SIZE | PERF_OUTPUT_CODE_PAGE_SIZE,
267 PERF_OUTPUT_DATA_PAGE_SIZE | PERF_OUTPUT_CODE_PAGE_SIZE |
268 PERF_OUTPUT_INS_LAT,
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 |

--- 180 unchanged lines hidden (view full) ---

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) &&
269
270 .invalid_fields = PERF_OUTPUT_TRACE | PERF_OUTPUT_BPF_OUTPUT,
271 },
272
273 [PERF_TYPE_BREAKPOINT] = {
274 .user_set = false,
275
276 .fields = PERF_OUTPUT_COMM | PERF_OUTPUT_TID |

--- 180 unchanged lines hidden (view full) ---

457 evsel__do_check_stype(evsel, PERF_SAMPLE_ADDR, "ADDR", PERF_OUTPUT_ADDR, allow_user_set))
458 return -EINVAL;
459
460 if (PRINT_FIELD(DATA_SRC) &&
461 evsel__check_stype(evsel, PERF_SAMPLE_DATA_SRC, "DATA_SRC", PERF_OUTPUT_DATA_SRC))
462 return -EINVAL;
463
464 if (PRINT_FIELD(WEIGHT) &&
462 evsel__check_stype(evsel, PERF_SAMPLE_WEIGHT, "WEIGHT", PERF_OUTPUT_WEIGHT))
465 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;

--- 46 unchanged lines hidden (view full) ---

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
466 return -EINVAL;
467
468 if (PRINT_FIELD(SYM) &&
469 !(evsel->core.attr.sample_type & (PERF_SAMPLE_IP|PERF_SAMPLE_ADDR))) {
470 pr_err("Display of symbols requested but neither sample IP nor "
471 "sample address\navailable. Hence, no addresses to convert "
472 "to symbols.\n");
473 return -EINVAL;

--- 46 unchanged lines hidden (view full) ---

520 if (PRINT_FIELD(DATA_PAGE_SIZE) &&
521 evsel__check_stype(evsel, PERF_SAMPLE_DATA_PAGE_SIZE, "DATA_PAGE_SIZE", PERF_OUTPUT_DATA_PAGE_SIZE))
522 return -EINVAL;
523
524 if (PRINT_FIELD(CODE_PAGE_SIZE) &&
525 evsel__check_stype(evsel, PERF_SAMPLE_CODE_PAGE_SIZE, "CODE_PAGE_SIZE", PERF_OUTPUT_CODE_PAGE_SIZE))
526 return -EINVAL;
527
528 if (PRINT_FIELD(INS_LAT) &&
529 evsel__check_stype(evsel, PERF_SAMPLE_WEIGHT_STRUCT, "WEIGHT_STRUCT", PERF_OUTPUT_INS_LAT))
530 return -EINVAL;
531
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;

--- 1501 unchanged lines hidden (view full) ---

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
532 return 0;
533}
534
535static void set_print_ip_opts(struct perf_event_attr *attr)
536{
537 unsigned int type = output_type(attr->type);
538
539 output[type].print_ip_opts = 0;

--- 1501 unchanged lines hidden (view full) ---

2041 perf_sample__fprintf_addr(sample, thread, attr, fp);
2042
2043 if (PRINT_FIELD(DATA_SRC))
2044 data_src__fprintf(sample->data_src, fp);
2045
2046 if (PRINT_FIELD(WEIGHT))
2047 fprintf(fp, "%16" PRIu64, sample->weight);
2048
2049 if (PRINT_FIELD(INS_LAT))
2050 fprintf(fp, "%16" PRIu16, sample->ins_lat);
2051
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,

--- 1660 unchanged lines hidden (view full) ---

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,"
2052 if (PRINT_FIELD(IP)) {
2053 struct callchain_cursor *cursor = NULL;
2054
2055 if (script->stitch_lbr)
2056 al->thread->lbr_stitch_enable = true;
2057
2058 if (symbol_conf.use_callchain && sample->callchain &&
2059 thread__resolve_callchain(al->thread, &callchain_cursor, evsel,

--- 1660 unchanged lines hidden (view full) ---

3720 OPT_CALLBACK('F', "fields", NULL, "str",
3721 "comma separated output fields prepend with 'type:'. "
3722 "+field to add and -field to remove."
3723 "Valid types: hw,sw,trace,raw,synth. "
3724 "Fields: comm,tid,pid,time,cpu,event,trace,ip,sym,dso,"
3725 "addr,symoff,srcline,period,iregs,uregs,brstack,"
3726 "brstacksym,flags,bpf-output,brstackinsn,brstackoff,"
3727 "callindent,insn,insnlen,synth,phys_addr,metric,misc,ipc,tod,"
3718 "data_page_size,code_page_size",
3728 "data_page_size,code_page_size,ins_lat",
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,

--- 104 unchanged lines hidden (view full) ---

3831 * Enable guest sample processing.
3832 */
3833 perf_guest = true;
3834 }
3835
3836 data.path = input_name;
3837 data.force = symbol_conf.force;
3838
3729 parse_output_fields),
3730 OPT_BOOLEAN('a', "all-cpus", &system_wide,
3731 "system-wide collection from all CPUs"),
3732 OPT_STRING(0, "dsos", &symbol_conf.dso_list_str, "dso[,dso...]",
3733 "only consider symbols in these DSOs"),
3734 OPT_STRING('S', "symbols", &symbol_conf.sym_list_str, "symbol[,symbol...]",
3735 "only consider these symbols"),
3736 OPT_INTEGER(0, "addr-range", &symbol_conf.addr_range,

--- 104 unchanged lines hidden (view full) ---

3841 * Enable guest sample processing.
3842 */
3843 perf_guest = true;
3844 }
3845
3846 data.path = input_name;
3847 data.force = symbol_conf.force;
3848
3849 if (symbol__validate_sym_arguments())
3850 return -1;
3851
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);

--- 187 unchanged lines hidden (view full) ---

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);
3852 if (argc > 1 && !strncmp(argv[0], "rec", strlen("rec"))) {
3853 rec_script_path = get_script_path(argv[1], RECORD_SUFFIX);
3854 if (!rec_script_path)
3855 return cmd_record(argc, argv);
3856 }
3857
3858 if (argc > 1 && !strncmp(argv[0], "rep", strlen("rep"))) {
3859 rep_script_path = get_script_path(argv[1], REPORT_SUFFIX);

--- 187 unchanged lines hidden (view full) ---

4047 }
4048 if (show_full_info)
4049 script.tool.show_feat_hdr = SHOW_FEAT_HEADER_FULL_INFO;
4050
4051 if (symbol__init(&session->header.env) < 0)
4052 goto out_delete;
4053
4054 uname(&uts);
4042 if (data.is_pipe || /* assume pipe_mode indicates native_arch */
4043 !strcmp(uts.machine, session->header.env.arch) ||
4044 (!strcmp(uts.machine, "x86_64") &&
4045 !strcmp(session->header.env.arch, "i386")))
4055 if (data.is_pipe) { /* Assume pipe_mode indicates native_arch */
4046 native_arch = true;
4056 native_arch = true;
4057 } else if (session->header.env.arch) {
4058 if (!strcmp(uts.machine, session->header.env.arch))
4059 native_arch = true;
4060 else if (!strcmp(uts.machine, "x86_64") &&
4061 !strcmp(session->header.env.arch, "i386"))
4062 native_arch = true;
4063 }
4047
4048 script.session = session;
4049 script__setup_sample_type(&script);
4050
4051 if ((output[PERF_TYPE_HARDWARE].fields & PERF_OUTPUT_CALLINDENT) ||
4052 symbol_conf.graph_function)
4053 itrace_synth_opts.thread_stack = true;
4054

--- 124 unchanged lines hidden ---
4064
4065 script.session = session;
4066 script__setup_sample_type(&script);
4067
4068 if ((output[PERF_TYPE_HARDWARE].fields & PERF_OUTPUT_CALLINDENT) ||
4069 symbol_conf.graph_function)
4070 itrace_synth_opts.thread_stack = true;
4071

--- 124 unchanged lines hidden ---