linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 1/3] perf tools: Use offset instead of dwarfnum in register table.
@ 2017-02-03 11:06 He Kuang
  2017-02-03 11:06 ` [PATCH v2 2/3] perf tools: Enable bpf prologue for arm64 He Kuang
                   ` (2 more replies)
  0 siblings, 3 replies; 10+ messages in thread
From: He Kuang @ 2017-02-03 11:06 UTC (permalink / raw)
  To: peterz, will.deacon, mingo, acme, alexander.shishkin, mhiramat,
	jolsa, hekuang
  Cc: wangnan0, bintian.wang, linux-kernel, linux-arm-kernel

This patch changes the 'dwarfnum' to 'offset' in register table, so
the index of array becomes the dwarfnum (the index of each register
defined by DWARF) and the "offset" member means the byte-offset of the
register in (user_)pt_regs. This change makes the code consistent with
x86.

Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: He Kuang <hekuang@huawei.com>
---
 tools/perf/arch/arm64/util/dwarf-regs.c | 107 ++++++++++++++++----------------
 1 file changed, 52 insertions(+), 55 deletions(-)

diff --git a/tools/perf/arch/arm64/util/dwarf-regs.c b/tools/perf/arch/arm64/util/dwarf-regs.c
index d49efeb..090f36b 100644
--- a/tools/perf/arch/arm64/util/dwarf-regs.c
+++ b/tools/perf/arch/arm64/util/dwarf-regs.c
@@ -9,72 +9,69 @@
  */
 
 #include <stddef.h>
+#include <linux/ptrace.h> /* for struct user_pt_regs */
 #include <dwarf-regs.h>
 
-struct pt_regs_dwarfnum {
+struct pt_regs_offset {
 	const char *name;
-	unsigned int dwarfnum;
+	int offset;
 };
 
-#define STR(s) #s
-#define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num}
-#define GPR_DWARFNUM_NAME(num) \
-	{.name = STR(%x##num), .dwarfnum = num}
-#define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}
-
 /*
  * Reference:
  * http://infocenter.arm.com/help/topic/com.arm.doc.ihi0057b/IHI0057B_aadwarf64.pdf
  */
-static const struct pt_regs_dwarfnum regdwarfnum_table[] = {
-	GPR_DWARFNUM_NAME(0),
-	GPR_DWARFNUM_NAME(1),
-	GPR_DWARFNUM_NAME(2),
-	GPR_DWARFNUM_NAME(3),
-	GPR_DWARFNUM_NAME(4),
-	GPR_DWARFNUM_NAME(5),
-	GPR_DWARFNUM_NAME(6),
-	GPR_DWARFNUM_NAME(7),
-	GPR_DWARFNUM_NAME(8),
-	GPR_DWARFNUM_NAME(9),
-	GPR_DWARFNUM_NAME(10),
-	GPR_DWARFNUM_NAME(11),
-	GPR_DWARFNUM_NAME(12),
-	GPR_DWARFNUM_NAME(13),
-	GPR_DWARFNUM_NAME(14),
-	GPR_DWARFNUM_NAME(15),
-	GPR_DWARFNUM_NAME(16),
-	GPR_DWARFNUM_NAME(17),
-	GPR_DWARFNUM_NAME(18),
-	GPR_DWARFNUM_NAME(19),
-	GPR_DWARFNUM_NAME(20),
-	GPR_DWARFNUM_NAME(21),
-	GPR_DWARFNUM_NAME(22),
-	GPR_DWARFNUM_NAME(23),
-	GPR_DWARFNUM_NAME(24),
-	GPR_DWARFNUM_NAME(25),
-	GPR_DWARFNUM_NAME(26),
-	GPR_DWARFNUM_NAME(27),
-	GPR_DWARFNUM_NAME(28),
-	GPR_DWARFNUM_NAME(29),
-	REG_DWARFNUM_NAME("%lr", 30),
-	REG_DWARFNUM_NAME("%sp", 31),
-	REG_DWARFNUM_END,
-};
+#define REG_OFFSET_NAME(r, num) {.name = "%" #r,			\
+			.offset = offsetof(struct user_pt_regs, regs[num])}
+#define REG_OFFSET_END {.name = NULL, .offset = 0}
+#define GPR_OFFSET_NAME(r) \
+	{.name = "%x" #r, .offset = offsetof(struct user_pt_regs, regs[r])}
 
-/**
- * get_arch_regstr() - lookup register name from it's DWARF register number
- * @n:	the DWARF register number
- *
- * get_arch_regstr() returns the name of the register in struct
- * regdwarfnum_table from it's DWARF register number. If the register is not
- * found in the table, this returns NULL;
+/* This table is for reverse searching for the offset or register
+ * names in aarch64_regstr_tbl[].
  */
+static const struct pt_regs_offset regoffset_table[] = {
+	GPR_OFFSET_NAME(0),
+	GPR_OFFSET_NAME(1),
+	GPR_OFFSET_NAME(2),
+	GPR_OFFSET_NAME(3),
+	GPR_OFFSET_NAME(4),
+	GPR_OFFSET_NAME(5),
+	GPR_OFFSET_NAME(6),
+	GPR_OFFSET_NAME(7),
+	GPR_OFFSET_NAME(8),
+	GPR_OFFSET_NAME(9),
+	GPR_OFFSET_NAME(10),
+	GPR_OFFSET_NAME(11),
+	GPR_OFFSET_NAME(12),
+	GPR_OFFSET_NAME(13),
+	GPR_OFFSET_NAME(14),
+	GPR_OFFSET_NAME(15),
+	GPR_OFFSET_NAME(16),
+	GPR_OFFSET_NAME(17),
+	GPR_OFFSET_NAME(18),
+	GPR_OFFSET_NAME(19),
+	GPR_OFFSET_NAME(20),
+	GPR_OFFSET_NAME(21),
+	GPR_OFFSET_NAME(22),
+	GPR_OFFSET_NAME(23),
+	GPR_OFFSET_NAME(24),
+	GPR_OFFSET_NAME(25),
+	GPR_OFFSET_NAME(26),
+	GPR_OFFSET_NAME(27),
+	GPR_OFFSET_NAME(28),
+	GPR_OFFSET_NAME(29),
+	REG_OFFSET_NAME(lr, 30),
+	REG_OFFSET_NAME(sp, 31),
+	REG_OFFSET_END,
+};
+
+/* Minus 1 for the ending REG_OFFSET_END */
+#define ARCH_MAX_REGS ((sizeof(regoffset_table) /		\
+			sizeof(regoffset_table[0])) - 1)
+
+/* Return architecture dependent register string (for kprobe-tracer) */
 const char *get_arch_regstr(unsigned int n)
 {
-	const struct pt_regs_dwarfnum *roff;
-	for (roff = regdwarfnum_table; roff->name != NULL; roff++)
-		if (roff->dwarfnum == n)
-			return roff->name;
-	return NULL;
+	return (n < ARCH_MAX_REGS) ? regoffset_table[n].name : NULL;
 }
-- 
1.8.5.2

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v2 2/3] perf tools: Enable bpf prologue for arm64
  2017-02-03 11:06 [PATCH v2 1/3] perf tools: Use offset instead of dwarfnum in register table He Kuang
@ 2017-02-03 11:06 ` He Kuang
  2017-02-03 11:06 ` [PATCH v2 3/3] perf tools: Add missing newline in debug messages He Kuang
  2017-02-03 13:00 ` [PATCH v2 1/3] perf tools: Use offset instead of dwarfnum in register table Will Deacon
  2 siblings, 0 replies; 10+ messages in thread
From: He Kuang @ 2017-02-03 11:06 UTC (permalink / raw)
  To: peterz, will.deacon, mingo, acme, alexander.shishkin, mhiramat,
	jolsa, hekuang
  Cc: wangnan0, bintian.wang, linux-kernel, linux-arm-kernel

Since HAVE_KPROBES can be enabled in arm64, this patch introduces
regs_query_register_offset() to convert register name to offset for
arm64, so the BPF prologue feature is ready to use.

Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: He Kuang <hekuang@huawei.com>
---
 tools/perf/arch/arm64/Makefile          |  1 +
 tools/perf/arch/arm64/util/dwarf-regs.c | 20 ++++++++++++++++++++
 2 files changed, 21 insertions(+)

diff --git a/tools/perf/arch/arm64/Makefile b/tools/perf/arch/arm64/Makefile
index 18b1351..eebe1ec 100644
--- a/tools/perf/arch/arm64/Makefile
+++ b/tools/perf/arch/arm64/Makefile
@@ -2,3 +2,4 @@ ifndef NO_DWARF
 PERF_HAVE_DWARF_REGS := 1
 endif
 PERF_HAVE_JITDUMP := 1
+PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET := 1
diff --git a/tools/perf/arch/arm64/util/dwarf-regs.c b/tools/perf/arch/arm64/util/dwarf-regs.c
index 090f36b..6d17a31 100644
--- a/tools/perf/arch/arm64/util/dwarf-regs.c
+++ b/tools/perf/arch/arm64/util/dwarf-regs.c
@@ -9,6 +9,8 @@
  */
 
 #include <stddef.h>
+#include <errno.h> /* for EINVAL */
+#include <string.h> /* for strcmp */
 #include <linux/ptrace.h> /* for struct user_pt_regs */
 #include <dwarf-regs.h>
 
@@ -75,3 +77,21 @@ const char *get_arch_regstr(unsigned int n)
 {
 	return (n < ARCH_MAX_REGS) ? regoffset_table[n].name : NULL;
 }
+
+/* Reuse code from arch/arm64/kernel/ptrace.c */
+/**
+ * regs_query_register_offset() - query register offset from its name
+ * @name:	the name of a register
+ *
+ * regs_query_register_offset() returns the offset of a register in struct
+ * user_pt_regs from its name. If the name is invalid, this returns -EINVAL;
+ */
+int regs_query_register_offset(const char *name)
+{
+	const struct pt_regs_offset *roff;
+
+	for (roff = regoffset_table; roff->name != NULL; roff++)
+		if (!strcmp(roff->name, name))
+			return roff->offset;
+	return -EINVAL;
+}
-- 
1.8.5.2

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v2 3/3] perf tools: Add missing newline in debug messages
  2017-02-03 11:06 [PATCH v2 1/3] perf tools: Use offset instead of dwarfnum in register table He Kuang
  2017-02-03 11:06 ` [PATCH v2 2/3] perf tools: Enable bpf prologue for arm64 He Kuang
@ 2017-02-03 11:06 ` He Kuang
  2017-02-03 13:00 ` [PATCH v2 1/3] perf tools: Use offset instead of dwarfnum in register table Will Deacon
  2 siblings, 0 replies; 10+ messages in thread
From: He Kuang @ 2017-02-03 11:06 UTC (permalink / raw)
  To: peterz, will.deacon, mingo, acme, alexander.shishkin, mhiramat,
	jolsa, hekuang
  Cc: wangnan0, bintian.wang, linux-kernel, linux-arm-kernel

These two debug messages are missing the trailing newline.

Signed-off-by: He Kuang <hekuang@huawei.com>
---
 tools/perf/util/bpf-loader.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tools/perf/util/bpf-loader.c b/tools/perf/util/bpf-loader.c
index 36c8611..bc6bc70 100644
--- a/tools/perf/util/bpf-loader.c
+++ b/tools/perf/util/bpf-loader.c
@@ -670,13 +670,13 @@ int bpf__probe(struct bpf_object *obj)
 
 		err = convert_perf_probe_events(pev, 1);
 		if (err < 0) {
-			pr_debug("bpf_probe: failed to convert perf probe events");
+			pr_debug("bpf_probe: failed to convert perf probe events\n");
 			goto out;
 		}
 
 		err = apply_perf_probe_events(pev, 1);
 		if (err < 0) {
-			pr_debug("bpf_probe: failed to apply perf probe events");
+			pr_debug("bpf_probe: failed to apply perf probe events\n");
 			goto out;
 		}
 
-- 
1.8.5.2

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH v2 1/3] perf tools: Use offset instead of dwarfnum in register table.
  2017-02-03 11:06 [PATCH v2 1/3] perf tools: Use offset instead of dwarfnum in register table He Kuang
  2017-02-03 11:06 ` [PATCH v2 2/3] perf tools: Enable bpf prologue for arm64 He Kuang
  2017-02-03 11:06 ` [PATCH v2 3/3] perf tools: Add missing newline in debug messages He Kuang
@ 2017-02-03 13:00 ` Will Deacon
  2017-02-04  9:03   ` [PATCH v3] perf tools arm64: Add support for generating bpf prologue He Kuang
  2017-02-04  9:03   ` [PATCH v2 1/3] perf tools: Use offset instead of dwarfnum in register table Hekuang
  2 siblings, 2 replies; 10+ messages in thread
From: Will Deacon @ 2017-02-03 13:00 UTC (permalink / raw)
  To: He Kuang
  Cc: peterz, mingo, acme, alexander.shishkin, mhiramat, jolsa,
	wangnan0, bintian.wang, linux-kernel, linux-arm-kernel

On Fri, Feb 03, 2017 at 11:06:05AM +0000, He Kuang wrote:
> This patch changes the 'dwarfnum' to 'offset' in register table, so
> the index of array becomes the dwarfnum (the index of each register
> defined by DWARF) and the "offset" member means the byte-offset of the
> register in (user_)pt_regs. This change makes the code consistent with
> x86.
> 
> Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
> Signed-off-by: He Kuang <hekuang@huawei.com>
> ---
>  tools/perf/arch/arm64/util/dwarf-regs.c | 107 ++++++++++++++++----------------
>  1 file changed, 52 insertions(+), 55 deletions(-)

Thanks for splitting this up. Comment below.

> diff --git a/tools/perf/arch/arm64/util/dwarf-regs.c b/tools/perf/arch/arm64/util/dwarf-regs.c
> index d49efeb..090f36b 100644
> --- a/tools/perf/arch/arm64/util/dwarf-regs.c
> +++ b/tools/perf/arch/arm64/util/dwarf-regs.c
> @@ -9,72 +9,69 @@
>   */
>  
>  #include <stddef.h>
> +#include <linux/ptrace.h> /* for struct user_pt_regs */
>  #include <dwarf-regs.h>
>  
> -struct pt_regs_dwarfnum {
> +struct pt_regs_offset {
>  	const char *name;
> -	unsigned int dwarfnum;
> +	int offset;
>  };
>  
> -#define STR(s) #s
> -#define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num}
> -#define GPR_DWARFNUM_NAME(num) \
> -	{.name = STR(%x##num), .dwarfnum = num}
> -#define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}
> -
>  /*
>   * Reference:
>   * http://infocenter.arm.com/help/topic/com.arm.doc.ihi0057b/IHI0057B_aadwarf64.pdf
>   */
> -static const struct pt_regs_dwarfnum regdwarfnum_table[] = {
> -	GPR_DWARFNUM_NAME(0),
> -	GPR_DWARFNUM_NAME(1),
> -	GPR_DWARFNUM_NAME(2),
> -	GPR_DWARFNUM_NAME(3),
> -	GPR_DWARFNUM_NAME(4),
> -	GPR_DWARFNUM_NAME(5),
> -	GPR_DWARFNUM_NAME(6),
> -	GPR_DWARFNUM_NAME(7),
> -	GPR_DWARFNUM_NAME(8),
> -	GPR_DWARFNUM_NAME(9),
> -	GPR_DWARFNUM_NAME(10),
> -	GPR_DWARFNUM_NAME(11),
> -	GPR_DWARFNUM_NAME(12),
> -	GPR_DWARFNUM_NAME(13),
> -	GPR_DWARFNUM_NAME(14),
> -	GPR_DWARFNUM_NAME(15),
> -	GPR_DWARFNUM_NAME(16),
> -	GPR_DWARFNUM_NAME(17),
> -	GPR_DWARFNUM_NAME(18),
> -	GPR_DWARFNUM_NAME(19),
> -	GPR_DWARFNUM_NAME(20),
> -	GPR_DWARFNUM_NAME(21),
> -	GPR_DWARFNUM_NAME(22),
> -	GPR_DWARFNUM_NAME(23),
> -	GPR_DWARFNUM_NAME(24),
> -	GPR_DWARFNUM_NAME(25),
> -	GPR_DWARFNUM_NAME(26),
> -	GPR_DWARFNUM_NAME(27),
> -	GPR_DWARFNUM_NAME(28),
> -	GPR_DWARFNUM_NAME(29),
> -	REG_DWARFNUM_NAME("%lr", 30),
> -	REG_DWARFNUM_NAME("%sp", 31),
> -	REG_DWARFNUM_END,
> -};
> +#define REG_OFFSET_NAME(r, num) {.name = "%" #r,			\
> +			.offset = offsetof(struct user_pt_regs, regs[num])}

Whilst this works in practice, this is undefined behaviour for "sp", since
you'll go off the end of the regs array.

I still think you're better off sticking with the dwarfnum, then just having
a dwarfnum2offset macro that multiplies by the size of a register.

Will

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v3] perf tools arm64: Add support for generating bpf prologue
  2017-02-03 13:00 ` [PATCH v2 1/3] perf tools: Use offset instead of dwarfnum in register table Will Deacon
@ 2017-02-04  9:03   ` He Kuang
  2017-02-04  9:03   ` [PATCH v2 1/3] perf tools: Use offset instead of dwarfnum in register table Hekuang
  1 sibling, 0 replies; 10+ messages in thread
From: He Kuang @ 2017-02-04  9:03 UTC (permalink / raw)
  To: peterz, will.deacon, mingo, acme, alexander.shishkin, mhiramat,
	jolsa, hekuang
  Cc: wangnan0, bintian.wang, linux-kernel, linux-arm-kernel

Since HAVE_KPROBES can be enabled in arm64, this patch introduces
regs_query_register_offset() to convert register name to offset for
arm64, so the BPF prologue feature is ready to use.

Signed-off-by: He Kuang <hekuang@huawei.com>
---
 tools/perf/arch/arm64/Makefile          |  1 +
 tools/perf/arch/arm64/util/dwarf-regs.c | 30 +++++++++++++++++++++++-------
 2 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/tools/perf/arch/arm64/Makefile b/tools/perf/arch/arm64/Makefile
index 18b1351..eebe1ec 100644
--- a/tools/perf/arch/arm64/Makefile
+++ b/tools/perf/arch/arm64/Makefile
@@ -2,3 +2,4 @@ ifndef NO_DWARF
 PERF_HAVE_DWARF_REGS := 1
 endif
 PERF_HAVE_JITDUMP := 1
+PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET := 1
diff --git a/tools/perf/arch/arm64/util/dwarf-regs.c b/tools/perf/arch/arm64/util/dwarf-regs.c
index d49efeb..f2b49bf 100644
--- a/tools/perf/arch/arm64/util/dwarf-regs.c
+++ b/tools/perf/arch/arm64/util/dwarf-regs.c
@@ -10,17 +10,22 @@
 
 #include <stddef.h>
 #include <dwarf-regs.h>
+#include <linux/ptrace.h> /* for struct user_pt_regs */
+#include "util.h"
 
 struct pt_regs_dwarfnum {
 	const char *name;
 	unsigned int dwarfnum;
+	unsigned int ptregs_offset;
 };
 
-#define STR(s) #s
-#define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num}
-#define GPR_DWARFNUM_NAME(num) \
-	{.name = STR(%x##num), .dwarfnum = num}
-#define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}
+#define REG_DWARFNUM_NAME(r, num)					\
+		{.name = STR(%)STR(r), .dwarfnum = num,			\
+		.ptregs_offset = offsetof(struct user_pt_regs, r)}
+#define GPR_DWARFNUM_NAME(num)						\
+		{.name = STR(%x##num), .dwarfnum = num,		\
+		.ptregs_offset = offsetof(struct user_pt_regs, regs[num])}
+#define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0, .ptregs_offset = 0}
 
 /*
  * Reference:
@@ -57,8 +62,9 @@ struct pt_regs_dwarfnum {
 	GPR_DWARFNUM_NAME(27),
 	GPR_DWARFNUM_NAME(28),
 	GPR_DWARFNUM_NAME(29),
-	REG_DWARFNUM_NAME("%lr", 30),
-	REG_DWARFNUM_NAME("%sp", 31),
+	{.name = "%lr", .dwarfnum = 30,
+	 .ptregs_offset = offsetof(struct user_pt_regs, regs[30])},
+	REG_DWARFNUM_NAME(sp, 31),
 	REG_DWARFNUM_END,
 };
 
@@ -78,3 +84,13 @@ const char *get_arch_regstr(unsigned int n)
 			return roff->name;
 	return NULL;
 }
+
+int regs_query_register_offset(const char *name)
+{
+	const struct pt_regs_dwarfnum *roff;
+
+	for (roff = regdwarfnum_table; roff->name != NULL; roff++)
+		if (!strcmp(roff->name, name))
+			return roff->ptregs_offset;
+	return -EINVAL;
+}
-- 
1.8.5.2

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH v2 1/3] perf tools: Use offset instead of dwarfnum in register table.
  2017-02-03 13:00 ` [PATCH v2 1/3] perf tools: Use offset instead of dwarfnum in register table Will Deacon
  2017-02-04  9:03   ` [PATCH v3] perf tools arm64: Add support for generating bpf prologue He Kuang
@ 2017-02-04  9:03   ` Hekuang
  2017-02-06 13:02     ` Will Deacon
  1 sibling, 1 reply; 10+ messages in thread
From: Hekuang @ 2017-02-04  9:03 UTC (permalink / raw)
  To: Will Deacon
  Cc: peterz, mingo, acme, alexander.shishkin, mhiramat, jolsa,
	wangnan0, bintian.wang, linux-kernel, linux-arm-kernel

hi

在 2017/2/3 21:00, Will Deacon 写道:
> On Fri, Feb 03, 2017 at 11:06:05AM +0000, He Kuang wrote:
>> This patch changes the 'dwarfnum' to 'offset' in register table, so
>> the index of array becomes the dwarfnum (the index of each register
>> defined by DWARF) and the "offset" member means the byte-offset of the
>> register in (user_)pt_regs. This change makes the code consistent with
>> x86.
>>
>> Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
>> Signed-off-by: He Kuang <hekuang@huawei.com>
>> ---
>>   tools/perf/arch/arm64/util/dwarf-regs.c | 107 ++++++++++++++++----------------
>>   1 file changed, 52 insertions(+), 55 deletions(-)
> Thanks for splitting this up. Comment below.
>
>> diff --git a/tools/perf/arch/arm64/util/dwarf-regs.c b/tools/perf/arch/arm64/util/dwarf-regs.c
>> index d49efeb..090f36b 100644
>> --- a/tools/perf/arch/arm64/util/dwarf-regs.c
>> +++ b/tools/perf/arch/arm64/util/dwarf-regs.c
>> @@ -9,72 +9,69 @@
>>    */
>>   
>>   #include <stddef.h>
>> +#include <linux/ptrace.h> /* for struct user_pt_regs */
>>   #include <dwarf-regs.h>
>>   
>> -struct pt_regs_dwarfnum {
>> +struct pt_regs_offset {
>>   	const char *name;
>> -	unsigned int dwarfnum;
>> +	int offset;
>>   };
>>   
>> -#define STR(s) #s
>> -#define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num}
>> -#define GPR_DWARFNUM_NAME(num) \
>> -	{.name = STR(%x##num), .dwarfnum = num}
>> -#define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}
>> -
>>   /*
>>    * Reference:
>>    * http://infocenter.arm.com/help/topic/com.arm.doc.ihi0057b/IHI0057B_aadwarf64.pdf
>>    */
>> -static const struct pt_regs_dwarfnum regdwarfnum_table[] = {
>> -	GPR_DWARFNUM_NAME(0),
>> -	GPR_DWARFNUM_NAME(1),
>> -	GPR_DWARFNUM_NAME(2),
>> -	GPR_DWARFNUM_NAME(3),
>> -	GPR_DWARFNUM_NAME(4),
>> -	GPR_DWARFNUM_NAME(5),
>> -	GPR_DWARFNUM_NAME(6),
>> -	GPR_DWARFNUM_NAME(7),
>> -	GPR_DWARFNUM_NAME(8),
>> -	GPR_DWARFNUM_NAME(9),
>> -	GPR_DWARFNUM_NAME(10),
>> -	GPR_DWARFNUM_NAME(11),
>> -	GPR_DWARFNUM_NAME(12),
>> -	GPR_DWARFNUM_NAME(13),
>> -	GPR_DWARFNUM_NAME(14),
>> -	GPR_DWARFNUM_NAME(15),
>> -	GPR_DWARFNUM_NAME(16),
>> -	GPR_DWARFNUM_NAME(17),
>> -	GPR_DWARFNUM_NAME(18),
>> -	GPR_DWARFNUM_NAME(19),
>> -	GPR_DWARFNUM_NAME(20),
>> -	GPR_DWARFNUM_NAME(21),
>> -	GPR_DWARFNUM_NAME(22),
>> -	GPR_DWARFNUM_NAME(23),
>> -	GPR_DWARFNUM_NAME(24),
>> -	GPR_DWARFNUM_NAME(25),
>> -	GPR_DWARFNUM_NAME(26),
>> -	GPR_DWARFNUM_NAME(27),
>> -	GPR_DWARFNUM_NAME(28),
>> -	GPR_DWARFNUM_NAME(29),
>> -	REG_DWARFNUM_NAME("%lr", 30),
>> -	REG_DWARFNUM_NAME("%sp", 31),
>> -	REG_DWARFNUM_END,
>> -};
>> +#define REG_OFFSET_NAME(r, num) {.name = "%" #r,			\
>> +			.offset = offsetof(struct user_pt_regs, regs[num])}
> Whilst this works in practice, this is undefined behaviour for "sp", since
> you'll go off the end of the regs array.

It's not undefined behaviour here,
struct user_pt_regs {
         __u64           regs[31];
         __u64           sp;
         __u64           pc;
         __u64           pstate;
};
user_pt_regs->regs[31] is user_pt_regs->sp and the offset value is correct.
>
> I still think you're better off sticking with the dwarfnum, then just having
> a dwarfnum2offset macro that multiplies by the size of a register.
>
> Will
I think add a ptregs_offset field is more suitable and makes the code 
indepent
to struct user_pt_regs layout, for example if the structure changed to this:

struct user_pt_regs {
         __u64           sp;
         __u64           pc;
         __u64           pstate;
         __u64           regs[31];
};

The multiply result will be incorrect.
Patch updated and the change is similar to commit "4679bccaa308"
  (perf tools powerpc: Add support for generating bpf prologue)

Please review, thanks.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2 1/3] perf tools: Use offset instead of dwarfnum in register table.
  2017-02-04  9:03   ` [PATCH v2 1/3] perf tools: Use offset instead of dwarfnum in register table Hekuang
@ 2017-02-06 13:02     ` Will Deacon
  2017-02-07  0:54       ` Masami Hiramatsu
  0 siblings, 1 reply; 10+ messages in thread
From: Will Deacon @ 2017-02-06 13:02 UTC (permalink / raw)
  To: Hekuang
  Cc: peterz, mingo, acme, alexander.shishkin, mhiramat, jolsa,
	wangnan0, bintian.wang, linux-kernel, linux-arm-kernel

On Sat, Feb 04, 2017 at 05:03:20PM +0800, Hekuang wrote:
> hi
> 
> 在 2017/2/3 21:00, Will Deacon 写道:
> >On Fri, Feb 03, 2017 at 11:06:05AM +0000, He Kuang wrote:
> >>This patch changes the 'dwarfnum' to 'offset' in register table, so
> >>the index of array becomes the dwarfnum (the index of each register
> >>defined by DWARF) and the "offset" member means the byte-offset of the
> >>register in (user_)pt_regs. This change makes the code consistent with
> >>x86.
> >>
> >>Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
> >>Signed-off-by: He Kuang <hekuang@huawei.com>
> >>---
> >>  tools/perf/arch/arm64/util/dwarf-regs.c | 107 ++++++++++++++++----------------
> >>  1 file changed, 52 insertions(+), 55 deletions(-)
> >Thanks for splitting this up. Comment below.
> >
> >>diff --git a/tools/perf/arch/arm64/util/dwarf-regs.c b/tools/perf/arch/arm64/util/dwarf-regs.c
> >>index d49efeb..090f36b 100644
> >>--- a/tools/perf/arch/arm64/util/dwarf-regs.c
> >>+++ b/tools/perf/arch/arm64/util/dwarf-regs.c
> >>@@ -9,72 +9,69 @@
> >>   */
> >>  #include <stddef.h>
> >>+#include <linux/ptrace.h> /* for struct user_pt_regs */
> >>  #include <dwarf-regs.h>
> >>-struct pt_regs_dwarfnum {
> >>+struct pt_regs_offset {
> >>  	const char *name;
> >>-	unsigned int dwarfnum;
> >>+	int offset;
> >>  };
> >>-#define STR(s) #s
> >>-#define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num}
> >>-#define GPR_DWARFNUM_NAME(num) \
> >>-	{.name = STR(%x##num), .dwarfnum = num}
> >>-#define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}
> >>-
> >>  /*
> >>   * Reference:
> >>   * http://infocenter.arm.com/help/topic/com.arm.doc.ihi0057b/IHI0057B_aadwarf64.pdf
> >>   */
> >>-static const struct pt_regs_dwarfnum regdwarfnum_table[] = {
> >>-	GPR_DWARFNUM_NAME(0),
> >>-	GPR_DWARFNUM_NAME(1),
> >>-	GPR_DWARFNUM_NAME(2),
> >>-	GPR_DWARFNUM_NAME(3),
> >>-	GPR_DWARFNUM_NAME(4),
> >>-	GPR_DWARFNUM_NAME(5),
> >>-	GPR_DWARFNUM_NAME(6),
> >>-	GPR_DWARFNUM_NAME(7),
> >>-	GPR_DWARFNUM_NAME(8),
> >>-	GPR_DWARFNUM_NAME(9),
> >>-	GPR_DWARFNUM_NAME(10),
> >>-	GPR_DWARFNUM_NAME(11),
> >>-	GPR_DWARFNUM_NAME(12),
> >>-	GPR_DWARFNUM_NAME(13),
> >>-	GPR_DWARFNUM_NAME(14),
> >>-	GPR_DWARFNUM_NAME(15),
> >>-	GPR_DWARFNUM_NAME(16),
> >>-	GPR_DWARFNUM_NAME(17),
> >>-	GPR_DWARFNUM_NAME(18),
> >>-	GPR_DWARFNUM_NAME(19),
> >>-	GPR_DWARFNUM_NAME(20),
> >>-	GPR_DWARFNUM_NAME(21),
> >>-	GPR_DWARFNUM_NAME(22),
> >>-	GPR_DWARFNUM_NAME(23),
> >>-	GPR_DWARFNUM_NAME(24),
> >>-	GPR_DWARFNUM_NAME(25),
> >>-	GPR_DWARFNUM_NAME(26),
> >>-	GPR_DWARFNUM_NAME(27),
> >>-	GPR_DWARFNUM_NAME(28),
> >>-	GPR_DWARFNUM_NAME(29),
> >>-	REG_DWARFNUM_NAME("%lr", 30),
> >>-	REG_DWARFNUM_NAME("%sp", 31),
> >>-	REG_DWARFNUM_END,
> >>-};
> >>+#define REG_OFFSET_NAME(r, num) {.name = "%" #r,			\
> >>+			.offset = offsetof(struct user_pt_regs, regs[num])}
> >Whilst this works in practice, this is undefined behaviour for "sp", since
> >you'll go off the end of the regs array.
> 
> It's not undefined behaviour here,
> struct user_pt_regs {
>         __u64           regs[31];
>         __u64           sp;
>         __u64           pc;
>         __u64           pstate;
> };
> user_pt_regs->regs[31] is user_pt_regs->sp and the offset value is correct.

I think it's undefined from the C standard perspective.

> >
> >I still think you're better off sticking with the dwarfnum, then just having
> >a dwarfnum2offset macro that multiplies by the size of a register.
> >
> >Will
> I think add a ptregs_offset field is more suitable and makes the code
> indepent
> to struct user_pt_regs layout, for example if the structure changed to this:
> 
> struct user_pt_regs {
>         __u64           sp;
>         __u64           pc;
>         __u64           pstate;
>         __u64           regs[31];
> };

We won't reorder a uapi structure because that would binary compatibility.

Just send a patch using the dwarfnum as the index for the offset calculation,
like I've been saying since you posted the first version.

Will

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2 1/3] perf tools: Use offset instead of dwarfnum in register table.
  2017-02-06 13:02     ` Will Deacon
@ 2017-02-07  0:54       ` Masami Hiramatsu
  2017-02-07  9:20         ` Will Deacon
  0 siblings, 1 reply; 10+ messages in thread
From: Masami Hiramatsu @ 2017-02-07  0:54 UTC (permalink / raw)
  To: Will Deacon
  Cc: Hekuang, peterz, mingo, acme, alexander.shishkin, mhiramat,
	jolsa, wangnan0, bintian.wang, linux-kernel, linux-arm-kernel

On Mon, 6 Feb 2017 13:02:29 +0000
Will Deacon <will.deacon@arm.com> wrote:

> On Sat, Feb 04, 2017 at 05:03:20PM +0800, Hekuang wrote:
> > hi
> > 
> > 在 2017/2/3 21:00, Will Deacon 写道:
> > >On Fri, Feb 03, 2017 at 11:06:05AM +0000, He Kuang wrote:
> > >>This patch changes the 'dwarfnum' to 'offset' in register table, so
> > >>the index of array becomes the dwarfnum (the index of each register
> > >>defined by DWARF) and the "offset" member means the byte-offset of the
> > >>register in (user_)pt_regs. This change makes the code consistent with
> > >>x86.
> > >>
> > >>Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
> > >>Signed-off-by: He Kuang <hekuang@huawei.com>
> > >>---
> > >>  tools/perf/arch/arm64/util/dwarf-regs.c | 107 ++++++++++++++++----------------
> > >>  1 file changed, 52 insertions(+), 55 deletions(-)
> > >Thanks for splitting this up. Comment below.
> > >
> > >>diff --git a/tools/perf/arch/arm64/util/dwarf-regs.c b/tools/perf/arch/arm64/util/dwarf-regs.c
> > >>index d49efeb..090f36b 100644
> > >>--- a/tools/perf/arch/arm64/util/dwarf-regs.c
> > >>+++ b/tools/perf/arch/arm64/util/dwarf-regs.c
> > >>@@ -9,72 +9,69 @@
> > >>   */
> > >>  #include <stddef.h>
> > >>+#include <linux/ptrace.h> /* for struct user_pt_regs */
> > >>  #include <dwarf-regs.h>
> > >>-struct pt_regs_dwarfnum {
> > >>+struct pt_regs_offset {
> > >>  	const char *name;
> > >>-	unsigned int dwarfnum;
> > >>+	int offset;
> > >>  };
> > >>-#define STR(s) #s
> > >>-#define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num}
> > >>-#define GPR_DWARFNUM_NAME(num) \
> > >>-	{.name = STR(%x##num), .dwarfnum = num}
> > >>-#define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}
> > >>-
> > >>  /*
> > >>   * Reference:
> > >>   * http://infocenter.arm.com/help/topic/com.arm.doc.ihi0057b/IHI0057B_aadwarf64.pdf
> > >>   */
> > >>-static const struct pt_regs_dwarfnum regdwarfnum_table[] = {
> > >>-	GPR_DWARFNUM_NAME(0),
> > >>-	GPR_DWARFNUM_NAME(1),
> > >>-	GPR_DWARFNUM_NAME(2),
> > >>-	GPR_DWARFNUM_NAME(3),
> > >>-	GPR_DWARFNUM_NAME(4),
> > >>-	GPR_DWARFNUM_NAME(5),
> > >>-	GPR_DWARFNUM_NAME(6),
> > >>-	GPR_DWARFNUM_NAME(7),
> > >>-	GPR_DWARFNUM_NAME(8),
> > >>-	GPR_DWARFNUM_NAME(9),
> > >>-	GPR_DWARFNUM_NAME(10),
> > >>-	GPR_DWARFNUM_NAME(11),
> > >>-	GPR_DWARFNUM_NAME(12),
> > >>-	GPR_DWARFNUM_NAME(13),
> > >>-	GPR_DWARFNUM_NAME(14),
> > >>-	GPR_DWARFNUM_NAME(15),
> > >>-	GPR_DWARFNUM_NAME(16),
> > >>-	GPR_DWARFNUM_NAME(17),
> > >>-	GPR_DWARFNUM_NAME(18),
> > >>-	GPR_DWARFNUM_NAME(19),
> > >>-	GPR_DWARFNUM_NAME(20),
> > >>-	GPR_DWARFNUM_NAME(21),
> > >>-	GPR_DWARFNUM_NAME(22),
> > >>-	GPR_DWARFNUM_NAME(23),
> > >>-	GPR_DWARFNUM_NAME(24),
> > >>-	GPR_DWARFNUM_NAME(25),
> > >>-	GPR_DWARFNUM_NAME(26),
> > >>-	GPR_DWARFNUM_NAME(27),
> > >>-	GPR_DWARFNUM_NAME(28),
> > >>-	GPR_DWARFNUM_NAME(29),
> > >>-	REG_DWARFNUM_NAME("%lr", 30),
> > >>-	REG_DWARFNUM_NAME("%sp", 31),
> > >>-	REG_DWARFNUM_END,
> > >>-};
> > >>+#define REG_OFFSET_NAME(r, num) {.name = "%" #r,			\
> > >>+			.offset = offsetof(struct user_pt_regs, regs[num])}
> > >Whilst this works in practice, this is undefined behaviour for "sp", since
> > >you'll go off the end of the regs array.
> > 
> > It's not undefined behaviour here,
> > struct user_pt_regs {
> >         __u64           regs[31];
> >         __u64           sp;
> >         __u64           pc;
> >         __u64           pstate;
> > };
> > user_pt_regs->regs[31] is user_pt_regs->sp and the offset value is correct.
> 
> I think it's undefined from the C standard perspective.

Actually, this '%sp' is used for kprobes/uprobes dynamic events, which only 
depend on how regs_query_register_offset()@arch/arm64/kernel/ptrace.c is implemented.
And also, since perf-probe uses debuginfo, it can find out the base register.

So we don't need to care the C standard in this file :)

Thank you,

-- 
Masami Hiramatsu <mhiramat@kernel.org>

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2 1/3] perf tools: Use offset instead of dwarfnum in register table.
  2017-02-07  0:54       ` Masami Hiramatsu
@ 2017-02-07  9:20         ` Will Deacon
  2017-02-07 12:17           ` Masami Hiramatsu
  0 siblings, 1 reply; 10+ messages in thread
From: Will Deacon @ 2017-02-07  9:20 UTC (permalink / raw)
  To: Masami Hiramatsu
  Cc: Hekuang, peterz, mingo, acme, alexander.shishkin, jolsa,
	wangnan0, bintian.wang, linux-kernel, linux-arm-kernel

On Tue, Feb 07, 2017 at 09:54:51AM +0900, Masami Hiramatsu wrote:
> On Mon, 6 Feb 2017 13:02:29 +0000
> Will Deacon <will.deacon@arm.com> wrote:
> 
> > On Sat, Feb 04, 2017 at 05:03:20PM +0800, Hekuang wrote:
> > > hi
> > > 
> > > 在 2017/2/3 21:00, Will Deacon 写道:
> > > >On Fri, Feb 03, 2017 at 11:06:05AM +0000, He Kuang wrote:
> > > >>This patch changes the 'dwarfnum' to 'offset' in register table, so
> > > >>the index of array becomes the dwarfnum (the index of each register
> > > >>defined by DWARF) and the "offset" member means the byte-offset of the
> > > >>register in (user_)pt_regs. This change makes the code consistent with
> > > >>x86.
> > > >>
> > > >>Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
> > > >>Signed-off-by: He Kuang <hekuang@huawei.com>
> > > >>---
> > > >>  tools/perf/arch/arm64/util/dwarf-regs.c | 107 ++++++++++++++++----------------
> > > >>  1 file changed, 52 insertions(+), 55 deletions(-)
> > > >Thanks for splitting this up. Comment below.
> > > >
> > > >>diff --git a/tools/perf/arch/arm64/util/dwarf-regs.c b/tools/perf/arch/arm64/util/dwarf-regs.c
> > > >>index d49efeb..090f36b 100644
> > > >>--- a/tools/perf/arch/arm64/util/dwarf-regs.c
> > > >>+++ b/tools/perf/arch/arm64/util/dwarf-regs.c
> > > >>@@ -9,72 +9,69 @@
> > > >>   */
> > > >>  #include <stddef.h>
> > > >>+#include <linux/ptrace.h> /* for struct user_pt_regs */
> > > >>  #include <dwarf-regs.h>
> > > >>-struct pt_regs_dwarfnum {
> > > >>+struct pt_regs_offset {
> > > >>  	const char *name;
> > > >>-	unsigned int dwarfnum;
> > > >>+	int offset;
> > > >>  };
> > > >>-#define STR(s) #s
> > > >>-#define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num}
> > > >>-#define GPR_DWARFNUM_NAME(num) \
> > > >>-	{.name = STR(%x##num), .dwarfnum = num}
> > > >>-#define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}
> > > >>-
> > > >>  /*
> > > >>   * Reference:
> > > >>   * http://infocenter.arm.com/help/topic/com.arm.doc.ihi0057b/IHI0057B_aadwarf64.pdf
> > > >>   */
> > > >>-static const struct pt_regs_dwarfnum regdwarfnum_table[] = {
> > > >>-	GPR_DWARFNUM_NAME(0),
> > > >>-	GPR_DWARFNUM_NAME(1),
> > > >>-	GPR_DWARFNUM_NAME(2),
> > > >>-	GPR_DWARFNUM_NAME(3),
> > > >>-	GPR_DWARFNUM_NAME(4),
> > > >>-	GPR_DWARFNUM_NAME(5),
> > > >>-	GPR_DWARFNUM_NAME(6),
> > > >>-	GPR_DWARFNUM_NAME(7),
> > > >>-	GPR_DWARFNUM_NAME(8),
> > > >>-	GPR_DWARFNUM_NAME(9),
> > > >>-	GPR_DWARFNUM_NAME(10),
> > > >>-	GPR_DWARFNUM_NAME(11),
> > > >>-	GPR_DWARFNUM_NAME(12),
> > > >>-	GPR_DWARFNUM_NAME(13),
> > > >>-	GPR_DWARFNUM_NAME(14),
> > > >>-	GPR_DWARFNUM_NAME(15),
> > > >>-	GPR_DWARFNUM_NAME(16),
> > > >>-	GPR_DWARFNUM_NAME(17),
> > > >>-	GPR_DWARFNUM_NAME(18),
> > > >>-	GPR_DWARFNUM_NAME(19),
> > > >>-	GPR_DWARFNUM_NAME(20),
> > > >>-	GPR_DWARFNUM_NAME(21),
> > > >>-	GPR_DWARFNUM_NAME(22),
> > > >>-	GPR_DWARFNUM_NAME(23),
> > > >>-	GPR_DWARFNUM_NAME(24),
> > > >>-	GPR_DWARFNUM_NAME(25),
> > > >>-	GPR_DWARFNUM_NAME(26),
> > > >>-	GPR_DWARFNUM_NAME(27),
> > > >>-	GPR_DWARFNUM_NAME(28),
> > > >>-	GPR_DWARFNUM_NAME(29),
> > > >>-	REG_DWARFNUM_NAME("%lr", 30),
> > > >>-	REG_DWARFNUM_NAME("%sp", 31),
> > > >>-	REG_DWARFNUM_END,
> > > >>-};
> > > >>+#define REG_OFFSET_NAME(r, num) {.name = "%" #r,			\
> > > >>+			.offset = offsetof(struct user_pt_regs, regs[num])}
> > > >Whilst this works in practice, this is undefined behaviour for "sp", since
> > > >you'll go off the end of the regs array.
> > > 
> > > It's not undefined behaviour here,
> > > struct user_pt_regs {
> > >         __u64           regs[31];
> > >         __u64           sp;
> > >         __u64           pc;
> > >         __u64           pstate;
> > > };
> > > user_pt_regs->regs[31] is user_pt_regs->sp and the offset value is correct.
> > 
> > I think it's undefined from the C standard perspective.
> 
> Actually, this '%sp' is used for kprobes/uprobes dynamic events, which only 
> depend on how regs_query_register_offset()@arch/arm64/kernel/ptrace.c is implemented.
> And also, since perf-probe uses debuginfo, it can find out the base register.
> 
> So we don't need to care the C standard in this file :)

Up to the perf tool maintainers really, but I expect it will irritate
anybody running UBSAN and it's really not difficult to fix.

Will

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2 1/3] perf tools: Use offset instead of dwarfnum in register table.
  2017-02-07  9:20         ` Will Deacon
@ 2017-02-07 12:17           ` Masami Hiramatsu
  0 siblings, 0 replies; 10+ messages in thread
From: Masami Hiramatsu @ 2017-02-07 12:17 UTC (permalink / raw)
  To: Will Deacon
  Cc: Hekuang, peterz, mingo, acme, alexander.shishkin, jolsa,
	wangnan0, bintian.wang, linux-kernel, linux-arm-kernel

On Tue, 7 Feb 2017 09:20:03 +0000
Will Deacon <will.deacon@arm.com> wrote:

> On Tue, Feb 07, 2017 at 09:54:51AM +0900, Masami Hiramatsu wrote:
> > On Mon, 6 Feb 2017 13:02:29 +0000
> > Will Deacon <will.deacon@arm.com> wrote:
> > 
> > > On Sat, Feb 04, 2017 at 05:03:20PM +0800, Hekuang wrote:
> > > > hi
> > > > 
> > > > 在 2017/2/3 21:00, Will Deacon 写道:
> > > > >On Fri, Feb 03, 2017 at 11:06:05AM +0000, He Kuang wrote:
> > > > >>This patch changes the 'dwarfnum' to 'offset' in register table, so
> > > > >>the index of array becomes the dwarfnum (the index of each register
> > > > >>defined by DWARF) and the "offset" member means the byte-offset of the
> > > > >>register in (user_)pt_regs. This change makes the code consistent with
> > > > >>x86.
> > > > >>
> > > > >>Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
> > > > >>Signed-off-by: He Kuang <hekuang@huawei.com>
> > > > >>---
> > > > >>  tools/perf/arch/arm64/util/dwarf-regs.c | 107 ++++++++++++++++----------------
> > > > >>  1 file changed, 52 insertions(+), 55 deletions(-)
> > > > >Thanks for splitting this up. Comment below.
> > > > >
> > > > >>diff --git a/tools/perf/arch/arm64/util/dwarf-regs.c b/tools/perf/arch/arm64/util/dwarf-regs.c
> > > > >>index d49efeb..090f36b 100644
> > > > >>--- a/tools/perf/arch/arm64/util/dwarf-regs.c
> > > > >>+++ b/tools/perf/arch/arm64/util/dwarf-regs.c
> > > > >>@@ -9,72 +9,69 @@
> > > > >>   */
> > > > >>  #include <stddef.h>
> > > > >>+#include <linux/ptrace.h> /* for struct user_pt_regs */
> > > > >>  #include <dwarf-regs.h>
> > > > >>-struct pt_regs_dwarfnum {
> > > > >>+struct pt_regs_offset {
> > > > >>  	const char *name;
> > > > >>-	unsigned int dwarfnum;
> > > > >>+	int offset;
> > > > >>  };
> > > > >>-#define STR(s) #s
> > > > >>-#define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num}
> > > > >>-#define GPR_DWARFNUM_NAME(num) \
> > > > >>-	{.name = STR(%x##num), .dwarfnum = num}
> > > > >>-#define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}
> > > > >>-
> > > > >>  /*
> > > > >>   * Reference:
> > > > >>   * http://infocenter.arm.com/help/topic/com.arm.doc.ihi0057b/IHI0057B_aadwarf64.pdf
> > > > >>   */
> > > > >>-static const struct pt_regs_dwarfnum regdwarfnum_table[] = {
> > > > >>-	GPR_DWARFNUM_NAME(0),
> > > > >>-	GPR_DWARFNUM_NAME(1),
> > > > >>-	GPR_DWARFNUM_NAME(2),
> > > > >>-	GPR_DWARFNUM_NAME(3),
> > > > >>-	GPR_DWARFNUM_NAME(4),
> > > > >>-	GPR_DWARFNUM_NAME(5),
> > > > >>-	GPR_DWARFNUM_NAME(6),
> > > > >>-	GPR_DWARFNUM_NAME(7),
> > > > >>-	GPR_DWARFNUM_NAME(8),
> > > > >>-	GPR_DWARFNUM_NAME(9),
> > > > >>-	GPR_DWARFNUM_NAME(10),
> > > > >>-	GPR_DWARFNUM_NAME(11),
> > > > >>-	GPR_DWARFNUM_NAME(12),
> > > > >>-	GPR_DWARFNUM_NAME(13),
> > > > >>-	GPR_DWARFNUM_NAME(14),
> > > > >>-	GPR_DWARFNUM_NAME(15),
> > > > >>-	GPR_DWARFNUM_NAME(16),
> > > > >>-	GPR_DWARFNUM_NAME(17),
> > > > >>-	GPR_DWARFNUM_NAME(18),
> > > > >>-	GPR_DWARFNUM_NAME(19),
> > > > >>-	GPR_DWARFNUM_NAME(20),
> > > > >>-	GPR_DWARFNUM_NAME(21),
> > > > >>-	GPR_DWARFNUM_NAME(22),
> > > > >>-	GPR_DWARFNUM_NAME(23),
> > > > >>-	GPR_DWARFNUM_NAME(24),
> > > > >>-	GPR_DWARFNUM_NAME(25),
> > > > >>-	GPR_DWARFNUM_NAME(26),
> > > > >>-	GPR_DWARFNUM_NAME(27),
> > > > >>-	GPR_DWARFNUM_NAME(28),
> > > > >>-	GPR_DWARFNUM_NAME(29),
> > > > >>-	REG_DWARFNUM_NAME("%lr", 30),
> > > > >>-	REG_DWARFNUM_NAME("%sp", 31),
> > > > >>-	REG_DWARFNUM_END,
> > > > >>-};
> > > > >>+#define REG_OFFSET_NAME(r, num) {.name = "%" #r,			\
> > > > >>+			.offset = offsetof(struct user_pt_regs, regs[num])}
> > > > >Whilst this works in practice, this is undefined behaviour for "sp", since
> > > > >you'll go off the end of the regs array.
> > > > 
> > > > It's not undefined behaviour here,
> > > > struct user_pt_regs {
> > > >         __u64           regs[31];
> > > >         __u64           sp;
> > > >         __u64           pc;
> > > >         __u64           pstate;
> > > > };
> > > > user_pt_regs->regs[31] is user_pt_regs->sp and the offset value is correct.
> > > 
> > > I think it's undefined from the C standard perspective.
> > 
> > Actually, this '%sp' is used for kprobes/uprobes dynamic events, which only 
> > depend on how regs_query_register_offset()@arch/arm64/kernel/ptrace.c is implemented.
> > And also, since perf-probe uses debuginfo, it can find out the base register.
> > 
> > So we don't need to care the C standard in this file :)
> 
> Up to the perf tool maintainers really, but I expect it will irritate
> anybody running UBSAN and it's really not difficult to fix.

Hmm, sorry, I'm not sure, what the point UBSAN user be irriteted?
And what is that related to this story?

Thank you,

-- 
Masami Hiramatsu <mhiramat@kernel.org>

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2017-02-07 12:17 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-02-03 11:06 [PATCH v2 1/3] perf tools: Use offset instead of dwarfnum in register table He Kuang
2017-02-03 11:06 ` [PATCH v2 2/3] perf tools: Enable bpf prologue for arm64 He Kuang
2017-02-03 11:06 ` [PATCH v2 3/3] perf tools: Add missing newline in debug messages He Kuang
2017-02-03 13:00 ` [PATCH v2 1/3] perf tools: Use offset instead of dwarfnum in register table Will Deacon
2017-02-04  9:03   ` [PATCH v3] perf tools arm64: Add support for generating bpf prologue He Kuang
2017-02-04  9:03   ` [PATCH v2 1/3] perf tools: Use offset instead of dwarfnum in register table Hekuang
2017-02-06 13:02     ` Will Deacon
2017-02-07  0:54       ` Masami Hiramatsu
2017-02-07  9:20         ` Will Deacon
2017-02-07 12:17           ` Masami Hiramatsu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).