* [PATCH] perf annotate: Handle arm64 move instructions
@ 2018-08-27 20:08 ` Kim Phillips
0 siblings, 0 replies; 7+ messages in thread
From: Kim Phillips @ 2018-08-27 20:08 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Peter Zijlstra, Ingo Molnar, Alexander Shishkin, Jiri Olsa,
Namhyung Kim, Thomas Gleixner, Greg Kroah-Hartman,
Thomas Richter, Hendrik Brueckner, linux-kernel,
linux-arm-kernel, perf group
Add default handler for non-jump instructions. This really only has an
effect on instructions that compute a PC-relative address, such as 'adrp,'
as seen in these couple of examples:
BEFORE: adrp x0, ffff20000aa11000 <kallsyms_token_index+0xce000>
AFTER: adrp x0, kallsyms_token_index+0xce000
BEFORE: adrp x23, ffff20000ae94000 <__per_cpu_load>
AFTER: adrp x23, __per_cpu_load
The implementation is identical to that of s390, but with a slight
adjustment for objdump whitespace propagation (arm64 objdump puts
spaces after commas, whereas s390's presumably doesn't).
The mov__scnprintf() declaration is moved from s390's to arm64's
instructions.c because arm64's gets included before s390's.
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Thomas Richter <tmricht@linux.vnet.ibm.com>
Cc: Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
Signed-off-by: Kim Phillips <kim.phillips@arm.com>
---
tools/perf/arch/arm64/annotate/instructions.c | 59 ++++++++++++++++++-
tools/perf/arch/s390/annotate/instructions.c | 2 -
2 files changed, 58 insertions(+), 3 deletions(-)
diff --git a/tools/perf/arch/arm64/annotate/instructions.c b/tools/perf/arch/arm64/annotate/instructions.c
index 6688977e4ac7..76c6345a57d5 100644
--- a/tools/perf/arch/arm64/annotate/instructions.c
+++ b/tools/perf/arch/arm64/annotate/instructions.c
@@ -8,6 +8,63 @@ struct arm64_annotate {
jump_insn;
};
+static int arm64_mov__parse(struct arch *arch __maybe_unused,
+ struct ins_operands *ops,
+ struct map_symbol *ms __maybe_unused)
+{
+ char *s = strchr(ops->raw, ','), *target, *endptr;
+
+ if (s == NULL)
+ return -1;
+
+ *s = '\0';
+ ops->source.raw = strdup(ops->raw);
+ *s = ',';
+
+ if (ops->source.raw == NULL)
+ return -1;
+
+ target = ++s;
+ ops->target.raw = strdup(target);
+ if (ops->target.raw == NULL)
+ goto out_free_source;
+
+ ops->target.addr = strtoull(target, &endptr, 16);
+ if (endptr == target)
+ goto out_free_target;
+
+ s = strchr(endptr, '<');
+ if (s == NULL)
+ goto out_free_target;
+ endptr = strchr(s + 1, '>');
+ if (endptr == NULL)
+ goto out_free_target;
+
+ *endptr = '\0';
+ *s = ' ';
+ ops->target.name = strdup(s);
+ *s = '<';
+ *endptr = '>';
+ if (ops->target.name == NULL)
+ goto out_free_target;
+
+ return 0;
+
+out_free_target:
+ zfree(&ops->target.raw);
+out_free_source:
+ zfree(&ops->source.raw);
+ return -1;
+}
+
+static int mov__scnprintf(struct ins *ins, char *bf, size_t size,
+ struct ins_operands *ops);
+
+static struct ins_ops arm64_mov_ops = {
+ .parse = arm64_mov__parse,
+ .scnprintf = mov__scnprintf,
+};
+
static struct ins_ops *arm64__associate_instruction_ops(struct arch *arch, const char *name)
{
struct arm64_annotate *arm = arch->priv;
@@ -21,7 +78,7 @@ static struct ins_ops *arm64__associate_instruction_ops(struct arch *arch, const
else if (!strcmp(name, "ret"))
ops = &ret_ops;
else
- return NULL;
+ ops = &arm64_mov_ops;
arch__associate_ins_ops(arch, name, ops);
return ops;
diff --git a/tools/perf/arch/s390/annotate/instructions.c b/tools/perf/arch/s390/annotate/instructions.c
index cee4e2f7c057..de0dd66dbb48 100644
--- a/tools/perf/arch/s390/annotate/instructions.c
+++ b/tools/perf/arch/s390/annotate/instructions.c
@@ -100,8 +100,6 @@ static int s390_mov__parse(struct arch *arch __maybe_unused,
return -1;
}
-static int mov__scnprintf(struct ins *ins, char *bf, size_t size,
- struct ins_operands *ops);
static struct ins_ops s390_mov_ops = {
.parse = s390_mov__parse,
--
2.17.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH] perf annotate: Handle arm64 move instructions
@ 2018-08-27 20:08 ` Kim Phillips
0 siblings, 0 replies; 7+ messages in thread
From: Kim Phillips @ 2018-08-27 20:08 UTC (permalink / raw)
To: linux-arm-kernel
Add default handler for non-jump instructions. This really only has an
effect on instructions that compute a PC-relative address, such as 'adrp,'
as seen in these couple of examples:
BEFORE: adrp x0, ffff20000aa11000 <kallsyms_token_index+0xce000>
AFTER: adrp x0, kallsyms_token_index+0xce000
BEFORE: adrp x23, ffff20000ae94000 <__per_cpu_load>
AFTER: adrp x23, __per_cpu_load
The implementation is identical to that of s390, but with a slight
adjustment for objdump whitespace propagation (arm64 objdump puts
spaces after commas, whereas s390's presumably doesn't).
The mov__scnprintf() declaration is moved from s390's to arm64's
instructions.c because arm64's gets included before s390's.
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Thomas Richter <tmricht@linux.vnet.ibm.com>
Cc: Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
Signed-off-by: Kim Phillips <kim.phillips@arm.com>
---
tools/perf/arch/arm64/annotate/instructions.c | 59 ++++++++++++++++++-
tools/perf/arch/s390/annotate/instructions.c | 2 -
2 files changed, 58 insertions(+), 3 deletions(-)
diff --git a/tools/perf/arch/arm64/annotate/instructions.c b/tools/perf/arch/arm64/annotate/instructions.c
index 6688977e4ac7..76c6345a57d5 100644
--- a/tools/perf/arch/arm64/annotate/instructions.c
+++ b/tools/perf/arch/arm64/annotate/instructions.c
@@ -8,6 +8,63 @@ struct arm64_annotate {
jump_insn;
};
+static int arm64_mov__parse(struct arch *arch __maybe_unused,
+ struct ins_operands *ops,
+ struct map_symbol *ms __maybe_unused)
+{
+ char *s = strchr(ops->raw, ','), *target, *endptr;
+
+ if (s == NULL)
+ return -1;
+
+ *s = '\0';
+ ops->source.raw = strdup(ops->raw);
+ *s = ',';
+
+ if (ops->source.raw == NULL)
+ return -1;
+
+ target = ++s;
+ ops->target.raw = strdup(target);
+ if (ops->target.raw == NULL)
+ goto out_free_source;
+
+ ops->target.addr = strtoull(target, &endptr, 16);
+ if (endptr == target)
+ goto out_free_target;
+
+ s = strchr(endptr, '<');
+ if (s == NULL)
+ goto out_free_target;
+ endptr = strchr(s + 1, '>');
+ if (endptr == NULL)
+ goto out_free_target;
+
+ *endptr = '\0';
+ *s = ' ';
+ ops->target.name = strdup(s);
+ *s = '<';
+ *endptr = '>';
+ if (ops->target.name == NULL)
+ goto out_free_target;
+
+ return 0;
+
+out_free_target:
+ zfree(&ops->target.raw);
+out_free_source:
+ zfree(&ops->source.raw);
+ return -1;
+}
+
+static int mov__scnprintf(struct ins *ins, char *bf, size_t size,
+ struct ins_operands *ops);
+
+static struct ins_ops arm64_mov_ops = {
+ .parse = arm64_mov__parse,
+ .scnprintf = mov__scnprintf,
+};
+
static struct ins_ops *arm64__associate_instruction_ops(struct arch *arch, const char *name)
{
struct arm64_annotate *arm = arch->priv;
@@ -21,7 +78,7 @@ static struct ins_ops *arm64__associate_instruction_ops(struct arch *arch, const
else if (!strcmp(name, "ret"))
ops = &ret_ops;
else
- return NULL;
+ ops = &arm64_mov_ops;
arch__associate_ins_ops(arch, name, ops);
return ops;
diff --git a/tools/perf/arch/s390/annotate/instructions.c b/tools/perf/arch/s390/annotate/instructions.c
index cee4e2f7c057..de0dd66dbb48 100644
--- a/tools/perf/arch/s390/annotate/instructions.c
+++ b/tools/perf/arch/s390/annotate/instructions.c
@@ -100,8 +100,6 @@ static int s390_mov__parse(struct arch *arch __maybe_unused,
return -1;
}
-static int mov__scnprintf(struct ins *ins, char *bf, size_t size,
- struct ins_operands *ops);
static struct ins_ops s390_mov_ops = {
.parse = s390_mov__parse,
--
2.17.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH] perf annotate: Handle arm64 move instructions
2018-08-27 20:08 ` Kim Phillips
@ 2018-08-28 6:22 ` Thomas-Mich Richter
-1 siblings, 0 replies; 7+ messages in thread
From: Thomas-Mich Richter @ 2018-08-28 6:22 UTC (permalink / raw)
To: Kim Phillips, Arnaldo Carvalho de Melo
Cc: Peter Zijlstra, Ingo Molnar, Alexander Shishkin, Jiri Olsa,
Namhyung Kim, Thomas Gleixner, Greg Kroah-Hartman,
Thomas Richter, Hendrik Brueckner, linux-kernel,
linux-arm-kernel, perf group
On 08/27/2018 10:08 PM, Kim Phillips wrote:
> Add default handler for non-jump instructions. This really only has an
> effect on instructions that compute a PC-relative address, such as 'adrp,'
> as seen in these couple of examples:
>
> BEFORE: adrp x0, ffff20000aa11000 <kallsyms_token_index+0xce000>
> AFTER: adrp x0, kallsyms_token_index+0xce000
>
> BEFORE: adrp x23, ffff20000ae94000 <__per_cpu_load>
> AFTER: adrp x23, __per_cpu_load
>
> The implementation is identical to that of s390, but with a slight
> adjustment for objdump whitespace propagation (arm64 objdump puts
> spaces after commas, whereas s390's presumably doesn't).
>
> The mov__scnprintf() declaration is moved from s390's to arm64's
> instructions.c because arm64's gets included before s390's.
>
Tested-by: Thomas Richter <tmricht@linux.ibm.com>
--
Thomas Richter, Dept 3303, IBM s390 Linux Development, Boeblingen, Germany
--
Vorsitzende des Aufsichtsrats: Martina Koederitz
Geschäftsführung: Dirk Wittkopp
Sitz der Gesellschaft: Böblingen / Registergericht: Amtsgericht Stuttgart, HRB 243294
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH] perf annotate: Handle arm64 move instructions
@ 2018-08-28 6:22 ` Thomas-Mich Richter
0 siblings, 0 replies; 7+ messages in thread
From: Thomas-Mich Richter @ 2018-08-28 6:22 UTC (permalink / raw)
To: linux-arm-kernel
On 08/27/2018 10:08 PM, Kim Phillips wrote:
> Add default handler for non-jump instructions. This really only has an
> effect on instructions that compute a PC-relative address, such as 'adrp,'
> as seen in these couple of examples:
>
> BEFORE: adrp x0, ffff20000aa11000 <kallsyms_token_index+0xce000>
> AFTER: adrp x0, kallsyms_token_index+0xce000
>
> BEFORE: adrp x23, ffff20000ae94000 <__per_cpu_load>
> AFTER: adrp x23, __per_cpu_load
>
> The implementation is identical to that of s390, but with a slight
> adjustment for objdump whitespace propagation (arm64 objdump puts
> spaces after commas, whereas s390's presumably doesn't).
>
> The mov__scnprintf() declaration is moved from s390's to arm64's
> instructions.c because arm64's gets included before s390's.
>
Tested-by: Thomas Richter <tmricht@linux.ibm.com>
--
Thomas Richter, Dept 3303, IBM s390 Linux Development, Boeblingen, Germany
--
Vorsitzende des Aufsichtsrats: Martina Koederitz
Gesch?ftsf?hrung: Dirk Wittkopp
Sitz der Gesellschaft: B?blingen / Registergericht: Amtsgericht Stuttgart, HRB 243294
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] perf annotate: Handle arm64 move instructions
2018-08-28 6:22 ` Thomas-Mich Richter
@ 2018-08-30 18:38 ` Arnaldo Carvalho de Melo
-1 siblings, 0 replies; 7+ messages in thread
From: Arnaldo Carvalho de Melo @ 2018-08-30 18:38 UTC (permalink / raw)
To: Thomas-Mich Richter
Cc: Kim Phillips, Peter Zijlstra, Ingo Molnar, Alexander Shishkin,
Jiri Olsa, Namhyung Kim, Thomas Gleixner, Greg Kroah-Hartman,
Thomas Richter, Hendrik Brueckner, linux-kernel,
linux-arm-kernel, perf group
Em Tue, Aug 28, 2018 at 08:22:40AM +0200, Thomas-Mich Richter escreveu:
> On 08/27/2018 10:08 PM, Kim Phillips wrote:
> > Add default handler for non-jump instructions. This really only has an
> > effect on instructions that compute a PC-relative address, such as 'adrp,'
> > as seen in these couple of examples:
> >
> > BEFORE: adrp x0, ffff20000aa11000 <kallsyms_token_index+0xce000>
> > AFTER: adrp x0, kallsyms_token_index+0xce000
> >
> > BEFORE: adrp x23, ffff20000ae94000 <__per_cpu_load>
> > AFTER: adrp x23, __per_cpu_load
> >
> > The implementation is identical to that of s390, but with a slight
> > adjustment for objdump whitespace propagation (arm64 objdump puts
> > spaces after commas, whereas s390's presumably doesn't).
> >
> > The mov__scnprintf() declaration is moved from s390's to arm64's
> > instructions.c because arm64's gets included before s390's.
> >
>
> Tested-by: Thomas Richter <tmricht@linux.ibm.com>
Thanks, applied.
- Arnaldo
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH] perf annotate: Handle arm64 move instructions
@ 2018-08-30 18:38 ` Arnaldo Carvalho de Melo
0 siblings, 0 replies; 7+ messages in thread
From: Arnaldo Carvalho de Melo @ 2018-08-30 18:38 UTC (permalink / raw)
To: linux-arm-kernel
Em Tue, Aug 28, 2018 at 08:22:40AM +0200, Thomas-Mich Richter escreveu:
> On 08/27/2018 10:08 PM, Kim Phillips wrote:
> > Add default handler for non-jump instructions. This really only has an
> > effect on instructions that compute a PC-relative address, such as 'adrp,'
> > as seen in these couple of examples:
> >
> > BEFORE: adrp x0, ffff20000aa11000 <kallsyms_token_index+0xce000>
> > AFTER: adrp x0, kallsyms_token_index+0xce000
> >
> > BEFORE: adrp x23, ffff20000ae94000 <__per_cpu_load>
> > AFTER: adrp x23, __per_cpu_load
> >
> > The implementation is identical to that of s390, but with a slight
> > adjustment for objdump whitespace propagation (arm64 objdump puts
> > spaces after commas, whereas s390's presumably doesn't).
> >
> > The mov__scnprintf() declaration is moved from s390's to arm64's
> > instructions.c because arm64's gets included before s390's.
> >
>
> Tested-by: Thomas Richter <tmricht@linux.ibm.com>
Thanks, applied.
- Arnaldo
^ permalink raw reply [flat|nested] 7+ messages in thread
* [tip:perf/core] perf annotate: Handle arm64 move instructions
2018-08-27 20:08 ` Kim Phillips
(?)
(?)
@ 2018-09-06 13:45 ` tip-bot for Kim Phillips
-1 siblings, 0 replies; 7+ messages in thread
From: tip-bot for Kim Phillips @ 2018-09-06 13:45 UTC (permalink / raw)
To: linux-tip-commits
Cc: gregkh, kim.phillips, linux-kernel, tmricht, alexander.shishkin,
tglx, jolsa, acme, peterz, hpa, mingo, brueckner, namhyung
Commit-ID: 58094c48f4079cfc784f53a73caaa446db436389
Gitweb: https://git.kernel.org/tip/58094c48f4079cfc784f53a73caaa446db436389
Author: Kim Phillips <kim.phillips@arm.com>
AuthorDate: Mon, 27 Aug 2018 15:08:07 -0500
Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Thu, 30 Aug 2018 15:52:25 -0300
perf annotate: Handle arm64 move instructions
Add default handler for non-jump instructions. This really only has an
effect on instructions that compute a PC-relative address, such as
'adrp,' as seen in these couple of examples:
BEFORE: adrp x0, ffff20000aa11000 <kallsyms_token_index+0xce000>
AFTER: adrp x0, kallsyms_token_index+0xce000
BEFORE: adrp x23, ffff20000ae94000 <__per_cpu_load>
AFTER: adrp x23, __per_cpu_load
The implementation is identical to that of s390, but with a slight
adjustment for objdump whitespace propagation (arm64 objdump puts spaces
after commas, whereas s390's presumably doesn't).
The mov__scnprintf() declaration is moved from s390's to arm64's
instructions.c because arm64's gets included before s390's.
Committer testing:
Ran 'perf annotate --stdio2 > /tmp/{before,after}' no diff.
Signed-off-by: Kim Phillips <kim.phillips@arm.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Tested-by: Thomas Richter <tmricht@linux.vnet.ibm.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: linux-arm-kernel@lists.infradead.org
Link: http://lkml.kernel.org/r/20180827150807.304110d2e9919a17c832ca48@arm.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/arch/arm64/annotate/instructions.c | 59 ++++++++++++++++++++++++++-
tools/perf/arch/s390/annotate/instructions.c | 2 -
2 files changed, 58 insertions(+), 3 deletions(-)
diff --git a/tools/perf/arch/arm64/annotate/instructions.c b/tools/perf/arch/arm64/annotate/instructions.c
index 6688977e4ac7..76c6345a57d5 100644
--- a/tools/perf/arch/arm64/annotate/instructions.c
+++ b/tools/perf/arch/arm64/annotate/instructions.c
@@ -8,6 +8,63 @@ struct arm64_annotate {
jump_insn;
};
+static int arm64_mov__parse(struct arch *arch __maybe_unused,
+ struct ins_operands *ops,
+ struct map_symbol *ms __maybe_unused)
+{
+ char *s = strchr(ops->raw, ','), *target, *endptr;
+
+ if (s == NULL)
+ return -1;
+
+ *s = '\0';
+ ops->source.raw = strdup(ops->raw);
+ *s = ',';
+
+ if (ops->source.raw == NULL)
+ return -1;
+
+ target = ++s;
+ ops->target.raw = strdup(target);
+ if (ops->target.raw == NULL)
+ goto out_free_source;
+
+ ops->target.addr = strtoull(target, &endptr, 16);
+ if (endptr == target)
+ goto out_free_target;
+
+ s = strchr(endptr, '<');
+ if (s == NULL)
+ goto out_free_target;
+ endptr = strchr(s + 1, '>');
+ if (endptr == NULL)
+ goto out_free_target;
+
+ *endptr = '\0';
+ *s = ' ';
+ ops->target.name = strdup(s);
+ *s = '<';
+ *endptr = '>';
+ if (ops->target.name == NULL)
+ goto out_free_target;
+
+ return 0;
+
+out_free_target:
+ zfree(&ops->target.raw);
+out_free_source:
+ zfree(&ops->source.raw);
+ return -1;
+}
+
+static int mov__scnprintf(struct ins *ins, char *bf, size_t size,
+ struct ins_operands *ops);
+
+static struct ins_ops arm64_mov_ops = {
+ .parse = arm64_mov__parse,
+ .scnprintf = mov__scnprintf,
+};
+
static struct ins_ops *arm64__associate_instruction_ops(struct arch *arch, const char *name)
{
struct arm64_annotate *arm = arch->priv;
@@ -21,7 +78,7 @@ static struct ins_ops *arm64__associate_instruction_ops(struct arch *arch, const
else if (!strcmp(name, "ret"))
ops = &ret_ops;
else
- return NULL;
+ ops = &arm64_mov_ops;
arch__associate_ins_ops(arch, name, ops);
return ops;
diff --git a/tools/perf/arch/s390/annotate/instructions.c b/tools/perf/arch/s390/annotate/instructions.c
index cee4e2f7c057..de0dd66dbb48 100644
--- a/tools/perf/arch/s390/annotate/instructions.c
+++ b/tools/perf/arch/s390/annotate/instructions.c
@@ -100,8 +100,6 @@ out_free_source:
return -1;
}
-static int mov__scnprintf(struct ins *ins, char *bf, size_t size,
- struct ins_operands *ops);
static struct ins_ops s390_mov_ops = {
.parse = s390_mov__parse,
^ permalink raw reply related [flat|nested] 7+ messages in thread
end of thread, other threads:[~2018-09-06 13:45 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-08-27 20:08 [PATCH] perf annotate: Handle arm64 move instructions Kim Phillips
2018-08-27 20:08 ` Kim Phillips
2018-08-28 6:22 ` Thomas-Mich Richter
2018-08-28 6:22 ` Thomas-Mich Richter
2018-08-30 18:38 ` Arnaldo Carvalho de Melo
2018-08-30 18:38 ` Arnaldo Carvalho de Melo
2018-09-06 13:45 ` [tip:perf/core] " tip-bot for Kim Phillips
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.