]> git.ipfire.org Git - thirdparty/kernel/stable.git/blobdiff - tools/perf/builtin-script.c
perf: script: add field 'disasm' to display mnemonic instructions
[thirdparty/kernel/stable.git] / tools / perf / builtin-script.c
index 0a57c518640c37bae394d80023eb112ee5603523..ba4cfe040bd657a9e2cfd2d93fe81a62d8905d03 100644 (file)
@@ -135,6 +135,7 @@ enum perf_output_field {
        PERF_OUTPUT_CGROUP          = 1ULL << 39,
        PERF_OUTPUT_RETIRE_LAT      = 1ULL << 40,
        PERF_OUTPUT_DSOFF           = 1ULL << 41,
+       PERF_OUTPUT_DISASM          = 1ULL << 42,
 };
 
 struct perf_script {
@@ -190,6 +191,7 @@ struct output_option {
        {.str = "bpf-output",   .field = PERF_OUTPUT_BPF_OUTPUT},
        {.str = "callindent", .field = PERF_OUTPUT_CALLINDENT},
        {.str = "insn", .field = PERF_OUTPUT_INSN},
+       {.str = "disasm", .field = PERF_OUTPUT_DISASM},
        {.str = "insnlen", .field = PERF_OUTPUT_INSNLEN},
        {.str = "brstackinsn", .field = PERF_OUTPUT_BRSTACKINSN},
        {.str = "brstackoff", .field = PERF_OUTPUT_BRSTACKOFF},
@@ -1527,6 +1529,10 @@ static int perf_sample__fprintf_insn(struct perf_sample *sample,
                printed += fprintf(fp, " insn: ");
                printed += sample__fprintf_insn_raw(sample, fp);
        }
+       if (PRINT_FIELD(DISASM) && sample->insn_len) {
+               printed += fprintf(fp, "\t\t");
+               printed += sample__fprintf_insn_asm(sample, thread, machine, fp);
+       }
        if (PRINT_FIELD(BRSTACKINSN) || PRINT_FIELD(BRSTACKINSNLEN))
                printed += perf_sample__fprintf_brstackinsn(sample, thread, attr, machine, fp);
 
@@ -3118,6 +3124,13 @@ parse:
                        rc = -EINVAL;
                        goto out;
                }
+#ifndef HAVE_LIBCAPSTONE_SUPPORT
+               if (change != REMOVE && strcmp(tok, "disasm") == 0) {
+                       fprintf(stderr, "Field \"disasm\" requires perf to be built with libcapstone support.\n");
+                       rc = -EINVAL;
+                       goto out;
+               }
+#endif
 
                if (type == -1) {
                        /* add user option to all events types for
@@ -3912,7 +3925,7 @@ int cmd_script(int argc, const char **argv)
                     "Fields: comm,tid,pid,time,cpu,event,trace,ip,sym,dso,dsoff,"
                     "addr,symoff,srcline,period,iregs,uregs,brstack,"
                     "brstacksym,flags,data_src,weight,bpf-output,brstackinsn,"
-                    "brstackinsnlen,brstackoff,callindent,insn,insnlen,synth,"
+                    "brstackinsnlen,brstackoff,callindent,insn,disasm,insnlen,synth,"
                     "phys_addr,metric,misc,srccode,ipc,tod,data_page_size,"
                     "code_page_size,ins_lat,machine_pid,vcpu,cgroup,retire_lat",
                     parse_output_fields),