Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1726875 > unrolled thread

[PATCH 2/2] perf, tools: Support user regs in perf script

Started byAndi Kleen <andi@firstfloor.org>
First post2017-09-05 19:10 +0200
Last post2017-09-05 21:00 +0200
Articles 5 — 3 participants

Back to article view | Back to linux.kernel

This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by below is the oldest one visible, not the original post.


Contents

  [PATCH 2/2] perf, tools: Support user regs in perf script Andi Kleen <andi@firstfloor.org> - 2017-09-05 19:10 +0200
    Re: [PATCH 2/2] perf, tools: Support user regs in perf script Arnaldo Carvalho de Melo <acme@kernel.org> - 2017-09-05 19:50 +0200
      Re: [PATCH 2/2] perf, tools: Support user regs in perf script Andi Kleen <ak@linux.intel.com> - 2017-09-05 20:30 +0200
        Re: [PATCH 2/2] perf, tools: Support user regs in perf script Arnaldo Carvalho de Melo <acme@kernel.org> - 2017-09-05 20:50 +0200
          Re: [PATCH 2/2] perf, tools: Support user regs in perf script Arnaldo Carvalho de Melo <acme@kernel.org> - 2017-09-05 21:00 +0200

#1726875 — [PATCH 2/2] perf, tools: Support user regs in perf script

FromAndi Kleen <andi@firstfloor.org>
Date2017-09-05 19:10 +0200
Subject[PATCH 2/2] perf, tools: Support user regs in perf script
Message-ID<umpwl-5Ck-5@gated-at.bofh.it>
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
...
 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

[toc] | [next] | [standalone]


#1726899

FromArnaldo Carvalho de Melo <acme@kernel.org>
Date2017-09-05 19:50 +0200
Message-ID<umq93-5S4-5@gated-at.bofh.it>
In reply to#1726875
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

[toc] | [prev] | [next] | [standalone]


#1726920

FromAndi Kleen <ak@linux.intel.com>
Date2017-09-05 20:30 +0200
Message-ID<umqLL-6oD-11@gated-at.bofh.it>
In reply to#1726899
On Tue, Sep 05, 2017 at 02:48:30PM -0300, Arnaldo Carvalho de Melo wrote:
> 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.

It conflicts with the physical address patches, will rebase
and resend.

Or it's usually just trivial conflicts with the perf script options
if you want to take a stab.

-Andi

[toc] | [prev] | [next] | [standalone]


#1726929

FromArnaldo Carvalho de Melo <acme@kernel.org>
Date2017-09-05 20:50 +0200
Message-ID<umr5b-6ww-47@gated-at.bofh.it>
In reply to#1726920
Em Tue, Sep 05, 2017 at 11:28:20AM -0700, Andi Kleen escreveu:
> On Tue, Sep 05, 2017 at 02:48:30PM -0300, Arnaldo Carvalho de Melo wrote:
> > 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.
> 
> It conflicts with the physical address patches, will rebase
> and resend.
> 
> Or it's usually just trivial conflicts with the perf script options
> if you want to take a stab.

yeah, done.

- Arnaldo

[toc] | [prev] | [next] | [standalone]


#1726933

FromArnaldo Carvalho de Melo <acme@kernel.org>
Date2017-09-05 21:00 +0200
Message-ID<umreO-6C4-25@gated-at.bofh.it>
In reply to#1726929
Em Tue, Sep 05, 2017 at 03:47:35PM -0300, Arnaldo Carvalho de Melo escreveu:
> Em Tue, Sep 05, 2017 at 11:28:20AM -0700, Andi Kleen escreveu:
> > On Tue, Sep 05, 2017 at 02:48:30PM -0300, Arnaldo Carvalho de Melo wrote:
> > > 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.
> > 
> > It conflicts with the physical address patches, will rebase
> > and resend.
> > 
> > Or it's usually just trivial conflicts with the perf script options
> > if you want to take a stab.
> 
> yeah, done.

But you did it in a different order, i.e. in some hunks you put it
before the code handling phys_addr, so I'll use your patch instead,
since you did it anyway.

- Arnaldo

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web