Messages in this thread | | | Date | Tue, 5 Sep 2017 14:48:30 -0300 | From | Arnaldo Carvalho de Melo <> | Subject | Re: [PATCH 2/2] perf, tools: Support user regs in perf script |
| |
Em Tue, Sep 05, 2017 at 10:00:29AM -0700, Andi Kleen escreveu: > From: Andi Kleen <ak@linux.intel.com> > > Teach perf script to print user regs. > > % perf record --user-regs=ip,sp ... > % perf script -F ip,sym,uregs
Applied the first patch, but this one isn't applying, please check.
Last changes here on builtin-script.c:
[acme@jouet linux]$ git log --oneline -10 tools/perf/builtin-script.c 49d58f04eb6c perf script: Support physical address 2ec5cab604b2 perf script: Remove some bogus error handling e9def1b2e74e perf tools: Add feature header record to pipe-mode 114f709e01e6 perf tool: Add show_feature_header to perf_tool 644e0840ad46 (tag: perf-core-for-mingo-4.13-20170630) perf auxtrace: Add CPU filter support 65c5e18f9df0 perf script: Add synthesized Intel PT power and ptwrite events 47e780848e62 perf script: Add 'synth' field for synthesized event payloads 1405720d4f26 perf script: Add 'synth' event type for synthesized events 701516ae3dec (tag: perf-core-for-mingo-4.13-20170621) perf script: Fix message because field list option is -F not -f 106dacd86f04 perf script: Support -F brstackoff,dso [acme@jouet linux]$
> ffffffff9e060c24 native_write_msr ABI:2 SP:0x7ffd0ea06c38 IP:0x7fe77f55b637 > ffffffff9e060c24 native_write_msr ABI:2 SP:0x7ffd0ea06c38 IP:0x7fe77f55b637 > ffffffff9e060c24 native_write_msr ABI:2 SP:0x7ffd0ea06c38 IP:0x7fe77f55b637 > ffffffff9e060c24 native_write_msr ABI:2 SP:0x7ffd0ea06c38 IP:0x7fe77f55b637 > ffffffff9e00cc12 intel_pmu_handle_irq ABI:2 SP:0x7ffd0ea06c38 IP:0x7fe77f55b637 > > Signed-off-by: Andi Kleen <ak@linux.intel.com> > --- > tools/perf/Documentation/perf-script.txt | 2 +- > tools/perf/builtin-script.c | 30 +++++++++++++++++++++++++++++- > 2 files changed, 30 insertions(+), 2 deletions(-) > > diff --git a/tools/perf/Documentation/perf-script.txt b/tools/perf/Documentation/perf-script.txt > index 5ee8796be96e..d816c62379ee 100644 > --- a/tools/perf/Documentation/perf-script.txt > +++ b/tools/perf/Documentation/perf-script.txt > @@ -116,7 +116,7 @@ OPTIONS > --fields:: > Comma separated list of fields to print. Options are: > comm, tid, pid, time, cpu, event, trace, ip, sym, dso, addr, symoff, > - srcline, period, iregs, brstack, brstacksym, flags, bpf-output, brstackinsn, brstackoff, > + srcline, period, iregs, uregs, brstack, brstacksym, flags, bpf-output, brstackinsn, brstackoff, > callindent, insn, insnlen, synth. > Field list can be prepended with the type, trace, sw or hw, > to indicate to which event type the field list applies. > diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c > index 378f76cdf923..dff7d0566487 100644 > --- a/tools/perf/builtin-script.c > +++ b/tools/perf/builtin-script.c > @@ -87,6 +87,7 @@ enum perf_output_field { > PERF_OUTPUT_BRSTACKINSN = 1U << 23, > PERF_OUTPUT_BRSTACKOFF = 1U << 24, > PERF_OUTPUT_SYNTH = 1U << 25, > + PERF_OUTPUT_UREGS = 1U << 26, > }; > > struct output_option { > @@ -108,6 +109,7 @@ struct output_option { > {.str = "srcline", .field = PERF_OUTPUT_SRCLINE}, > {.str = "period", .field = PERF_OUTPUT_PERIOD}, > {.str = "iregs", .field = PERF_OUTPUT_IREGS}, > + {.str = "uregs", .field = PERF_OUTPUT_UREGS}, > {.str = "brstack", .field = PERF_OUTPUT_BRSTACK}, > {.str = "brstacksym", .field = PERF_OUTPUT_BRSTACKSYM}, > {.str = "data_src", .field = PERF_OUTPUT_DATA_SRC}, > @@ -382,6 +384,11 @@ static int perf_evsel__check_attr(struct perf_evsel *evsel, > PERF_OUTPUT_IREGS)) > return -EINVAL; > > + if (PRINT_FIELD(UREGS) && > + perf_evsel__check_stype(evsel, PERF_SAMPLE_REGS_USER, "UREGS", > + PERF_OUTPUT_UREGS)) > + return -EINVAL; > + > return 0; > } > > @@ -501,6 +508,24 @@ static void print_sample_iregs(struct perf_sample *sample, > } > } > > +static void print_sample_uregs(struct perf_sample *sample, > + struct perf_event_attr *attr) > +{ > + struct regs_dump *regs = &sample->user_regs; > + uint64_t mask = attr->sample_regs_user; > + unsigned i = 0, r; > + > + if (!regs || !regs->regs) > + return; > + > + printf(" ABI:%lu ", regs->abi); > + > + for_each_set_bit(r, (unsigned long *) &mask, sizeof(mask) * 8) { > + u64 val = regs->regs[i++]; > + printf("%5s:0x%"PRIx64" ", perf_reg_name(r), val); > + } > +} > + > static void print_sample_start(struct perf_sample *sample, > struct thread *thread, > struct perf_evsel *evsel) > @@ -1436,6 +1461,9 @@ static void process_event(struct perf_script *script, > if (PRINT_FIELD(IREGS)) > print_sample_iregs(sample, attr); > > + if (PRINT_FIELD(UREGS)) > + print_sample_uregs(sample, attr); > + > if (PRINT_FIELD(BRSTACK)) > print_sample_brstack(sample, thread, attr); > else if (PRINT_FIELD(BRSTACKSYM)) > @@ -2728,7 +2756,7 @@ int cmd_script(int argc, const char **argv) > "+field to add and -field to remove." > "Valid types: hw,sw,trace,raw,synth. " > "Fields: comm,tid,pid,time,cpu,event,trace,ip,sym,dso," > - "addr,symoff,period,iregs,brstack,brstacksym,flags," > + "addr,symoff,period,iregs,uregs,brstack,brstacksym,flags," > "bpf-output,callindent,insn,insnlen,brstackinsn,synth", > parse_output_fields), > OPT_BOOLEAN('a', "all-cpus", &system_wide, > -- > 2.9.5
| |