Commit 99417234 authored by Changbin Du's avatar Changbin Du Committed by Namhyung Kim
Browse files

perf: script: add field 'disasm' to display mnemonic instructions



In addition to the 'insn' field, this adds a new field 'disasm' to
display mnemonic instructions instead of the raw code.

$ sudo perf script -F +disasm
       perf-exec 1443864 [006] 2275506.209848:          psb:  psb offs: 0                                      0 [unknown] ([unknown])
       perf-exec 1443864 [006] 2275506.209848:          cbr:  cbr: 41 freq: 4100 MHz (114%)                    0 [unknown] ([unknown])
              ls 1443864 [006] 2275506.209905:          1  branches:uH:      7f216b426100 _start+0x0 (/usr/lib/x86_64-linux-gnu/ld-2.31.so)	movq %rsp, %rdi
              ls 1443864 [006] 2275506.209908:          1  branches:uH:      7f216b426103 _start+0x3 (/usr/lib/x86_64-linux-gnu/ld-2.31.so)	callq _dl_start+0x0

Signed-off-by: default avatarChangbin Du <changbin.du@huawei.com>
Reviewed-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
Cc: changbin.du@gmail.com
Cc: Thomas Richter <tmricht@linux.ibm.com>
Cc: Andi Kleen <ak@linux.intel.com>
Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
Link: https://lore.kernel.org/r/20240217074046.4100789-4-changbin.du@huawei.com
parent 8f0ec15f
Loading
Loading
Loading
Loading
+7 −6
Original line number Diff line number Diff line
@@ -132,9 +132,10 @@ OPTIONS
        Comma separated list of fields to print. Options are:
        comm, tid, pid, time, cpu, event, trace, ip, sym, dso, dsoff, addr, symoff,
        srcline, period, iregs, uregs, brstack, brstacksym, flags, bpf-output,
        brstackinsn, brstackinsnlen, brstackoff, callindent, insn, insnlen, synth,
        phys_addr, metric, misc, srccode, ipc, data_page_size, code_page_size, ins_lat,
        machine_pid, vcpu, cgroup, retire_lat.
        brstackinsn, brstackinsnlen, brstackoff, callindent, insn, disasm,
        insnlen, synth, phys_addr, metric, misc, srccode, ipc, data_page_size,
        code_page_size, ins_lat, machine_pid, vcpu, cgroup, retire_lat.

        Field list can be prepended with the type, trace, sw or hw,
        to indicate to which event type the field list applies.
        e.g., -F sw:comm,tid,time,ip,sym  and -F trace:time,cpu,trace
@@ -217,9 +218,9 @@ OPTIONS
	Instruction Trace decoding. For calls and returns, it will display the
	name of the symbol indented with spaces to reflect the stack depth.

	When doing instruction trace decoding insn and insnlen give the
	instruction bytes and the instruction length of the current
	instruction.
	When doing instruction trace decoding, insn, disasm and insnlen give the
	instruction bytes, disassembled instructions (requires libcapstone support)
	and the instruction length of the current instruction respectively.

	The synth field is used by synthesized events which may be created when
	Instruction Trace decoding.
+14 −1
Original line number Diff line number Diff line
@@ -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 @@ static int parse_output_fields(const struct option *opt __maybe_unused,
			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),