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


Groups > linux.kernel > #1215708 > unrolled thread

[PATCH 22/31] perf tools: Add BPF_PROLOGUE config options for further patches

Started byWang Nan <wangnan0@huawei.com>
First post2015-08-29 06:30 +0200
Last post2015-09-02 16:20 +0200
Articles 12 — 6 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 22/31] perf tools: Add BPF_PROLOGUE config options for further patches Wang Nan <wangnan0@huawei.com> - 2015-08-29 06:30 +0200
    Re: [PATCH 22/31] perf tools: Add BPF_PROLOGUE config options for  further patches Arnaldo Carvalho de Melo <acme@redhat.com> - 2015-08-31 22:40 +0200
    [PATCH 22/31] perf tools: Add BPF_PROLOGUE config options for further patches Wang Nan <wangnan0@huawei.com> - 2015-09-01 09:10 +0200
      [PATCH 23/31] perf tools: Introduce regs_query_register_offset() for x86 Wang Nan <wangnan0@huawei.com> - 2015-09-01 09:10 +0200
        RE: [PATCH 23/31] perf tools: Introduce  regs_query_register_offset() for x86 平松雅巳 / HIRAMATU,MASAMI   <masami.hiramatsu.pt@hitachi.com> - 2015-09-01 13:50 +0200
          Re: [PATCH 23/31] perf tools: Introduce regs_query_register_offset()  for x86 "Wangnan (F)" <wangnan0@huawei.com> - 2015-09-01 16:00 +0200
            Re: [PATCH 23/31] perf tools: Introduce regs_query_register_offset()  for x86 Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-09-01 17:00 +0200
          Re: [PATCH 23/31] perf tools: Introduce regs_query_register_offset()  for x86 Arnaldo Carvalho de Melo <acme@redhat.com> - 2015-09-01 16:20 +0200
            RE: [PATCH 23/31] perf tools: Introduce  regs_query_register_offset() for x86 平松雅巳 / HIRAMATU,MASAMI   <masami.hiramatsu.pt@hitachi.com> - 2015-09-01 18:00 +0200
              Re: [PATCH 23/31] perf tools: Introduce regs_query_register_offset()  for x86 "Wangnan (F)" <wangnan0@huawei.com> - 2015-09-06 08:10 +0200
                [PATCH] perf test: Enforce LLVM test, add kbuild test Wang Nan <wangnan0@huawei.com> - 2015-09-06 08:10 +0200
      Re: [PATCH 22/31] perf tools: Add BPF_PROLOGUE config options for  further patches Namhyung Kim <namhyung@kernel.org> - 2015-09-02 16:20 +0200

#1215708 — [PATCH 22/31] perf tools: Add BPF_PROLOGUE config options for further patches

FromWang Nan <wangnan0@huawei.com>
Date2015-08-29 06:30 +0200
Subject[PATCH 22/31] perf tools: Add BPF_PROLOGUE config options for further patches
Message-ID<q2FWc-7Rj-59@gated-at.bofh.it>
If both LIBBPF and DWARF are detected, it is possible to create prologue
for eBPF programs to help them accessing kernel data. HAVE_BPF_PROLOGUE
and CONFIG_BPF_PROLOGUE is added as flags for this feature.

PERF_HAVE_ARCH_GET_REG_OFFSET indicates an architecture supports
converting name of a register to its offset in 'struct pt_regs'.
Without this support, BPF_PROLOGUE should be turned off.

Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: Alexei Starovoitov <ast@plumgrid.com>
Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: David Ahern <dsahern@gmail.com>
Cc: He Kuang <hekuang@huawei.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kaixu Xia <xiakaixu@huawei.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Link: http://lkml.kernel.org/n/1436445342-1402-33-git-send-email-wangnan0@huawei.com
---
 tools/perf/config/Makefile           | 12 ++++++++++++
 tools/perf/util/include/dwarf-regs.h |  7 +++++++
 2 files changed, 19 insertions(+)

diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile
index 38a4144..d46765b7 100644
--- a/tools/perf/config/Makefile
+++ b/tools/perf/config/Makefile
@@ -314,6 +314,18 @@ ifndef NO_LIBELF
       CFLAGS += -DHAVE_LIBBPF_SUPPORT
       $(call detected,CONFIG_LIBBPF)
     endif
+
+    ifndef NO_DWARF
+      ifneq ($(origin PERF_HAVE_ARCH_GET_REG_INFO), undefined)
+        CFLAGS += -DHAVE_BPF_PROLOGUE
+        $(call detected,CONFIG_BPF_PROLOGUE)
+      else
+        msg := $(warning BPF prologue is not supported by architecture $(ARCH));
+      endif
+    else
+      msg := $(warning DWARF support is off, BPF prologue is disabled);
+    endif
+
   endif # NO_LIBBPF
 endif # NO_LIBELF
 
diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include/dwarf-regs.h
index 8f14965..3dda083 100644
--- a/tools/perf/util/include/dwarf-regs.h
+++ b/tools/perf/util/include/dwarf-regs.h
@@ -5,4 +5,11 @@
 const char *get_arch_regstr(unsigned int n);
 #endif
 
+#ifdef HAVE_BPF_PROLOGUE
+/*
+ * Arch should support fetching the offset of a register in pt_regs
+ * by its name.
+ */
+int arch_get_reg_info(const char *name, int *offset);
+#endif
 #endif
-- 
2.1.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [next] | [standalone]


#1216432 — Re: [PATCH 22/31] perf tools: Add BPF_PROLOGUE config options for further patches

FromArnaldo Carvalho de Melo <acme@redhat.com>
Date2015-08-31 22:40 +0200
SubjectRe: [PATCH 22/31] perf tools: Add BPF_PROLOGUE config options for further patches
Message-ID<q3E1Z-1L9-21@gated-at.bofh.it>
In reply to#1215708
Em Sat, Aug 29, 2015 at 04:21:56AM +0000, Wang Nan escreveu:
> If both LIBBPF and DWARF are detected, it is possible to create prologue
> for eBPF programs to help them accessing kernel data. HAVE_BPF_PROLOGUE
> and CONFIG_BPF_PROLOGUE is added as flags for this feature.
> 
> PERF_HAVE_ARCH_GET_REG_OFFSET indicates an architecture supports
> converting name of a register to its offset in 'struct pt_regs'.
> Without this support, BPF_PROLOGUE should be turned off.
> 
> Signed-off-by: Wang Nan <wangnan0@huawei.com>
> Cc: Alexei Starovoitov <ast@plumgrid.com>
> Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
> Cc: Daniel Borkmann <daniel@iogearbox.net>
> Cc: David Ahern <dsahern@gmail.com>
> Cc: He Kuang <hekuang@huawei.com>
> Cc: Jiri Olsa <jolsa@kernel.org>
> Cc: Kaixu Xia <xiakaixu@huawei.com>
> Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
> Cc: Namhyung Kim <namhyung@kernel.org>
> Cc: Paul Mackerras <paulus@samba.org>
> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
> Cc: Zefan Li <lizefan@huawei.com>
> Cc: pi3orama@163.com
> Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
> Link: http://lkml.kernel.org/n/1436445342-1402-33-git-send-email-wangnan0@huawei.com
> ---
>  tools/perf/config/Makefile           | 12 ++++++++++++
>  tools/perf/util/include/dwarf-regs.h |  7 +++++++
>  2 files changed, 19 insertions(+)
> 
> diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile
> index 38a4144..d46765b7 100644
> --- a/tools/perf/config/Makefile
> +++ b/tools/perf/config/Makefile
> @@ -314,6 +314,18 @@ ifndef NO_LIBELF
>        CFLAGS += -DHAVE_LIBBPF_SUPPORT
>        $(call detected,CONFIG_LIBBPF)
>      endif
> +
> +    ifndef NO_DWARF
> +      ifneq ($(origin PERF_HAVE_ARCH_GET_REG_INFO), undefined)
> +        CFLAGS += -DHAVE_BPF_PROLOGUE
> +        $(call detected,CONFIG_BPF_PROLOGUE)
> +      else
> +        msg := $(warning BPF prologue is not supported by architecture $(ARCH));

Shouldn't this be replace to something like:

        msg := $(warning BPF prologue is not supported by architecture $(ARCH), missing ARCH_GET_REG_INFO);

Or even in lowercase?

> +      endif
> +    else
> +      msg := $(warning DWARF support is off, BPF prologue is disabled);
> +    endif
> +
>    endif # NO_LIBBPF
>  endif # NO_LIBELF
>  
> diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include/dwarf-regs.h
> index 8f14965..3dda083 100644
> --- a/tools/perf/util/include/dwarf-regs.h
> +++ b/tools/perf/util/include/dwarf-regs.h
> @@ -5,4 +5,11 @@
>  const char *get_arch_regstr(unsigned int n);
>  #endif

Shouldn't this test against PERF_HAVE_ARCH_GET_REG_INFO instead? I.e.
is arch_get_reg_info() only allowed to work with eBPF? I guess not,
right?
  
> +#ifdef HAVE_BPF_PROLOGUE
> +/*
> + * Arch should support fetching the offset of a register in pt_regs
> + * by its name.
> + */
> +int arch_get_reg_info(const char *name, int *offset);
> +#endif
>  #endif
> -- 
> 2.1.0
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

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


#1216634

FromWang Nan <wangnan0@huawei.com>
Date2015-09-01 09:10 +0200
Message-ID<q3NRE-7PA-17@gated-at.bofh.it>
In reply to#1215708
If both LIBBPF and DWARF are detected, it is possible to create prologue
for eBPF programs to help them accessing kernel data. HAVE_BPF_PROLOGUE
and CONFIG_BPF_PROLOGUE is added as flags for this feature.

PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET indicates an architecture
supports converting name of a register to its offset in
'struct pt_regs'. Without this support, BPF_PROLOGUE should be turned off.

HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET is introduced as the corresponding
CFLAGS of PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET.

Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: Alexei Starovoitov <ast@plumgrid.com>
Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: David Ahern <dsahern@gmail.com>
Cc: He Kuang <hekuang@huawei.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kaixu Xia <xiakaixu@huawei.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Link: http://lkml.kernel.org/n/1436445342-1402-33-git-send-email-wangnan0@huawei.com
[wawngnan:
 - Introduce new CFLAGS to control BPF prologue and arch_get_reg_info()
   separately.
 - Rename ARCH_GET_REG_INFO to ARCH_REGS_QUERY_REGISTER_OFFSET,
   arch_get_reg_info() to regs_query_register_offset(), change its API accordingly
   to make it similar to kernel's regs_query_register_offset().
]
---
 tools/perf/config/Makefile           | 17 +++++++++++++++++
 tools/perf/util/include/dwarf-regs.h |  8 ++++++++
 2 files changed, 25 insertions(+)

diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile
index 38a4144..33785a1 100644
--- a/tools/perf/config/Makefile
+++ b/tools/perf/config/Makefile
@@ -110,6 +110,11 @@ FEATURE_CHECK_CFLAGS-bpf = -I. -I$(srctree)/tools/include -I$(srctree)/arch/$(AR
 # include ARCH specific config
 -include $(src-perf)/arch/$(ARCH)/Makefile
 
+ifneq ($(origin PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET), undefined)
+  CFLAGS += -DHAVE_ARCH_REGS_QUERY_REGISTER_OFFSET
+endif
+
+
 include $(src-perf)/config/utilities.mak
 
 ifeq ($(call get-executable,$(FLEX)),)
@@ -314,6 +319,18 @@ ifndef NO_LIBELF
       CFLAGS += -DHAVE_LIBBPF_SUPPORT
       $(call detected,CONFIG_LIBBPF)
     endif
+
+    ifndef NO_DWARF
+      ifneq ($(origin PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET), undefined)
+        CFLAGS += -DHAVE_BPF_PROLOGUE
+        $(call detected,CONFIG_BPF_PROLOGUE)
+      else
+        msg := $(warning BPF prologue is not supported by architecture $(ARCH), missing regs_query_register_offset());
+      endif
+    else
+      msg := $(warning DWARF support is off, BPF prologue is disabled);
+    endif
+
   endif # NO_LIBBPF
 endif # NO_LIBELF
 
diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include/dwarf-regs.h
index 8f14965..07c644e 100644
--- a/tools/perf/util/include/dwarf-regs.h
+++ b/tools/perf/util/include/dwarf-regs.h
@@ -5,4 +5,12 @@
 const char *get_arch_regstr(unsigned int n);
 #endif
 
+#ifdef HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET
+/*
+ * Arch should support fetching the offset of a register in pt_regs
+ * by its name. See kernel's regs_query_register_offset in
+ * arch/xxx/kernel/ptrace.c.
+ */
+int regs_query_register_offset(const char *name);
+#endif
 #endif
-- 
1.8.3.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

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


#1216635 — [PATCH 23/31] perf tools: Introduce regs_query_register_offset() for x86

FromWang Nan <wangnan0@huawei.com>
Date2015-09-01 09:10 +0200
Subject[PATCH 23/31] perf tools: Introduce regs_query_register_offset() for x86
Message-ID<q3NRD-7PA-15@gated-at.bofh.it>
In reply to#1216634
regs_query_register_offset() is a helper function which converts
register name like "%rax" to offset of a register in 'struct pt_regs',
which is required by BPF prologue generator. Since the function is
identical, try to reuse the code in arch/x86/kernel/ptrace.c.

Comment inside dwarf-regs.c list the differences between this
implementation and kernel code.

get_arch_regstr() switches to regoffset_table and the old string table
is dropped.

Signed-off-by: Wang Nan <wangnan0@huawei.com>
Signed-off-by: He Kuang <hekuang@huawei.com>
Cc: Alexei Starovoitov <ast@plumgrid.com>
Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: David Ahern <dsahern@gmail.com>
Cc: He Kuang <hekuang@huawei.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kaixu Xia <xiakaixu@huawei.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/arch/x86/Makefile          |   1 +
 tools/perf/arch/x86/util/Build        |   1 +
 tools/perf/arch/x86/util/dwarf-regs.c | 122 ++++++++++++++++++++++++----------
 3 files changed, 90 insertions(+), 34 deletions(-)

diff --git a/tools/perf/arch/x86/Makefile b/tools/perf/arch/x86/Makefile
index 21322e0..09ba923 100644
--- a/tools/perf/arch/x86/Makefile
+++ b/tools/perf/arch/x86/Makefile
@@ -2,3 +2,4 @@ ifndef NO_DWARF
 PERF_HAVE_DWARF_REGS := 1
 endif
 HAVE_KVM_STAT_SUPPORT := 1
+PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET := 1
diff --git a/tools/perf/arch/x86/util/Build b/tools/perf/arch/x86/util/Build
index 2c55e1b..d4d1f23 100644
--- a/tools/perf/arch/x86/util/Build
+++ b/tools/perf/arch/x86/util/Build
@@ -4,6 +4,7 @@ libperf-y += pmu.o
 libperf-y += kvm-stat.o
 
 libperf-$(CONFIG_DWARF) += dwarf-regs.o
+libperf-$(CONFIG_BPF_PROLOGUE) += dwarf-regs.o
 
 libperf-$(CONFIG_LIBUNWIND)          += unwind-libunwind.o
 libperf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
diff --git a/tools/perf/arch/x86/util/dwarf-regs.c b/tools/perf/arch/x86/util/dwarf-regs.c
index a08de0a..de5b936 100644
--- a/tools/perf/arch/x86/util/dwarf-regs.c
+++ b/tools/perf/arch/x86/util/dwarf-regs.c
@@ -21,55 +21,109 @@
  */
 
 #include <stddef.h>
+#include <errno.h> /* for EINVAL */
+#include <string.h> /* for strcmp */
+#include <linux/ptrace.h> /* for struct pt_regs */
+#include <linux/kernel.h> /* for offsetof */
 #include <dwarf-regs.h>
 
 /*
- * Generic dwarf analysis helpers
+ * See arch/x86/kernel/ptrace.c.
+ * Different from it:
+ *
+ *  - Since struct pt_regs is defined differently for user and kernel,
+ *    but we want to use 'ax, bx' instead of 'rax, rbx' (which is struct
+ *    field name of user's pt_regs), we make REG_OFFSET_NAME to accept
+ *    both string name and reg field name.
+ *
+ *  - Since accessing x86_32's pt_regs from x86_64 building is difficult
+ *    and vise versa, we simply fill offset with -1, so
+ *    get_arch_regstr() still works but regs_query_register_offset()
+ *    returns error.
+ *    The only inconvenience caused by it now is that we are not allowed
+ *    to generate BPF prologue for a x86_64 kernel if perf is built for
+ *    x86_32. This is really a rare usecase.
+ *
+ *  - Order is different from kernel's ptrace.c for get_arch_regstr(), which
+ *    is defined by dwarf.
  */
 
-#define X86_32_MAX_REGS 8
-const char *x86_32_regs_table[X86_32_MAX_REGS] = {
-	"%ax",
-	"%cx",
-	"%dx",
-	"%bx",
-	"$stack",	/* Stack address instead of %sp */
-	"%bp",
-	"%si",
-	"%di",
+struct pt_regs_offset {
+	const char *name;
+	int offset;
+};
+
+#define REG_OFFSET_END {.name = NULL, .offset = 0}
+
+#ifdef __x86_64__
+# define REG_OFFSET_NAME_64(n, r) {.name = n, .offset = offsetof(struct pt_regs, r)}
+# define REG_OFFSET_NAME_32(n, r) {.name = n, .offset = -1}
+#else
+# define REG_OFFSET_NAME_64(n, r) {.name = n, .offset = -1}
+# define REG_OFFSET_NAME_32(n, r) {.name = n, .offset = offsetof(struct pt_regs, r)}
+#endif
+
+static const struct pt_regs_offset x86_32_regoffset_table[] = {
+	REG_OFFSET_NAME_32("%ax",	eax),
+	REG_OFFSET_NAME_32("%cx",	ecx),
+	REG_OFFSET_NAME_32("%dx",	edx),
+	REG_OFFSET_NAME_32("%bx",	ebx),
+	REG_OFFSET_NAME_32("$stack",	esp),	/* Stack address instead of %sp */
+	REG_OFFSET_NAME_32("%bp",	ebp),
+	REG_OFFSET_NAME_32("%si",	esi),
+	REG_OFFSET_NAME_32("%di",	edi),
+	REG_OFFSET_END,
 };
 
-#define X86_64_MAX_REGS 16
-const char *x86_64_regs_table[X86_64_MAX_REGS] = {
-	"%ax",
-	"%dx",
-	"%cx",
-	"%bx",
-	"%si",
-	"%di",
-	"%bp",
-	"%sp",
-	"%r8",
-	"%r9",
-	"%r10",
-	"%r11",
-	"%r12",
-	"%r13",
-	"%r14",
-	"%r15",
+static const struct pt_regs_offset x86_64_regoffset_table[] = {
+	REG_OFFSET_NAME_64("%ax",	rax),
+	REG_OFFSET_NAME_64("%dx",	rdx),
+	REG_OFFSET_NAME_64("%cx",	rcx),
+	REG_OFFSET_NAME_64("%bx",	rbx),
+	REG_OFFSET_NAME_64("%si",	rsi),
+	REG_OFFSET_NAME_64("%di",	rdi),
+	REG_OFFSET_NAME_64("%bp",	rbp),
+	REG_OFFSET_NAME_64("%sp",	rsp),
+	REG_OFFSET_NAME_64("%r8",	r8),
+	REG_OFFSET_NAME_64("%r9",	r9),
+	REG_OFFSET_NAME_64("%r10",	r10),
+	REG_OFFSET_NAME_64("%r11",	r11),
+	REG_OFFSET_NAME_64("%r12",	r12),
+	REG_OFFSET_NAME_64("%r13",	r13),
+	REG_OFFSET_NAME_64("%r14",	r14),
+	REG_OFFSET_NAME_64("%r15",	r15),
+	REG_OFFSET_END,
 };
 
 /* TODO: switching by dwarf address size */
 #ifdef __x86_64__
-#define ARCH_MAX_REGS X86_64_MAX_REGS
-#define arch_regs_table x86_64_regs_table
+#define regoffset_table x86_64_regoffset_table
 #else
-#define ARCH_MAX_REGS X86_32_MAX_REGS
-#define arch_regs_table x86_32_regs_table
+#define regoffset_table x86_32_regoffset_table
 #endif
 
+/* 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)
 {
-	return (n < ARCH_MAX_REGS) ? arch_regs_table[n] : NULL;
+	return (n < ARCH_MAX_REGS) ? regoffset_table[n].name : NULL;
+}
+
+/* Reuse code from arch/x86/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
+ * 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.3.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

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


#1216791 — RE: [PATCH 23/31] perf tools: Introduce regs_query_register_offset() for x86

From平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com>
Date2015-09-01 13:50 +0200
SubjectRE: [PATCH 23/31] perf tools: Introduce regs_query_register_offset() for x86
Message-ID<q3SeC-5tT-9@gated-at.bofh.it>
In reply to#1216635
PiBGcm9tOiBXYW5nIE5hbiBbbWFpbHRvOndhbmduYW4wQGh1YXdlaS5jb21dDQo+IA0KPiByZWdz
X3F1ZXJ5X3JlZ2lzdGVyX29mZnNldCgpIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIGNvbnZl
cnRzDQo+IHJlZ2lzdGVyIG5hbWUgbGlrZSAiJXJheCIgdG8gb2Zmc2V0IG9mIGEgcmVnaXN0ZXIg
aW4gJ3N0cnVjdCBwdF9yZWdzJywNCj4gd2hpY2ggaXMgcmVxdWlyZWQgYnkgQlBGIHByb2xvZ3Vl
IGdlbmVyYXRvci4gU2luY2UgdGhlIGZ1bmN0aW9uIGlzDQo+IGlkZW50aWNhbCwgdHJ5IHRvIHJl
dXNlIHRoZSBjb2RlIGluIGFyY2gveDg2L2tlcm5lbC9wdHJhY2UuYy4NCj4gDQo+IENvbW1lbnQg
aW5zaWRlIGR3YXJmLXJlZ3MuYyBsaXN0IHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoaXMNCj4g
aW1wbGVtZW50YXRpb24gYW5kIGtlcm5lbCBjb2RlLg0KDQpIbW0sIHRoaXMgYWxzbyBpbnRyb2R1
Y2UgYSBkdXBsaWNhdGlvbiBvZiB0aGUgY29kZS4uLg0KSXQgbWlnaHQgYmUgYSBnb29kIHRpbWUg
dG8gbW92ZSB0aGVtIGludG8gYXJjaC94ODYvbGliLyBhbmQNCnJldXNlIGl0IGRpcmVjdGx5IGZy
b20gcGVyZiBjb2RlLg0KDQpUaGFuayB5b3UsDQoNCj4gDQo+IGdldF9hcmNoX3JlZ3N0cigpIHN3
aXRjaGVzIHRvIHJlZ29mZnNldF90YWJsZSBhbmQgdGhlIG9sZCBzdHJpbmcgdGFibGUNCj4gaXMg
ZHJvcHBlZC4NCj4gDQo+IFNpZ25lZC1vZmYtYnk6IFdhbmcgTmFuIDx3YW5nbmFuMEBodWF3ZWku
Y29tPg0KPiBTaWduZWQtb2ZmLWJ5OiBIZSBLdWFuZyA8aGVrdWFuZ0BodWF3ZWkuY29tPg0KPiBD
YzogQWxleGVpIFN0YXJvdm9pdG92IDxhc3RAcGx1bWdyaWQuY29tPg0KPiBDYzogQnJlbmRhbiBH
cmVnZyA8YnJlbmRhbi5kLmdyZWdnQGdtYWlsLmNvbT4NCj4gQ2M6IERhbmllbCBCb3JrbWFubiA8
ZGFuaWVsQGlvZ2VhcmJveC5uZXQ+DQo+IENjOiBEYXZpZCBBaGVybiA8ZHNhaGVybkBnbWFpbC5j
b20+DQo+IENjOiBIZSBLdWFuZyA8aGVrdWFuZ0BodWF3ZWkuY29tPg0KPiBDYzogSmlyaSBPbHNh
IDxqb2xzYUBrZXJuZWwub3JnPg0KPiBDYzogS2FpeHUgWGlhIDx4aWFrYWl4dUBodWF3ZWkuY29t
Pg0KPiBDYzogTWFzYW1pIEhpcmFtYXRzdSA8bWFzYW1pLmhpcmFtYXRzdS5wdEBoaXRhY2hpLmNv
bT4NCj4gQ2M6IE5hbWh5dW5nIEtpbSA8bmFtaHl1bmdAa2VybmVsLm9yZz4NCj4gQ2M6IFBhdWwg
TWFja2VycmFzIDxwYXVsdXNAc2FtYmEub3JnPg0KPiBDYzogUGV0ZXIgWmlqbHN0cmEgPGEucC56
aWpsc3RyYUBjaGVsbG8ubmw+DQo+IENjOiBaZWZhbiBMaSA8bGl6ZWZhbkBodWF3ZWkuY29tPg0K
PiBDYzogcGkzb3JhbWFAMTYzLmNvbQ0KPiBDYzogQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxh
Y21lQHJlZGhhdC5jb20+DQo+IC0tLQ0KPiAgdG9vbHMvcGVyZi9hcmNoL3g4Ni9NYWtlZmlsZSAg
ICAgICAgICB8ICAgMSArDQo+ICB0b29scy9wZXJmL2FyY2gveDg2L3V0aWwvQnVpbGQgICAgICAg
IHwgICAxICsNCj4gIHRvb2xzL3BlcmYvYXJjaC94ODYvdXRpbC9kd2FyZi1yZWdzLmMgfCAxMjIg
KysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLQ0KPiAgMyBmaWxlcyBjaGFuZ2VkLCA5
MCBpbnNlcnRpb25zKCspLCAzNCBkZWxldGlvbnMoLSkNCj4gDQo+IGRpZmYgLS1naXQgYS90b29s
cy9wZXJmL2FyY2gveDg2L01ha2VmaWxlIGIvdG9vbHMvcGVyZi9hcmNoL3g4Ni9NYWtlZmlsZQ0K
PiBpbmRleCAyMTMyMmUwLi4wOWJhOTIzIDEwMDY0NA0KPiAtLS0gYS90b29scy9wZXJmL2FyY2gv
eDg2L01ha2VmaWxlDQo+ICsrKyBiL3Rvb2xzL3BlcmYvYXJjaC94ODYvTWFrZWZpbGUNCj4gQEAg
LTIsMyArMiw0IEBAIGlmbmRlZiBOT19EV0FSRg0KPiAgUEVSRl9IQVZFX0RXQVJGX1JFR1MgOj0g
MQ0KPiAgZW5kaWYNCj4gIEhBVkVfS1ZNX1NUQVRfU1VQUE9SVCA6PSAxDQo+ICtQRVJGX0hBVkVf
QVJDSF9SRUdTX1FVRVJZX1JFR0lTVEVSX09GRlNFVCA6PSAxDQo+IGRpZmYgLS1naXQgYS90b29s
cy9wZXJmL2FyY2gveDg2L3V0aWwvQnVpbGQgYi90b29scy9wZXJmL2FyY2gveDg2L3V0aWwvQnVp
bGQNCj4gaW5kZXggMmM1NWUxYi4uZDRkMWYyMyAxMDA2NDQNCj4gLS0tIGEvdG9vbHMvcGVyZi9h
cmNoL3g4Ni91dGlsL0J1aWxkDQo+ICsrKyBiL3Rvb2xzL3BlcmYvYXJjaC94ODYvdXRpbC9CdWls
ZA0KPiBAQCAtNCw2ICs0LDcgQEAgbGlicGVyZi15ICs9IHBtdS5vDQo+ICBsaWJwZXJmLXkgKz0g
a3ZtLXN0YXQubw0KPiANCj4gIGxpYnBlcmYtJChDT05GSUdfRFdBUkYpICs9IGR3YXJmLXJlZ3Mu
bw0KPiArbGlicGVyZi0kKENPTkZJR19CUEZfUFJPTE9HVUUpICs9IGR3YXJmLXJlZ3Mubw0KPiAN
Cj4gIGxpYnBlcmYtJChDT05GSUdfTElCVU5XSU5EKSAgICAgICAgICArPSB1bndpbmQtbGlidW53
aW5kLm8NCj4gIGxpYnBlcmYtJChDT05GSUdfTElCRFdfRFdBUkZfVU5XSU5EKSArPSB1bndpbmQt
bGliZHcubw0KPiBkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL3g4Ni91dGlsL2R3YXJmLXJl
Z3MuYyBiL3Rvb2xzL3BlcmYvYXJjaC94ODYvdXRpbC9kd2FyZi1yZWdzLmMNCj4gaW5kZXggYTA4
ZGUwYS4uZGU1YjkzNiAxMDA2NDQNCj4gLS0tIGEvdG9vbHMvcGVyZi9hcmNoL3g4Ni91dGlsL2R3
YXJmLXJlZ3MuYw0KPiArKysgYi90b29scy9wZXJmL2FyY2gveDg2L3V0aWwvZHdhcmYtcmVncy5j
DQo+IEBAIC0yMSw1NSArMjEsMTA5IEBADQo+ICAgKi8NCj4gDQo+ICAjaW5jbHVkZSA8c3RkZGVm
Lmg+DQo+ICsjaW5jbHVkZSA8ZXJybm8uaD4gLyogZm9yIEVJTlZBTCAqLw0KPiArI2luY2x1ZGUg
PHN0cmluZy5oPiAvKiBmb3Igc3RyY21wICovDQo+ICsjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+
IC8qIGZvciBzdHJ1Y3QgcHRfcmVncyAqLw0KPiArI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPiAv
KiBmb3Igb2Zmc2V0b2YgKi8NCj4gICNpbmNsdWRlIDxkd2FyZi1yZWdzLmg+DQo+IA0KPiAgLyoN
Cj4gLSAqIEdlbmVyaWMgZHdhcmYgYW5hbHlzaXMgaGVscGVycw0KPiArICogU2VlIGFyY2gveDg2
L2tlcm5lbC9wdHJhY2UuYy4NCj4gKyAqIERpZmZlcmVudCBmcm9tIGl0Og0KPiArICoNCj4gKyAq
ICAtIFNpbmNlIHN0cnVjdCBwdF9yZWdzIGlzIGRlZmluZWQgZGlmZmVyZW50bHkgZm9yIHVzZXIg
YW5kIGtlcm5lbCwNCj4gKyAqICAgIGJ1dCB3ZSB3YW50IHRvIHVzZSAnYXgsIGJ4JyBpbnN0ZWFk
IG9mICdyYXgsIHJieCcgKHdoaWNoIGlzIHN0cnVjdA0KPiArICogICAgZmllbGQgbmFtZSBvZiB1
c2VyJ3MgcHRfcmVncyksIHdlIG1ha2UgUkVHX09GRlNFVF9OQU1FIHRvIGFjY2VwdA0KPiArICog
ICAgYm90aCBzdHJpbmcgbmFtZSBhbmQgcmVnIGZpZWxkIG5hbWUuDQo+ICsgKg0KPiArICogIC0g
U2luY2UgYWNjZXNzaW5nIHg4Nl8zMidzIHB0X3JlZ3MgZnJvbSB4ODZfNjQgYnVpbGRpbmcgaXMg
ZGlmZmljdWx0DQo+ICsgKiAgICBhbmQgdmlzZSB2ZXJzYSwgd2Ugc2ltcGx5IGZpbGwgb2Zmc2V0
IHdpdGggLTEsIHNvDQo+ICsgKiAgICBnZXRfYXJjaF9yZWdzdHIoKSBzdGlsbCB3b3JrcyBidXQg
cmVnc19xdWVyeV9yZWdpc3Rlcl9vZmZzZXQoKQ0KPiArICogICAgcmV0dXJucyBlcnJvci4NCj4g
KyAqICAgIFRoZSBvbmx5IGluY29udmVuaWVuY2UgY2F1c2VkIGJ5IGl0IG5vdyBpcyB0aGF0IHdl
IGFyZSBub3QgYWxsb3dlZA0KPiArICogICAgdG8gZ2VuZXJhdGUgQlBGIHByb2xvZ3VlIGZvciBh
IHg4Nl82NCBrZXJuZWwgaWYgcGVyZiBpcyBidWlsdCBmb3INCj4gKyAqICAgIHg4Nl8zMi4gVGhp
cyBpcyByZWFsbHkgYSByYXJlIHVzZWNhc2UuDQo+ICsgKg0KPiArICogIC0gT3JkZXIgaXMgZGlm
ZmVyZW50IGZyb20ga2VybmVsJ3MgcHRyYWNlLmMgZm9yIGdldF9hcmNoX3JlZ3N0cigpLCB3aGlj
aA0KPiArICogICAgaXMgZGVmaW5lZCBieSBkd2FyZi4NCj4gICAqLw0KPiANCj4gLSNkZWZpbmUg
WDg2XzMyX01BWF9SRUdTIDgNCj4gLWNvbnN0IGNoYXIgKng4Nl8zMl9yZWdzX3RhYmxlW1g4Nl8z
Ml9NQVhfUkVHU10gPSB7DQo+IC0JIiVheCIsDQo+IC0JIiVjeCIsDQo+IC0JIiVkeCIsDQo+IC0J
IiVieCIsDQo+IC0JIiRzdGFjayIsCS8qIFN0YWNrIGFkZHJlc3MgaW5zdGVhZCBvZiAlc3AgKi8N
Cj4gLQkiJWJwIiwNCj4gLQkiJXNpIiwNCj4gLQkiJWRpIiwNCj4gK3N0cnVjdCBwdF9yZWdzX29m
ZnNldCB7DQo+ICsJY29uc3QgY2hhciAqbmFtZTsNCj4gKwlpbnQgb2Zmc2V0Ow0KPiArfTsNCj4g
Kw0KPiArI2RlZmluZSBSRUdfT0ZGU0VUX0VORCB7Lm5hbWUgPSBOVUxMLCAub2Zmc2V0ID0gMH0N
Cj4gKw0KPiArI2lmZGVmIF9feDg2XzY0X18NCj4gKyMgZGVmaW5lIFJFR19PRkZTRVRfTkFNRV82
NChuLCByKSB7Lm5hbWUgPSBuLCAub2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHIp
fQ0KPiArIyBkZWZpbmUgUkVHX09GRlNFVF9OQU1FXzMyKG4sIHIpIHsubmFtZSA9IG4sIC5vZmZz
ZXQgPSAtMX0NCj4gKyNlbHNlDQo+ICsjIGRlZmluZSBSRUdfT0ZGU0VUX05BTUVfNjQobiwgcikg
ey5uYW1lID0gbiwgLm9mZnNldCA9IC0xfQ0KPiArIyBkZWZpbmUgUkVHX09GRlNFVF9OQU1FXzMy
KG4sIHIpIHsubmFtZSA9IG4sIC5vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcil9
DQo+ICsjZW5kaWYNCj4gKw0KPiArc3RhdGljIGNvbnN0IHN0cnVjdCBwdF9yZWdzX29mZnNldCB4
ODZfMzJfcmVnb2Zmc2V0X3RhYmxlW10gPSB7DQo+ICsJUkVHX09GRlNFVF9OQU1FXzMyKCIlYXgi
LAllYXgpLA0KPiArCVJFR19PRkZTRVRfTkFNRV8zMigiJWN4IiwJZWN4KSwNCj4gKwlSRUdfT0ZG
U0VUX05BTUVfMzIoIiVkeCIsCWVkeCksDQo+ICsJUkVHX09GRlNFVF9OQU1FXzMyKCIlYngiLAll
YngpLA0KPiArCVJFR19PRkZTRVRfTkFNRV8zMigiJHN0YWNrIiwJZXNwKSwJLyogU3RhY2sgYWRk
cmVzcyBpbnN0ZWFkIG9mICVzcCAqLw0KPiArCVJFR19PRkZTRVRfTkFNRV8zMigiJWJwIiwJZWJw
KSwNCj4gKwlSRUdfT0ZGU0VUX05BTUVfMzIoIiVzaSIsCWVzaSksDQo+ICsJUkVHX09GRlNFVF9O
QU1FXzMyKCIlZGkiLAllZGkpLA0KPiArCVJFR19PRkZTRVRfRU5ELA0KPiAgfTsNCj4gDQo+IC0j
ZGVmaW5lIFg4Nl82NF9NQVhfUkVHUyAxNg0KPiAtY29uc3QgY2hhciAqeDg2XzY0X3JlZ3NfdGFi
bGVbWDg2XzY0X01BWF9SRUdTXSA9IHsNCj4gLQkiJWF4IiwNCj4gLQkiJWR4IiwNCj4gLQkiJWN4
IiwNCj4gLQkiJWJ4IiwNCj4gLQkiJXNpIiwNCj4gLQkiJWRpIiwNCj4gLQkiJWJwIiwNCj4gLQki
JXNwIiwNCj4gLQkiJXI4IiwNCj4gLQkiJXI5IiwNCj4gLQkiJXIxMCIsDQo+IC0JIiVyMTEiLA0K
PiAtCSIlcjEyIiwNCj4gLQkiJXIxMyIsDQo+IC0JIiVyMTQiLA0KPiAtCSIlcjE1IiwNCj4gK3N0
YXRpYyBjb25zdCBzdHJ1Y3QgcHRfcmVnc19vZmZzZXQgeDg2XzY0X3JlZ29mZnNldF90YWJsZVtd
ID0gew0KPiArCVJFR19PRkZTRVRfTkFNRV82NCgiJWF4IiwJcmF4KSwNCj4gKwlSRUdfT0ZGU0VU
X05BTUVfNjQoIiVkeCIsCXJkeCksDQo+ICsJUkVHX09GRlNFVF9OQU1FXzY0KCIlY3giLAlyY3gp
LA0KPiArCVJFR19PRkZTRVRfTkFNRV82NCgiJWJ4IiwJcmJ4KSwNCj4gKwlSRUdfT0ZGU0VUX05B
TUVfNjQoIiVzaSIsCXJzaSksDQo+ICsJUkVHX09GRlNFVF9OQU1FXzY0KCIlZGkiLAlyZGkpLA0K
PiArCVJFR19PRkZTRVRfTkFNRV82NCgiJWJwIiwJcmJwKSwNCj4gKwlSRUdfT0ZGU0VUX05BTUVf
NjQoIiVzcCIsCXJzcCksDQo+ICsJUkVHX09GRlNFVF9OQU1FXzY0KCIlcjgiLAlyOCksDQo+ICsJ
UkVHX09GRlNFVF9OQU1FXzY0KCIlcjkiLAlyOSksDQo+ICsJUkVHX09GRlNFVF9OQU1FXzY0KCIl
cjEwIiwJcjEwKSwNCj4gKwlSRUdfT0ZGU0VUX05BTUVfNjQoIiVyMTEiLAlyMTEpLA0KPiArCVJF
R19PRkZTRVRfTkFNRV82NCgiJXIxMiIsCXIxMiksDQo+ICsJUkVHX09GRlNFVF9OQU1FXzY0KCIl
cjEzIiwJcjEzKSwNCj4gKwlSRUdfT0ZGU0VUX05BTUVfNjQoIiVyMTQiLAlyMTQpLA0KPiArCVJF
R19PRkZTRVRfTkFNRV82NCgiJXIxNSIsCXIxNSksDQo+ICsJUkVHX09GRlNFVF9FTkQsDQo+ICB9
Ow0KPiANCj4gIC8qIFRPRE86IHN3aXRjaGluZyBieSBkd2FyZiBhZGRyZXNzIHNpemUgKi8NCj4g
ICNpZmRlZiBfX3g4Nl82NF9fDQo+IC0jZGVmaW5lIEFSQ0hfTUFYX1JFR1MgWDg2XzY0X01BWF9S
RUdTDQo+IC0jZGVmaW5lIGFyY2hfcmVnc190YWJsZSB4ODZfNjRfcmVnc190YWJsZQ0KPiArI2Rl
ZmluZSByZWdvZmZzZXRfdGFibGUgeDg2XzY0X3JlZ29mZnNldF90YWJsZQ0KPiAgI2Vsc2UNCj4g
LSNkZWZpbmUgQVJDSF9NQVhfUkVHUyBYODZfMzJfTUFYX1JFR1MNCj4gLSNkZWZpbmUgYXJjaF9y
ZWdzX3RhYmxlIHg4Nl8zMl9yZWdzX3RhYmxlDQo+ICsjZGVmaW5lIHJlZ29mZnNldF90YWJsZSB4
ODZfMzJfcmVnb2Zmc2V0X3RhYmxlDQo+ICAjZW5kaWYNCj4gDQo+ICsvKiBNaW51cyAxIGZvciB0
aGUgZW5kaW5nIFJFR19PRkZTRVRfRU5EICovDQo+ICsjZGVmaW5lIEFSQ0hfTUFYX1JFR1MgKChz
aXplb2YocmVnb2Zmc2V0X3RhYmxlKSAvIHNpemVvZihyZWdvZmZzZXRfdGFibGVbMF0pKSAtIDEp
DQo+ICsNCj4gIC8qIFJldHVybiBhcmNoaXRlY3R1cmUgZGVwZW5kZW50IHJlZ2lzdGVyIHN0cmlu
ZyAoZm9yIGtwcm9iZS10cmFjZXIpICovDQo+ICBjb25zdCBjaGFyICpnZXRfYXJjaF9yZWdzdHIo
dW5zaWduZWQgaW50IG4pDQo+ICB7DQo+IC0JcmV0dXJuIChuIDwgQVJDSF9NQVhfUkVHUykgPyBh
cmNoX3JlZ3NfdGFibGVbbl0gOiBOVUxMOw0KPiArCXJldHVybiAobiA8IEFSQ0hfTUFYX1JFR1Mp
ID8gcmVnb2Zmc2V0X3RhYmxlW25dLm5hbWUgOiBOVUxMOw0KPiArfQ0KPiArDQo+ICsvKiBSZXVz
ZSBjb2RlIGZyb20gYXJjaC94ODYva2VybmVsL3B0cmFjZS5jICovDQo+ICsvKioNCj4gKyAqIHJl
Z3NfcXVlcnlfcmVnaXN0ZXJfb2Zmc2V0KCkgLSBxdWVyeSByZWdpc3RlciBvZmZzZXQgZnJvbSBp
dHMgbmFtZQ0KPiArICogQG5hbWU6CXRoZSBuYW1lIG9mIGEgcmVnaXN0ZXINCj4gKyAqDQo+ICsg
KiByZWdzX3F1ZXJ5X3JlZ2lzdGVyX29mZnNldCgpIHJldHVybnMgdGhlIG9mZnNldCBvZiBhIHJl
Z2lzdGVyIGluIHN0cnVjdA0KPiArICogcHRfcmVncyBmcm9tIGl0cyBuYW1lLiBJZiB0aGUgbmFt
ZSBpcyBpbnZhbGlkLCB0aGlzIHJldHVybnMgLUVJTlZBTDsNCj4gKyAqLw0KPiAraW50IHJlZ3Nf
cXVlcnlfcmVnaXN0ZXJfb2Zmc2V0KGNvbnN0IGNoYXIgKm5hbWUpDQo+ICt7DQo+ICsJY29uc3Qg
c3RydWN0IHB0X3JlZ3Nfb2Zmc2V0ICpyb2ZmOw0KPiArCWZvciAocm9mZiA9IHJlZ29mZnNldF90
YWJsZTsgcm9mZi0+bmFtZSAhPSBOVUxMOyByb2ZmKyspDQo+ICsJCWlmICghc3RyY21wKHJvZmYt
Pm5hbWUsIG5hbWUpKQ0KPiArCQkJcmV0dXJuIHJvZmYtPm9mZnNldDsNCj4gKwlyZXR1cm4gLUVJ
TlZBTDsNCj4gIH0NCj4gLS0NCj4gMS44LjMuNA0KDQo=
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

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


#1216861 — Re: [PATCH 23/31] perf tools: Introduce regs_query_register_offset() for x86

From"Wangnan (F)" <wangnan0@huawei.com>
Date2015-09-01 16:00 +0200
SubjectRe: [PATCH 23/31] perf tools: Introduce regs_query_register_offset() for x86
Message-ID<q3Ugr-8lN-35@gated-at.bofh.it>
In reply to#1216791

On 2015/9/1 19:47, 平松雅巳 / HIRAMATU,MASAMI wrote:
>> From: Wang Nan [mailto:wangnan0@huawei.com]
>>
>> regs_query_register_offset() is a helper function which converts
>> register name like "%rax" to offset of a register in 'struct pt_regs',
>> which is required by BPF prologue generator. Since the function is
>> identical, try to reuse the code in arch/x86/kernel/ptrace.c.
>>
>> Comment inside dwarf-regs.c list the differences between this
>> implementation and kernel code.
> Hmm, this also introduce a duplication of the code...
> It might be a good time to move them into arch/x86/lib/ and
> reuse it directly from perf code.

So you want to move it from ./arch/x86/kernel/ptrace.c to arch/x86/lib and
let perf link against arch/x86/lib/lib.a to use it?

I think it worth a specific work to do it. Currently we lake
scaffold to compile and link against the kernel side library. Moreover,
we should also consider other archs. Seems not very easy.

This is not the only one file which can benifite from kernel's arch/x86/lib
Newly introduced tools/perf/util/intel-pt-decoder/insn.c, and I believe 
there's
more. Therefore I think it should be a separated work from perf BPF patches.
So how about keep this patch at this time? Or do you have some idea?

Thank you.

> Thank you,
>
>> get_arch_regstr() switches to regoffset_table and the old string table
>> is dropped.
>>
>> Signed-off-by: Wang Nan <wangnan0@huawei.com>
>> Signed-off-by: He Kuang <hekuang@huawei.com>
>> Cc: Alexei Starovoitov <ast@plumgrid.com>
>> Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
>> Cc: Daniel Borkmann <daniel@iogearbox.net>
>> Cc: David Ahern <dsahern@gmail.com>
>> Cc: He Kuang <hekuang@huawei.com>
>> Cc: Jiri Olsa <jolsa@kernel.org>
>> Cc: Kaixu Xia <xiakaixu@huawei.com>
>> Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
>> Cc: Namhyung Kim <namhyung@kernel.org>
>> Cc: Paul Mackerras <paulus@samba.org>
>> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
>> Cc: Zefan Li <lizefan@huawei.com>
>> Cc: pi3orama@163.com
>> Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
>> ---
>>   tools/perf/arch/x86/Makefile          |   1 +
>>   tools/perf/arch/x86/util/Build        |   1 +
>>   tools/perf/arch/x86/util/dwarf-regs.c | 122 ++++++++++++++++++++++++----------
>>   3 files changed, 90 insertions(+), 34 deletions(-)
>>
>> diff --git a/tools/perf/arch/x86/Makefile b/tools/perf/arch/x86/Makefile
>> index 21322e0..09ba923 100644
>> --- a/tools/perf/arch/x86/Makefile
>> +++ b/tools/perf/arch/x86/Makefile
>> @@ -2,3 +2,4 @@ ifndef NO_DWARF
>>   PERF_HAVE_DWARF_REGS := 1
>>   endif
>>   HAVE_KVM_STAT_SUPPORT := 1
>> +PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET := 1
>> diff --git a/tools/perf/arch/x86/util/Build b/tools/perf/arch/x86/util/Build
>> index 2c55e1b..d4d1f23 100644
>> --- a/tools/perf/arch/x86/util/Build
>> +++ b/tools/perf/arch/x86/util/Build
>> @@ -4,6 +4,7 @@ libperf-y += pmu.o
>>   libperf-y += kvm-stat.o
>>
>>   libperf-$(CONFIG_DWARF) += dwarf-regs.o
>> +libperf-$(CONFIG_BPF_PROLOGUE) += dwarf-regs.o
>>
>>   libperf-$(CONFIG_LIBUNWIND)          += unwind-libunwind.o
>>   libperf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
>> diff --git a/tools/perf/arch/x86/util/dwarf-regs.c b/tools/perf/arch/x86/util/dwarf-regs.c
>> index a08de0a..de5b936 100644
>> --- a/tools/perf/arch/x86/util/dwarf-regs.c
>> +++ b/tools/perf/arch/x86/util/dwarf-regs.c
>> @@ -21,55 +21,109 @@
>>    */
>>
>>   #include <stddef.h>
>> +#include <errno.h> /* for EINVAL */
>> +#include <string.h> /* for strcmp */
>> +#include <linux/ptrace.h> /* for struct pt_regs */
>> +#include <linux/kernel.h> /* for offsetof */
>>   #include <dwarf-regs.h>
>>
>>   /*
>> - * Generic dwarf analysis helpers
>> + * See arch/x86/kernel/ptrace.c.
>> + * Different from it:
>> + *
>> + *  - Since struct pt_regs is defined differently for user and kernel,
>> + *    but we want to use 'ax, bx' instead of 'rax, rbx' (which is struct
>> + *    field name of user's pt_regs), we make REG_OFFSET_NAME to accept
>> + *    both string name and reg field name.
>> + *
>> + *  - Since accessing x86_32's pt_regs from x86_64 building is difficult
>> + *    and vise versa, we simply fill offset with -1, so
>> + *    get_arch_regstr() still works but regs_query_register_offset()
>> + *    returns error.
>> + *    The only inconvenience caused by it now is that we are not allowed
>> + *    to generate BPF prologue for a x86_64 kernel if perf is built for
>> + *    x86_32. This is really a rare usecase.
>> + *
>> + *  - Order is different from kernel's ptrace.c for get_arch_regstr(), which
>> + *    is defined by dwarf.
>>    */
>>
>> -#define X86_32_MAX_REGS 8
>> -const char *x86_32_regs_table[X86_32_MAX_REGS] = {
>> -	"%ax",
>> -	"%cx",
>> -	"%dx",
>> -	"%bx",
>> -	"$stack",	/* Stack address instead of %sp */
>> -	"%bp",
>> -	"%si",
>> -	"%di",
>> +struct pt_regs_offset {
>> +	const char *name;
>> +	int offset;
>> +};
>> +
>> +#define REG_OFFSET_END {.name = NULL, .offset = 0}
>> +
>> +#ifdef __x86_64__
>> +# define REG_OFFSET_NAME_64(n, r) {.name = n, .offset = offsetof(struct pt_regs, r)}
>> +# define REG_OFFSET_NAME_32(n, r) {.name = n, .offset = -1}
>> +#else
>> +# define REG_OFFSET_NAME_64(n, r) {.name = n, .offset = -1}
>> +# define REG_OFFSET_NAME_32(n, r) {.name = n, .offset = offsetof(struct pt_regs, r)}
>> +#endif
>> +
>> +static const struct pt_regs_offset x86_32_regoffset_table[] = {
>> +	REG_OFFSET_NAME_32("%ax",	eax),
>> +	REG_OFFSET_NAME_32("%cx",	ecx),
>> +	REG_OFFSET_NAME_32("%dx",	edx),
>> +	REG_OFFSET_NAME_32("%bx",	ebx),
>> +	REG_OFFSET_NAME_32("$stack",	esp),	/* Stack address instead of %sp */
>> +	REG_OFFSET_NAME_32("%bp",	ebp),
>> +	REG_OFFSET_NAME_32("%si",	esi),
>> +	REG_OFFSET_NAME_32("%di",	edi),
>> +	REG_OFFSET_END,
>>   };
>>
>> -#define X86_64_MAX_REGS 16
>> -const char *x86_64_regs_table[X86_64_MAX_REGS] = {
>> -	"%ax",
>> -	"%dx",
>> -	"%cx",
>> -	"%bx",
>> -	"%si",
>> -	"%di",
>> -	"%bp",
>> -	"%sp",
>> -	"%r8",
>> -	"%r9",
>> -	"%r10",
>> -	"%r11",
>> -	"%r12",
>> -	"%r13",
>> -	"%r14",
>> -	"%r15",
>> +static const struct pt_regs_offset x86_64_regoffset_table[] = {
>> +	REG_OFFSET_NAME_64("%ax",	rax),
>> +	REG_OFFSET_NAME_64("%dx",	rdx),
>> +	REG_OFFSET_NAME_64("%cx",	rcx),
>> +	REG_OFFSET_NAME_64("%bx",	rbx),
>> +	REG_OFFSET_NAME_64("%si",	rsi),
>> +	REG_OFFSET_NAME_64("%di",	rdi),
>> +	REG_OFFSET_NAME_64("%bp",	rbp),
>> +	REG_OFFSET_NAME_64("%sp",	rsp),
>> +	REG_OFFSET_NAME_64("%r8",	r8),
>> +	REG_OFFSET_NAME_64("%r9",	r9),
>> +	REG_OFFSET_NAME_64("%r10",	r10),
>> +	REG_OFFSET_NAME_64("%r11",	r11),
>> +	REG_OFFSET_NAME_64("%r12",	r12),
>> +	REG_OFFSET_NAME_64("%r13",	r13),
>> +	REG_OFFSET_NAME_64("%r14",	r14),
>> +	REG_OFFSET_NAME_64("%r15",	r15),
>> +	REG_OFFSET_END,
>>   };
>>
>>   /* TODO: switching by dwarf address size */
>>   #ifdef __x86_64__
>> -#define ARCH_MAX_REGS X86_64_MAX_REGS
>> -#define arch_regs_table x86_64_regs_table
>> +#define regoffset_table x86_64_regoffset_table
>>   #else
>> -#define ARCH_MAX_REGS X86_32_MAX_REGS
>> -#define arch_regs_table x86_32_regs_table
>> +#define regoffset_table x86_32_regoffset_table
>>   #endif
>>
>> +/* 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)
>>   {
>> -	return (n < ARCH_MAX_REGS) ? arch_regs_table[n] : NULL;
>> +	return (n < ARCH_MAX_REGS) ? regoffset_table[n].name : NULL;
>> +}
>> +
>> +/* Reuse code from arch/x86/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
>> + * 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.3.4


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

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


#1216912 — Re: [PATCH 23/31] perf tools: Introduce regs_query_register_offset() for x86

FromArnaldo Carvalho de Melo <acme@kernel.org>
Date2015-09-01 17:00 +0200
SubjectRe: [PATCH 23/31] perf tools: Introduce regs_query_register_offset() for x86
Message-ID<q3Vcv-1fz-61@gated-at.bofh.it>
In reply to#1216861
Em Tue, Sep 01, 2015 at 09:52:30PM +0800, Wangnan (F) escreveu:
> On 2015/9/1 19:47, 平松雅巳 / HIRAMATU,MASAMI wrote:
> >>From: Wang Nan [mailto:wangnan0@huawei.com]
> >>regs_query_register_offset() is a helper function which converts
> >>register name like "%rax" to offset of a register in 'struct pt_regs',
> >>which is required by BPF prologue generator. Since the function is
> >>identical, try to reuse the code in arch/x86/kernel/ptrace.c.

> >>Comment inside dwarf-regs.c list the differences between this
> >>implementation and kernel code.
> >Hmm, this also introduce a duplication of the code...
> >It might be a good time to move them into arch/x86/lib/ and
> >reuse it directly from perf code.
 
> So you want to move it from ./arch/x86/kernel/ptrace.c to arch/x86/lib and
> let perf link against arch/x86/lib/lib.a to use it?
 
> I think it worth a specific work to do it. Currently we lake
> scaffold to compile and link against the kernel side library. Moreover,
> we should also consider other archs. Seems not very easy.
 
> This is not the only one file which can benifite from kernel's arch/x86/lib
> Newly introduced tools/perf/util/intel-pt-decoder/insn.c, and I believe
> there's
> more. Therefore I think it should be a separated work from perf BPF patches.
> So how about keep this patch at this time? Or do you have some idea?

I would go with what Wang did at this time, its a step in the right
direction in the sense that we're trying to use the same function names
and semantics, and, as much as possible, possibly in verbatim form,
using the same implementation.

Doing the work to fully share it is something being discussed, but that
should not get in the way of eBPF work, IMHO.

- Arnaldo
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

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


#1216876 — Re: [PATCH 23/31] perf tools: Introduce regs_query_register_offset() for x86

FromArnaldo Carvalho de Melo <acme@redhat.com>
Date2015-09-01 16:20 +0200
SubjectRe: [PATCH 23/31] perf tools: Introduce regs_query_register_offset() for x86
Message-ID<q3UzM-w6-25@gated-at.bofh.it>
In reply to#1216791
Em Tue, Sep 01, 2015 at 11:47:41AM +0000, 平松雅巳 / HIRAMATU,MASAMI escreveu:
> > From: Wang Nan [mailto:wangnan0@huawei.com]
> > 
> > regs_query_register_offset() is a helper function which converts
> > register name like "%rax" to offset of a register in 'struct pt_regs',
> > which is required by BPF prologue generator. Since the function is
> > identical, try to reuse the code in arch/x86/kernel/ptrace.c.
> > 
> > Comment inside dwarf-regs.c list the differences between this
> > implementation and kernel code.
> 
> Hmm, this also introduce a duplication of the code...
> It might be a good time to move them into arch/x86/lib/ and
> reuse it directly from perf code.

It is strange to, having tried sharing stuff directly from the kernel,
to be now in a position where I advocate against it...

Copy'n'pasting what I said in another message:

-----
We would go back to sharing stuff with the kernel, but this time around
we would be using something that everybody knows is being shared, which
doesn't elliminates the possibility that at some point changes made with
the kernel in mind would break the tools/ using code.

Perhaps it is better to keep copying what we want and introduce
infrastructure to check for differences and warn us as soon as possible
so that we would do the copy, test if it doesn't break what we use, etc.

I.e. we wouldn't be putting any new burden on the "kernel people", i.e.
the burden of having to check that changes they make don't break tools/
living code, nor any out of the blue breakage on tools/ for tools/
developers to fix when changes are made on the kernel "side" -----
---

The "stop sharing directly stuff with the kernel" stance was taken after
a report from Linus about breakage due to tools/ using kernel files
directly and then a change made in some RCU files broke the tools/perf/
build, even with tools/perf/ not using anything RCU related so far.

Looking at tools/perf/MANIFEST, the file used to create a detached
tarball so that perf can be built outside the kernel sources there are
still some kernel source files listed, but those probably need to be
copied too...

- Arnaldo
 
> Thank you,
> 
> > 
> > get_arch_regstr() switches to regoffset_table and the old string table
> > is dropped.
> > 
> > Signed-off-by: Wang Nan <wangnan0@huawei.com>
> > Signed-off-by: He Kuang <hekuang@huawei.com>
> > Cc: Alexei Starovoitov <ast@plumgrid.com>
> > Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
> > Cc: Daniel Borkmann <daniel@iogearbox.net>
> > Cc: David Ahern <dsahern@gmail.com>
> > Cc: He Kuang <hekuang@huawei.com>
> > Cc: Jiri Olsa <jolsa@kernel.org>
> > Cc: Kaixu Xia <xiakaixu@huawei.com>
> > Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
> > Cc: Namhyung Kim <namhyung@kernel.org>
> > Cc: Paul Mackerras <paulus@samba.org>
> > Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
> > Cc: Zefan Li <lizefan@huawei.com>
> > Cc: pi3orama@163.com
> > Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
> > ---
> >  tools/perf/arch/x86/Makefile          |   1 +
> >  tools/perf/arch/x86/util/Build        |   1 +
> >  tools/perf/arch/x86/util/dwarf-regs.c | 122 ++++++++++++++++++++++++----------
> >  3 files changed, 90 insertions(+), 34 deletions(-)
> > 
> > diff --git a/tools/perf/arch/x86/Makefile b/tools/perf/arch/x86/Makefile
> > index 21322e0..09ba923 100644
> > --- a/tools/perf/arch/x86/Makefile
> > +++ b/tools/perf/arch/x86/Makefile
> > @@ -2,3 +2,4 @@ ifndef NO_DWARF
> >  PERF_HAVE_DWARF_REGS := 1
> >  endif
> >  HAVE_KVM_STAT_SUPPORT := 1
> > +PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET := 1
> > diff --git a/tools/perf/arch/x86/util/Build b/tools/perf/arch/x86/util/Build
> > index 2c55e1b..d4d1f23 100644
> > --- a/tools/perf/arch/x86/util/Build
> > +++ b/tools/perf/arch/x86/util/Build
> > @@ -4,6 +4,7 @@ libperf-y += pmu.o
> >  libperf-y += kvm-stat.o
> > 
> >  libperf-$(CONFIG_DWARF) += dwarf-regs.o
> > +libperf-$(CONFIG_BPF_PROLOGUE) += dwarf-regs.o
> > 
> >  libperf-$(CONFIG_LIBUNWIND)          += unwind-libunwind.o
> >  libperf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
> > diff --git a/tools/perf/arch/x86/util/dwarf-regs.c b/tools/perf/arch/x86/util/dwarf-regs.c
> > index a08de0a..de5b936 100644
> > --- a/tools/perf/arch/x86/util/dwarf-regs.c
> > +++ b/tools/perf/arch/x86/util/dwarf-regs.c
> > @@ -21,55 +21,109 @@
> >   */
> > 
> >  #include <stddef.h>
> > +#include <errno.h> /* for EINVAL */
> > +#include <string.h> /* for strcmp */
> > +#include <linux/ptrace.h> /* for struct pt_regs */
> > +#include <linux/kernel.h> /* for offsetof */
> >  #include <dwarf-regs.h>
> > 
> >  /*
> > - * Generic dwarf analysis helpers
> > + * See arch/x86/kernel/ptrace.c.
> > + * Different from it:
> > + *
> > + *  - Since struct pt_regs is defined differently for user and kernel,
> > + *    but we want to use 'ax, bx' instead of 'rax, rbx' (which is struct
> > + *    field name of user's pt_regs), we make REG_OFFSET_NAME to accept
> > + *    both string name and reg field name.
> > + *
> > + *  - Since accessing x86_32's pt_regs from x86_64 building is difficult
> > + *    and vise versa, we simply fill offset with -1, so
> > + *    get_arch_regstr() still works but regs_query_register_offset()
> > + *    returns error.
> > + *    The only inconvenience caused by it now is that we are not allowed
> > + *    to generate BPF prologue for a x86_64 kernel if perf is built for
> > + *    x86_32. This is really a rare usecase.
> > + *
> > + *  - Order is different from kernel's ptrace.c for get_arch_regstr(), which
> > + *    is defined by dwarf.
> >   */
> > 
> > -#define X86_32_MAX_REGS 8
> > -const char *x86_32_regs_table[X86_32_MAX_REGS] = {
> > -	"%ax",
> > -	"%cx",
> > -	"%dx",
> > -	"%bx",
> > -	"$stack",	/* Stack address instead of %sp */
> > -	"%bp",
> > -	"%si",
> > -	"%di",
> > +struct pt_regs_offset {
> > +	const char *name;
> > +	int offset;
> > +};
> > +
> > +#define REG_OFFSET_END {.name = NULL, .offset = 0}
> > +
> > +#ifdef __x86_64__
> > +# define REG_OFFSET_NAME_64(n, r) {.name = n, .offset = offsetof(struct pt_regs, r)}
> > +# define REG_OFFSET_NAME_32(n, r) {.name = n, .offset = -1}
> > +#else
> > +# define REG_OFFSET_NAME_64(n, r) {.name = n, .offset = -1}
> > +# define REG_OFFSET_NAME_32(n, r) {.name = n, .offset = offsetof(struct pt_regs, r)}
> > +#endif
> > +
> > +static const struct pt_regs_offset x86_32_regoffset_table[] = {
> > +	REG_OFFSET_NAME_32("%ax",	eax),
> > +	REG_OFFSET_NAME_32("%cx",	ecx),
> > +	REG_OFFSET_NAME_32("%dx",	edx),
> > +	REG_OFFSET_NAME_32("%bx",	ebx),
> > +	REG_OFFSET_NAME_32("$stack",	esp),	/* Stack address instead of %sp */
> > +	REG_OFFSET_NAME_32("%bp",	ebp),
> > +	REG_OFFSET_NAME_32("%si",	esi),
> > +	REG_OFFSET_NAME_32("%di",	edi),
> > +	REG_OFFSET_END,
> >  };
> > 
> > -#define X86_64_MAX_REGS 16
> > -const char *x86_64_regs_table[X86_64_MAX_REGS] = {
> > -	"%ax",
> > -	"%dx",
> > -	"%cx",
> > -	"%bx",
> > -	"%si",
> > -	"%di",
> > -	"%bp",
> > -	"%sp",
> > -	"%r8",
> > -	"%r9",
> > -	"%r10",
> > -	"%r11",
> > -	"%r12",
> > -	"%r13",
> > -	"%r14",
> > -	"%r15",
> > +static const struct pt_regs_offset x86_64_regoffset_table[] = {
> > +	REG_OFFSET_NAME_64("%ax",	rax),
> > +	REG_OFFSET_NAME_64("%dx",	rdx),
> > +	REG_OFFSET_NAME_64("%cx",	rcx),
> > +	REG_OFFSET_NAME_64("%bx",	rbx),
> > +	REG_OFFSET_NAME_64("%si",	rsi),
> > +	REG_OFFSET_NAME_64("%di",	rdi),
> > +	REG_OFFSET_NAME_64("%bp",	rbp),
> > +	REG_OFFSET_NAME_64("%sp",	rsp),
> > +	REG_OFFSET_NAME_64("%r8",	r8),
> > +	REG_OFFSET_NAME_64("%r9",	r9),
> > +	REG_OFFSET_NAME_64("%r10",	r10),
> > +	REG_OFFSET_NAME_64("%r11",	r11),
> > +	REG_OFFSET_NAME_64("%r12",	r12),
> > +	REG_OFFSET_NAME_64("%r13",	r13),
> > +	REG_OFFSET_NAME_64("%r14",	r14),
> > +	REG_OFFSET_NAME_64("%r15",	r15),
> > +	REG_OFFSET_END,
> >  };
> > 
> >  /* TODO: switching by dwarf address size */
> >  #ifdef __x86_64__
> > -#define ARCH_MAX_REGS X86_64_MAX_REGS
> > -#define arch_regs_table x86_64_regs_table
> > +#define regoffset_table x86_64_regoffset_table
> >  #else
> > -#define ARCH_MAX_REGS X86_32_MAX_REGS
> > -#define arch_regs_table x86_32_regs_table
> > +#define regoffset_table x86_32_regoffset_table
> >  #endif
> > 
> > +/* 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)
> >  {
> > -	return (n < ARCH_MAX_REGS) ? arch_regs_table[n] : NULL;
> > +	return (n < ARCH_MAX_REGS) ? regoffset_table[n].name : NULL;
> > +}
> > +
> > +/* Reuse code from arch/x86/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
> > + * 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.3.4
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

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


#1216941 — RE: [PATCH 23/31] perf tools: Introduce regs_query_register_offset() for x86

From平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com>
Date2015-09-01 18:00 +0200
SubjectRE: [PATCH 23/31] perf tools: Introduce regs_query_register_offset() for x86
Message-ID<q3W8z-2Bi-27@gated-at.bofh.it>
In reply to#1216876
PiBGcm9tOiBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gW21haWx0bzphY21lQHJlZGhhdC5jb21d
DQo+IA0KPiBFbSBUdWUsIFNlcCAwMSwgMjAxNSBhdCAxMTo0Nzo0MUFNICswMDAwLCDlubPmnb7p
m4Xlt7MgLyBISVJBTUFUVe+8jE1BU0FNSSBlc2NyZXZldToNCj4gPiA+IEZyb206IFdhbmcgTmFu
IFttYWlsdG86d2FuZ25hbjBAaHVhd2VpLmNvbV0NCj4gPiA+DQo+ID4gPiByZWdzX3F1ZXJ5X3Jl
Z2lzdGVyX29mZnNldCgpIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIGNvbnZlcnRzDQo+ID4g
PiByZWdpc3RlciBuYW1lIGxpa2UgIiVyYXgiIHRvIG9mZnNldCBvZiBhIHJlZ2lzdGVyIGluICdz
dHJ1Y3QgcHRfcmVncycsDQo+ID4gPiB3aGljaCBpcyByZXF1aXJlZCBieSBCUEYgcHJvbG9ndWUg
Z2VuZXJhdG9yLiBTaW5jZSB0aGUgZnVuY3Rpb24gaXMNCj4gPiA+IGlkZW50aWNhbCwgdHJ5IHRv
IHJldXNlIHRoZSBjb2RlIGluIGFyY2gveDg2L2tlcm5lbC9wdHJhY2UuYy4NCj4gPiA+DQo+ID4g
PiBDb21tZW50IGluc2lkZSBkd2FyZi1yZWdzLmMgbGlzdCB0aGUgZGlmZmVyZW5jZXMgYmV0d2Vl
biB0aGlzDQo+ID4gPiBpbXBsZW1lbnRhdGlvbiBhbmQga2VybmVsIGNvZGUuDQo+ID4NCj4gPiBI
bW0sIHRoaXMgYWxzbyBpbnRyb2R1Y2UgYSBkdXBsaWNhdGlvbiBvZiB0aGUgY29kZS4uLg0KPiA+
IEl0IG1pZ2h0IGJlIGEgZ29vZCB0aW1lIHRvIG1vdmUgdGhlbSBpbnRvIGFyY2gveDg2L2xpYi8g
YW5kDQo+ID4gcmV1c2UgaXQgZGlyZWN0bHkgZnJvbSBwZXJmIGNvZGUuDQo+IA0KPiBJdCBpcyBz
dHJhbmdlIHRvLCBoYXZpbmcgdHJpZWQgc2hhcmluZyBzdHVmZiBkaXJlY3RseSBmcm9tIHRoZSBr
ZXJuZWwsDQo+IHRvIGJlIG5vdyBpbiBhIHBvc2l0aW9uIHdoZXJlIEkgYWR2b2NhdGUgYWdhaW5z
dCBpdC4uLg0KPiANCj4gQ29weSduJ3Bhc3Rpbmcgd2hhdCBJIHNhaWQgaW4gYW5vdGhlciBtZXNz
YWdlOg0KPiANCj4gLS0tLS0NCj4gV2Ugd291bGQgZ28gYmFjayB0byBzaGFyaW5nIHN0dWZmIHdp
dGggdGhlIGtlcm5lbCwgYnV0IHRoaXMgdGltZSBhcm91bmQNCj4gd2Ugd291bGQgYmUgdXNpbmcg
c29tZXRoaW5nIHRoYXQgZXZlcnlib2R5IGtub3dzIGlzIGJlaW5nIHNoYXJlZCwgd2hpY2gNCj4g
ZG9lc24ndCBlbGxpbWluYXRlcyB0aGUgcG9zc2liaWxpdHkgdGhhdCBhdCBzb21lIHBvaW50IGNo
YW5nZXMgbWFkZSB3aXRoDQo+IHRoZSBrZXJuZWwgaW4gbWluZCB3b3VsZCBicmVhayB0aGUgdG9v
bHMvIHVzaW5nIGNvZGUuDQo+IA0KPiBQZXJoYXBzIGl0IGlzIGJldHRlciB0byBrZWVwIGNvcHlp
bmcgd2hhdCB3ZSB3YW50IGFuZCBpbnRyb2R1Y2UNCj4gaW5mcmFzdHJ1Y3R1cmUgdG8gY2hlY2sg
Zm9yIGRpZmZlcmVuY2VzIGFuZCB3YXJuIHVzIGFzIHNvb24gYXMgcG9zc2libGUNCj4gc28gdGhh
dCB3ZSB3b3VsZCBkbyB0aGUgY29weSwgdGVzdCBpZiBpdCBkb2Vzbid0IGJyZWFrIHdoYXQgd2Ug
dXNlLCBldGMuDQo+IA0KPiBJLmUuIHdlIHdvdWxkbid0IGJlIHB1dHRpbmcgYW55IG5ldyBidXJk
ZW4gb24gdGhlICJrZXJuZWwgcGVvcGxlIiwgaS5lLg0KPiB0aGUgYnVyZGVuIG9mIGhhdmluZyB0
byBjaGVjayB0aGF0IGNoYW5nZXMgdGhleSBtYWtlIGRvbid0IGJyZWFrIHRvb2xzLw0KPiBsaXZp
bmcgY29kZSwgbm9yIGFueSBvdXQgb2YgdGhlIGJsdWUgYnJlYWthZ2Ugb24gdG9vbHMvIGZvciB0
b29scy8NCj4gZGV2ZWxvcGVycyB0byBmaXggd2hlbiBjaGFuZ2VzIGFyZSBtYWRlIG9uIHRoZSBr
ZXJuZWwgInNpZGUiIC0tLS0tDQo+IC0tLQ0KPiANCj4gVGhlICJzdG9wIHNoYXJpbmcgZGlyZWN0
bHkgc3R1ZmYgd2l0aCB0aGUga2VybmVsIiBzdGFuY2Ugd2FzIHRha2VuIGFmdGVyDQo+IGEgcmVw
b3J0IGZyb20gTGludXMgYWJvdXQgYnJlYWthZ2UgZHVlIHRvIHRvb2xzLyB1c2luZyBrZXJuZWwg
ZmlsZXMNCj4gZGlyZWN0bHkgYW5kIHRoZW4gYSBjaGFuZ2UgbWFkZSBpbiBzb21lIFJDVSBmaWxl
cyBicm9rZSB0aGUgdG9vbHMvcGVyZi8NCj4gYnVpbGQsIGV2ZW4gd2l0aCB0b29scy9wZXJmLyBu
b3QgdXNpbmcgYW55dGhpbmcgUkNVIHJlbGF0ZWQgc28gZmFyLg0KPiANCj4gTG9va2luZyBhdCB0
b29scy9wZXJmL01BTklGRVNULCB0aGUgZmlsZSB1c2VkIHRvIGNyZWF0ZSBhIGRldGFjaGVkDQo+
IHRhcmJhbGwgc28gdGhhdCBwZXJmIGNhbiBiZSBidWlsdCBvdXRzaWRlIHRoZSBrZXJuZWwgc291
cmNlcyB0aGVyZSBhcmUNCj4gc3RpbGwgc29tZSBrZXJuZWwgc291cmNlIGZpbGVzIGxpc3RlZCwg
YnV0IHRob3NlIHByb2JhYmx5IG5lZWQgdG8gYmUNCj4gY29waWVkIHRvby4uLg0KDQpPSywgc28g
bGV0IHRoaXMgYXBwbHkuDQoNCkFja2VkLWJ5OiBNYXNhbWkgSGlyYW1hdHN1IDxtYXNhbWkuaGly
YW1hdHN1LnB0QGhpdGFjaGkuY29tPg0KDQpBbmQgYWxzbyB3ZSdsbCBuZWVkIGEgdGVzdGNhc2Ug
Zm9yIHRoaXMuDQoNClRoYW5rIHlvdSwNCg0KPiANCj4gLSBBcm5hbGRvDQo+IA0KPiA+IFRoYW5r
IHlvdSwNCj4gPg0KPiA+ID4NCj4gPiA+IGdldF9hcmNoX3JlZ3N0cigpIHN3aXRjaGVzIHRvIHJl
Z29mZnNldF90YWJsZSBhbmQgdGhlIG9sZCBzdHJpbmcgdGFibGUNCj4gPiA+IGlzIGRyb3BwZWQu
DQo+ID4gPg0KPiA+ID4gU2lnbmVkLW9mZi1ieTogV2FuZyBOYW4gPHdhbmduYW4wQGh1YXdlaS5j
b20+DQo+ID4gPiBTaWduZWQtb2ZmLWJ5OiBIZSBLdWFuZyA8aGVrdWFuZ0BodWF3ZWkuY29tPg0K
PiA+ID4gQ2M6IEFsZXhlaSBTdGFyb3ZvaXRvdiA8YXN0QHBsdW1ncmlkLmNvbT4NCj4gPiA+IENj
OiBCcmVuZGFuIEdyZWdnIDxicmVuZGFuLmQuZ3JlZ2dAZ21haWwuY29tPg0KPiA+ID4gQ2M6IERh
bmllbCBCb3JrbWFubiA8ZGFuaWVsQGlvZ2VhcmJveC5uZXQ+DQo+ID4gPiBDYzogRGF2aWQgQWhl
cm4gPGRzYWhlcm5AZ21haWwuY29tPg0KPiA+ID4gQ2M6IEhlIEt1YW5nIDxoZWt1YW5nQGh1YXdl
aS5jb20+DQo+ID4gPiBDYzogSmlyaSBPbHNhIDxqb2xzYUBrZXJuZWwub3JnPg0KPiA+ID4gQ2M6
IEthaXh1IFhpYSA8eGlha2FpeHVAaHVhd2VpLmNvbT4NCj4gPiA+IENjOiBNYXNhbWkgSGlyYW1h
dHN1IDxtYXNhbWkuaGlyYW1hdHN1LnB0QGhpdGFjaGkuY29tPg0KPiA+ID4gQ2M6IE5hbWh5dW5n
IEtpbSA8bmFtaHl1bmdAa2VybmVsLm9yZz4NCj4gPiA+IENjOiBQYXVsIE1hY2tlcnJhcyA8cGF1
bHVzQHNhbWJhLm9yZz4NCj4gPiA+IENjOiBQZXRlciBaaWpsc3RyYSA8YS5wLnppamxzdHJhQGNo
ZWxsby5ubD4NCj4gPiA+IENjOiBaZWZhbiBMaSA8bGl6ZWZhbkBodWF3ZWkuY29tPg0KPiA+ID4g
Q2M6IHBpM29yYW1hQDE2My5jb20NCj4gPiA+IENjOiBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8g
PGFjbWVAcmVkaGF0LmNvbT4NCj4gPiA+IC0tLQ0KPiA+ID4gIHRvb2xzL3BlcmYvYXJjaC94ODYv
TWFrZWZpbGUgICAgICAgICAgfCAgIDEgKw0KPiA+ID4gIHRvb2xzL3BlcmYvYXJjaC94ODYvdXRp
bC9CdWlsZCAgICAgICAgfCAgIDEgKw0KPiA+ID4gIHRvb2xzL3BlcmYvYXJjaC94ODYvdXRpbC9k
d2FyZi1yZWdzLmMgfCAxMjIgKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLQ0KPiA+
ID4gIDMgZmlsZXMgY2hhbmdlZCwgOTAgaW5zZXJ0aW9ucygrKSwgMzQgZGVsZXRpb25zKC0pDQo+
ID4gPg0KPiA+ID4gZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYXJjaC94ODYvTWFrZWZpbGUgYi90
b29scy9wZXJmL2FyY2gveDg2L01ha2VmaWxlDQo+ID4gPiBpbmRleCAyMTMyMmUwLi4wOWJhOTIz
IDEwMDY0NA0KPiA+ID4gLS0tIGEvdG9vbHMvcGVyZi9hcmNoL3g4Ni9NYWtlZmlsZQ0KPiA+ID4g
KysrIGIvdG9vbHMvcGVyZi9hcmNoL3g4Ni9NYWtlZmlsZQ0KPiA+ID4gQEAgLTIsMyArMiw0IEBA
IGlmbmRlZiBOT19EV0FSRg0KPiA+ID4gIFBFUkZfSEFWRV9EV0FSRl9SRUdTIDo9IDENCj4gPiA+
ICBlbmRpZg0KPiA+ID4gIEhBVkVfS1ZNX1NUQVRfU1VQUE9SVCA6PSAxDQo+ID4gPiArUEVSRl9I
QVZFX0FSQ0hfUkVHU19RVUVSWV9SRUdJU1RFUl9PRkZTRVQgOj0gMQ0KPiA+ID4gZGlmZiAtLWdp
dCBhL3Rvb2xzL3BlcmYvYXJjaC94ODYvdXRpbC9CdWlsZCBiL3Rvb2xzL3BlcmYvYXJjaC94ODYv
dXRpbC9CdWlsZA0KPiA+ID4gaW5kZXggMmM1NWUxYi4uZDRkMWYyMyAxMDA2NDQNCj4gPiA+IC0t
LSBhL3Rvb2xzL3BlcmYvYXJjaC94ODYvdXRpbC9CdWlsZA0KPiA+ID4gKysrIGIvdG9vbHMvcGVy
Zi9hcmNoL3g4Ni91dGlsL0J1aWxkDQo+ID4gPiBAQCAtNCw2ICs0LDcgQEAgbGlicGVyZi15ICs9
IHBtdS5vDQo+ID4gPiAgbGlicGVyZi15ICs9IGt2bS1zdGF0Lm8NCj4gPiA+DQo+ID4gPiAgbGli
cGVyZi0kKENPTkZJR19EV0FSRikgKz0gZHdhcmYtcmVncy5vDQo+ID4gPiArbGlicGVyZi0kKENP
TkZJR19CUEZfUFJPTE9HVUUpICs9IGR3YXJmLXJlZ3Mubw0KPiA+ID4NCj4gPiA+ICBsaWJwZXJm
LSQoQ09ORklHX0xJQlVOV0lORCkgICAgICAgICAgKz0gdW53aW5kLWxpYnVud2luZC5vDQo+ID4g
PiAgbGlicGVyZi0kKENPTkZJR19MSUJEV19EV0FSRl9VTldJTkQpICs9IHVud2luZC1saWJkdy5v
DQo+ID4gPiBkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL3g4Ni91dGlsL2R3YXJmLXJlZ3Mu
YyBiL3Rvb2xzL3BlcmYvYXJjaC94ODYvdXRpbC9kd2FyZi1yZWdzLmMNCj4gPiA+IGluZGV4IGEw
OGRlMGEuLmRlNWI5MzYgMTAwNjQ0DQo+ID4gPiAtLS0gYS90b29scy9wZXJmL2FyY2gveDg2L3V0
aWwvZHdhcmYtcmVncy5jDQo+ID4gPiArKysgYi90b29scy9wZXJmL2FyY2gveDg2L3V0aWwvZHdh
cmYtcmVncy5jDQo+ID4gPiBAQCAtMjEsNTUgKzIxLDEwOSBAQA0KPiA+ID4gICAqLw0KPiA+ID4N
Cj4gPiA+ICAjaW5jbHVkZSA8c3RkZGVmLmg+DQo+ID4gPiArI2luY2x1ZGUgPGVycm5vLmg+IC8q
IGZvciBFSU5WQUwgKi8NCj4gPiA+ICsjaW5jbHVkZSA8c3RyaW5nLmg+IC8qIGZvciBzdHJjbXAg
Ki8NCj4gPiA+ICsjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+IC8qIGZvciBzdHJ1Y3QgcHRfcmVn
cyAqLw0KPiA+ID4gKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4gLyogZm9yIG9mZnNldG9mICov
DQo+ID4gPiAgI2luY2x1ZGUgPGR3YXJmLXJlZ3MuaD4NCj4gPiA+DQo+ID4gPiAgLyoNCj4gPiA+
IC0gKiBHZW5lcmljIGR3YXJmIGFuYWx5c2lzIGhlbHBlcnMNCj4gPiA+ICsgKiBTZWUgYXJjaC94
ODYva2VybmVsL3B0cmFjZS5jLg0KPiA+ID4gKyAqIERpZmZlcmVudCBmcm9tIGl0Og0KPiA+ID4g
KyAqDQo+ID4gPiArICogIC0gU2luY2Ugc3RydWN0IHB0X3JlZ3MgaXMgZGVmaW5lZCBkaWZmZXJl
bnRseSBmb3IgdXNlciBhbmQga2VybmVsLA0KPiA+ID4gKyAqICAgIGJ1dCB3ZSB3YW50IHRvIHVz
ZSAnYXgsIGJ4JyBpbnN0ZWFkIG9mICdyYXgsIHJieCcgKHdoaWNoIGlzIHN0cnVjdA0KPiA+ID4g
KyAqICAgIGZpZWxkIG5hbWUgb2YgdXNlcidzIHB0X3JlZ3MpLCB3ZSBtYWtlIFJFR19PRkZTRVRf
TkFNRSB0byBhY2NlcHQNCj4gPiA+ICsgKiAgICBib3RoIHN0cmluZyBuYW1lIGFuZCByZWcgZmll
bGQgbmFtZS4NCj4gPiA+ICsgKg0KPiA+ID4gKyAqICAtIFNpbmNlIGFjY2Vzc2luZyB4ODZfMzIn
cyBwdF9yZWdzIGZyb20geDg2XzY0IGJ1aWxkaW5nIGlzIGRpZmZpY3VsdA0KPiA+ID4gKyAqICAg
IGFuZCB2aXNlIHZlcnNhLCB3ZSBzaW1wbHkgZmlsbCBvZmZzZXQgd2l0aCAtMSwgc28NCj4gPiA+
ICsgKiAgICBnZXRfYXJjaF9yZWdzdHIoKSBzdGlsbCB3b3JrcyBidXQgcmVnc19xdWVyeV9yZWdp
c3Rlcl9vZmZzZXQoKQ0KPiA+ID4gKyAqICAgIHJldHVybnMgZXJyb3IuDQo+ID4gPiArICogICAg
VGhlIG9ubHkgaW5jb252ZW5pZW5jZSBjYXVzZWQgYnkgaXQgbm93IGlzIHRoYXQgd2UgYXJlIG5v
dCBhbGxvd2VkDQo+ID4gPiArICogICAgdG8gZ2VuZXJhdGUgQlBGIHByb2xvZ3VlIGZvciBhIHg4
Nl82NCBrZXJuZWwgaWYgcGVyZiBpcyBidWlsdCBmb3INCj4gPiA+ICsgKiAgICB4ODZfMzIuIFRo
aXMgaXMgcmVhbGx5IGEgcmFyZSB1c2VjYXNlLg0KPiA+ID4gKyAqDQo+ID4gPiArICogIC0gT3Jk
ZXIgaXMgZGlmZmVyZW50IGZyb20ga2VybmVsJ3MgcHRyYWNlLmMgZm9yIGdldF9hcmNoX3JlZ3N0
cigpLCB3aGljaA0KPiA+ID4gKyAqICAgIGlzIGRlZmluZWQgYnkgZHdhcmYuDQo+ID4gPiAgICov
DQo+ID4gPg0KPiA+ID4gLSNkZWZpbmUgWDg2XzMyX01BWF9SRUdTIDgNCj4gPiA+IC1jb25zdCBj
aGFyICp4ODZfMzJfcmVnc190YWJsZVtYODZfMzJfTUFYX1JFR1NdID0gew0KPiA+ID4gLQkiJWF4
IiwNCj4gPiA+IC0JIiVjeCIsDQo+ID4gPiAtCSIlZHgiLA0KPiA+ID4gLQkiJWJ4IiwNCj4gPiA+
IC0JIiRzdGFjayIsCS8qIFN0YWNrIGFkZHJlc3MgaW5zdGVhZCBvZiAlc3AgKi8NCj4gPiA+IC0J
IiVicCIsDQo+ID4gPiAtCSIlc2kiLA0KPiA+ID4gLQkiJWRpIiwNCj4gPiA+ICtzdHJ1Y3QgcHRf
cmVnc19vZmZzZXQgew0KPiA+ID4gKwljb25zdCBjaGFyICpuYW1lOw0KPiA+ID4gKwlpbnQgb2Zm
c2V0Ow0KPiA+ID4gK307DQo+ID4gPiArDQo+ID4gPiArI2RlZmluZSBSRUdfT0ZGU0VUX0VORCB7
Lm5hbWUgPSBOVUxMLCAub2Zmc2V0ID0gMH0NCj4gPiA+ICsNCj4gPiA+ICsjaWZkZWYgX194ODZf
NjRfXw0KPiA+ID4gKyMgZGVmaW5lIFJFR19PRkZTRVRfTkFNRV82NChuLCByKSB7Lm5hbWUgPSBu
LCAub2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHIpfQ0KPiA+ID4gKyMgZGVmaW5l
IFJFR19PRkZTRVRfTkFNRV8zMihuLCByKSB7Lm5hbWUgPSBuLCAub2Zmc2V0ID0gLTF9DQo+ID4g
PiArI2Vsc2UNCj4gPiA+ICsjIGRlZmluZSBSRUdfT0ZGU0VUX05BTUVfNjQobiwgcikgey5uYW1l
ID0gbiwgLm9mZnNldCA9IC0xfQ0KPiA+ID4gKyMgZGVmaW5lIFJFR19PRkZTRVRfTkFNRV8zMihu
LCByKSB7Lm5hbWUgPSBuLCAub2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHIpfQ0K
PiA+ID4gKyNlbmRpZg0KPiA+ID4gKw0KPiA+ID4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHRfcmVn
c19vZmZzZXQgeDg2XzMyX3JlZ29mZnNldF90YWJsZVtdID0gew0KPiA+ID4gKwlSRUdfT0ZGU0VU
X05BTUVfMzIoIiVheCIsCWVheCksDQo+ID4gPiArCVJFR19PRkZTRVRfTkFNRV8zMigiJWN4IiwJ
ZWN4KSwNCj4gPiA+ICsJUkVHX09GRlNFVF9OQU1FXzMyKCIlZHgiLAllZHgpLA0KPiA+ID4gKwlS
RUdfT0ZGU0VUX05BTUVfMzIoIiVieCIsCWVieCksDQo+ID4gPiArCVJFR19PRkZTRVRfTkFNRV8z
MigiJHN0YWNrIiwJZXNwKSwJLyogU3RhY2sgYWRkcmVzcyBpbnN0ZWFkIG9mICVzcCAqLw0KPiA+
ID4gKwlSRUdfT0ZGU0VUX05BTUVfMzIoIiVicCIsCWVicCksDQo+ID4gPiArCVJFR19PRkZTRVRf
TkFNRV8zMigiJXNpIiwJZXNpKSwNCj4gPiA+ICsJUkVHX09GRlNFVF9OQU1FXzMyKCIlZGkiLAll
ZGkpLA0KPiA+ID4gKwlSRUdfT0ZGU0VUX0VORCwNCj4gPiA+ICB9Ow0KPiA+ID4NCj4gPiA+IC0j
ZGVmaW5lIFg4Nl82NF9NQVhfUkVHUyAxNg0KPiA+ID4gLWNvbnN0IGNoYXIgKng4Nl82NF9yZWdz
X3RhYmxlW1g4Nl82NF9NQVhfUkVHU10gPSB7DQo+ID4gPiAtCSIlYXgiLA0KPiA+ID4gLQkiJWR4
IiwNCj4gPiA+IC0JIiVjeCIsDQo+ID4gPiAtCSIlYngiLA0KPiA+ID4gLQkiJXNpIiwNCj4gPiA+
IC0JIiVkaSIsDQo+ID4gPiAtCSIlYnAiLA0KPiA+ID4gLQkiJXNwIiwNCj4gPiA+IC0JIiVyOCIs
DQo+ID4gPiAtCSIlcjkiLA0KPiA+ID4gLQkiJXIxMCIsDQo+ID4gPiAtCSIlcjExIiwNCj4gPiA+
IC0JIiVyMTIiLA0KPiA+ID4gLQkiJXIxMyIsDQo+ID4gPiAtCSIlcjE0IiwNCj4gPiA+IC0JIiVy
MTUiLA0KPiA+ID4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHRfcmVnc19vZmZzZXQgeDg2XzY0X3Jl
Z29mZnNldF90YWJsZVtdID0gew0KPiA+ID4gKwlSRUdfT0ZGU0VUX05BTUVfNjQoIiVheCIsCXJh
eCksDQo+ID4gPiArCVJFR19PRkZTRVRfTkFNRV82NCgiJWR4IiwJcmR4KSwNCj4gPiA+ICsJUkVH
X09GRlNFVF9OQU1FXzY0KCIlY3giLAlyY3gpLA0KPiA+ID4gKwlSRUdfT0ZGU0VUX05BTUVfNjQo
IiVieCIsCXJieCksDQo+ID4gPiArCVJFR19PRkZTRVRfTkFNRV82NCgiJXNpIiwJcnNpKSwNCj4g
PiA+ICsJUkVHX09GRlNFVF9OQU1FXzY0KCIlZGkiLAlyZGkpLA0KPiA+ID4gKwlSRUdfT0ZGU0VU
X05BTUVfNjQoIiVicCIsCXJicCksDQo+ID4gPiArCVJFR19PRkZTRVRfTkFNRV82NCgiJXNwIiwJ
cnNwKSwNCj4gPiA+ICsJUkVHX09GRlNFVF9OQU1FXzY0KCIlcjgiLAlyOCksDQo+ID4gPiArCVJF
R19PRkZTRVRfTkFNRV82NCgiJXI5IiwJcjkpLA0KPiA+ID4gKwlSRUdfT0ZGU0VUX05BTUVfNjQo
IiVyMTAiLAlyMTApLA0KPiA+ID4gKwlSRUdfT0ZGU0VUX05BTUVfNjQoIiVyMTEiLAlyMTEpLA0K
PiA+ID4gKwlSRUdfT0ZGU0VUX05BTUVfNjQoIiVyMTIiLAlyMTIpLA0KPiA+ID4gKwlSRUdfT0ZG
U0VUX05BTUVfNjQoIiVyMTMiLAlyMTMpLA0KPiA+ID4gKwlSRUdfT0ZGU0VUX05BTUVfNjQoIiVy
MTQiLAlyMTQpLA0KPiA+ID4gKwlSRUdfT0ZGU0VUX05BTUVfNjQoIiVyMTUiLAlyMTUpLA0KPiA+
ID4gKwlSRUdfT0ZGU0VUX0VORCwNCj4gPiA+ICB9Ow0KPiA+ID4NCj4gPiA+ICAvKiBUT0RPOiBz
d2l0Y2hpbmcgYnkgZHdhcmYgYWRkcmVzcyBzaXplICovDQo+ID4gPiAgI2lmZGVmIF9feDg2XzY0
X18NCj4gPiA+IC0jZGVmaW5lIEFSQ0hfTUFYX1JFR1MgWDg2XzY0X01BWF9SRUdTDQo+ID4gPiAt
I2RlZmluZSBhcmNoX3JlZ3NfdGFibGUgeDg2XzY0X3JlZ3NfdGFibGUNCj4gPiA+ICsjZGVmaW5l
IHJlZ29mZnNldF90YWJsZSB4ODZfNjRfcmVnb2Zmc2V0X3RhYmxlDQo+ID4gPiAgI2Vsc2UNCj4g
PiA+IC0jZGVmaW5lIEFSQ0hfTUFYX1JFR1MgWDg2XzMyX01BWF9SRUdTDQo+ID4gPiAtI2RlZmlu
ZSBhcmNoX3JlZ3NfdGFibGUgeDg2XzMyX3JlZ3NfdGFibGUNCj4gPiA+ICsjZGVmaW5lIHJlZ29m
ZnNldF90YWJsZSB4ODZfMzJfcmVnb2Zmc2V0X3RhYmxlDQo+ID4gPiAgI2VuZGlmDQo+ID4gPg0K
PiA+ID4gKy8qIE1pbnVzIDEgZm9yIHRoZSBlbmRpbmcgUkVHX09GRlNFVF9FTkQgKi8NCj4gPiA+
ICsjZGVmaW5lIEFSQ0hfTUFYX1JFR1MgKChzaXplb2YocmVnb2Zmc2V0X3RhYmxlKSAvIHNpemVv
ZihyZWdvZmZzZXRfdGFibGVbMF0pKSAtIDEpDQo+ID4gPiArDQo+ID4gPiAgLyogUmV0dXJuIGFy
Y2hpdGVjdHVyZSBkZXBlbmRlbnQgcmVnaXN0ZXIgc3RyaW5nIChmb3Iga3Byb2JlLXRyYWNlcikg
Ki8NCj4gPiA+ICBjb25zdCBjaGFyICpnZXRfYXJjaF9yZWdzdHIodW5zaWduZWQgaW50IG4pDQo+
ID4gPiAgew0KPiA+ID4gLQlyZXR1cm4gKG4gPCBBUkNIX01BWF9SRUdTKSA/IGFyY2hfcmVnc190
YWJsZVtuXSA6IE5VTEw7DQo+ID4gPiArCXJldHVybiAobiA8IEFSQ0hfTUFYX1JFR1MpID8gcmVn
b2Zmc2V0X3RhYmxlW25dLm5hbWUgOiBOVUxMOw0KPiA+ID4gK30NCj4gPiA+ICsNCj4gPiA+ICsv
KiBSZXVzZSBjb2RlIGZyb20gYXJjaC94ODYva2VybmVsL3B0cmFjZS5jICovDQo+ID4gPiArLyoq
DQo+ID4gPiArICogcmVnc19xdWVyeV9yZWdpc3Rlcl9vZmZzZXQoKSAtIHF1ZXJ5IHJlZ2lzdGVy
IG9mZnNldCBmcm9tIGl0cyBuYW1lDQo+ID4gPiArICogQG5hbWU6CXRoZSBuYW1lIG9mIGEgcmVn
aXN0ZXINCj4gPiA+ICsgKg0KPiA+ID4gKyAqIHJlZ3NfcXVlcnlfcmVnaXN0ZXJfb2Zmc2V0KCkg
cmV0dXJucyB0aGUgb2Zmc2V0IG9mIGEgcmVnaXN0ZXIgaW4gc3RydWN0DQo+ID4gPiArICogcHRf
cmVncyBmcm9tIGl0cyBuYW1lLiBJZiB0aGUgbmFtZSBpcyBpbnZhbGlkLCB0aGlzIHJldHVybnMg
LUVJTlZBTDsNCj4gPiA+ICsgKi8NCj4gPiA+ICtpbnQgcmVnc19xdWVyeV9yZWdpc3Rlcl9vZmZz
ZXQoY29uc3QgY2hhciAqbmFtZSkNCj4gPiA+ICt7DQo+ID4gPiArCWNvbnN0IHN0cnVjdCBwdF9y
ZWdzX29mZnNldCAqcm9mZjsNCj4gPiA+ICsJZm9yIChyb2ZmID0gcmVnb2Zmc2V0X3RhYmxlOyBy
b2ZmLT5uYW1lICE9IE5VTEw7IHJvZmYrKykNCj4gPiA+ICsJCWlmICghc3RyY21wKHJvZmYtPm5h
bWUsIG5hbWUpKQ0KPiA+ID4gKwkJCXJldHVybiByb2ZmLT5vZmZzZXQ7DQo+ID4gPiArCXJldHVy
biAtRUlOVkFMOw0KPiA+ID4gIH0NCj4gPiA+IC0tDQo+ID4gPiAxLjguMy40DQo+ID4NCg==
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

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


#1219712 — Re: [PATCH 23/31] perf tools: Introduce regs_query_register_offset() for x86

From"Wangnan (F)" <wangnan0@huawei.com>
Date2015-09-06 08:10 +0200
SubjectRe: [PATCH 23/31] perf tools: Introduce regs_query_register_offset() for x86
Message-ID<q5Bjk-79Y-25@gated-at.bofh.it>
In reply to#1216941

On 2015/9/1 23:54, 平松雅巳 / HIRAMATU,MASAMI wrote:
>> From: Arnaldo Carvalho de Melo [mailto:acme@redhat.com]
>>
>> Em Tue, Sep 01, 2015 at 11:47:41AM +0000, 平松雅巳 / HIRAMATU,MASAMI escreveu:
>>>> From: Wang Nan [mailto:wangnan0@huawei.com]
>>>>
>>>> regs_query_register_offset() is a helper function which converts
>>>> register name like "%rax" to offset of a register in 'struct pt_regs',
>>>> which is required by BPF prologue generator. Since the function is
>>>> identical, try to reuse the code in arch/x86/kernel/ptrace.c.
>>>>
>>>> Comment inside dwarf-regs.c list the differences between this
>>>> implementation and kernel code.
>>> Hmm, this also introduce a duplication of the code...
>>> It might be a good time to move them into arch/x86/lib/ and
>>> reuse it directly from perf code.
>> It is strange to, having tried sharing stuff directly from the kernel,
>> to be now in a position where I advocate against it...
>>
>> Copy'n'pasting what I said in another message:
>>
>> -----
>> We would go back to sharing stuff with the kernel, but this time around
>> we would be using something that everybody knows is being shared, which
>> doesn't elliminates the possibility that at some point changes made with
>> the kernel in mind would break the tools/ using code.
>>
>> Perhaps it is better to keep copying what we want and introduce
>> infrastructure to check for differences and warn us as soon as possible
>> so that we would do the copy, test if it doesn't break what we use, etc.
>>
>> I.e. we wouldn't be putting any new burden on the "kernel people", i.e.
>> the burden of having to check that changes they make don't break tools/
>> living code, nor any out of the blue breakage on tools/ for tools/
>> developers to fix when changes are made on the kernel "side" -----
>> ---
>>
>> The "stop sharing directly stuff with the kernel" stance was taken after
>> a report from Linus about breakage due to tools/ using kernel files
>> directly and then a change made in some RCU files broke the tools/perf/
>> build, even with tools/perf/ not using anything RCU related so far.
>>
>> Looking at tools/perf/MANIFEST, the file used to create a detached
>> tarball so that perf can be built outside the kernel sources there are
>> still some kernel source files listed, but those probably need to be
>> copied too...
> OK, so let this apply.
>
> Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
>
> And also we'll need a testcase for this.

I created a testcase for the whole BPF prologue, so I think this can be 
covered?

I'll post them by replying this mail.

Thank you.

> Thank you,
>
>> - Arnaldo
>>
>>> Thank you,
>>>
>>>> get_arch_regstr() switches to regoffset_table and the old string table
>>>> is dropped.
>>>>
>>>> Signed-off-by: Wang Nan <wangnan0@huawei.com>
>>>> Signed-off-by: He Kuang <hekuang@huawei.com>
>>>> Cc: Alexei Starovoitov <ast@plumgrid.com>
>>>> Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
>>>> Cc: Daniel Borkmann <daniel@iogearbox.net>
>>>> Cc: David Ahern <dsahern@gmail.com>
>>>> Cc: He Kuang <hekuang@huawei.com>
>>>> Cc: Jiri Olsa <jolsa@kernel.org>
>>>> Cc: Kaixu Xia <xiakaixu@huawei.com>
>>>> Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
>>>> Cc: Namhyung Kim <namhyung@kernel.org>
>>>> Cc: Paul Mackerras <paulus@samba.org>
>>>> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
>>>> Cc: Zefan Li <lizefan@huawei.com>
>>>> Cc: pi3orama@163.com
>>>> Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
>>>> ---
>>>>   tools/perf/arch/x86/Makefile          |   1 +
>>>>   tools/perf/arch/x86/util/Build        |   1 +
>>>>   tools/perf/arch/x86/util/dwarf-regs.c | 122 ++++++++++++++++++++++++----------
>>>>   3 files changed, 90 insertions(+), 34 deletions(-)
>>>>
>>>> diff --git a/tools/perf/arch/x86/Makefile b/tools/perf/arch/x86/Makefile
>>>> index 21322e0..09ba923 100644
>>>> --- a/tools/perf/arch/x86/Makefile
>>>> +++ b/tools/perf/arch/x86/Makefile
>>>> @@ -2,3 +2,4 @@ ifndef NO_DWARF
>>>>   PERF_HAVE_DWARF_REGS := 1
>>>>   endif
>>>>   HAVE_KVM_STAT_SUPPORT := 1
>>>> +PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET := 1
>>>> diff --git a/tools/perf/arch/x86/util/Build b/tools/perf/arch/x86/util/Build
>>>> index 2c55e1b..d4d1f23 100644
>>>> --- a/tools/perf/arch/x86/util/Build
>>>> +++ b/tools/perf/arch/x86/util/Build
>>>> @@ -4,6 +4,7 @@ libperf-y += pmu.o
>>>>   libperf-y += kvm-stat.o
>>>>
>>>>   libperf-$(CONFIG_DWARF) += dwarf-regs.o
>>>> +libperf-$(CONFIG_BPF_PROLOGUE) += dwarf-regs.o
>>>>
>>>>   libperf-$(CONFIG_LIBUNWIND)          += unwind-libunwind.o
>>>>   libperf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
>>>> diff --git a/tools/perf/arch/x86/util/dwarf-regs.c b/tools/perf/arch/x86/util/dwarf-regs.c
>>>> index a08de0a..de5b936 100644
>>>> --- a/tools/perf/arch/x86/util/dwarf-regs.c
>>>> +++ b/tools/perf/arch/x86/util/dwarf-regs.c
>>>> @@ -21,55 +21,109 @@
>>>>    */
>>>>
>>>>   #include <stddef.h>
>>>> +#include <errno.h> /* for EINVAL */
>>>> +#include <string.h> /* for strcmp */
>>>> +#include <linux/ptrace.h> /* for struct pt_regs */
>>>> +#include <linux/kernel.h> /* for offsetof */
>>>>   #include <dwarf-regs.h>
>>>>
>>>>   /*
>>>> - * Generic dwarf analysis helpers
>>>> + * See arch/x86/kernel/ptrace.c.
>>>> + * Different from it:
>>>> + *
>>>> + *  - Since struct pt_regs is defined differently for user and kernel,
>>>> + *    but we want to use 'ax, bx' instead of 'rax, rbx' (which is struct
>>>> + *    field name of user's pt_regs), we make REG_OFFSET_NAME to accept
>>>> + *    both string name and reg field name.
>>>> + *
>>>> + *  - Since accessing x86_32's pt_regs from x86_64 building is difficult
>>>> + *    and vise versa, we simply fill offset with -1, so
>>>> + *    get_arch_regstr() still works but regs_query_register_offset()
>>>> + *    returns error.
>>>> + *    The only inconvenience caused by it now is that we are not allowed
>>>> + *    to generate BPF prologue for a x86_64 kernel if perf is built for
>>>> + *    x86_32. This is really a rare usecase.
>>>> + *
>>>> + *  - Order is different from kernel's ptrace.c for get_arch_regstr(), which
>>>> + *    is defined by dwarf.
>>>>    */
>>>>
>>>> -#define X86_32_MAX_REGS 8
>>>> -const char *x86_32_regs_table[X86_32_MAX_REGS] = {
>>>> -	"%ax",
>>>> -	"%cx",
>>>> -	"%dx",
>>>> -	"%bx",
>>>> -	"$stack",	/* Stack address instead of %sp */
>>>> -	"%bp",
>>>> -	"%si",
>>>> -	"%di",
>>>> +struct pt_regs_offset {
>>>> +	const char *name;
>>>> +	int offset;
>>>> +};
>>>> +
>>>> +#define REG_OFFSET_END {.name = NULL, .offset = 0}
>>>> +
>>>> +#ifdef __x86_64__
>>>> +# define REG_OFFSET_NAME_64(n, r) {.name = n, .offset = offsetof(struct pt_regs, r)}
>>>> +# define REG_OFFSET_NAME_32(n, r) {.name = n, .offset = -1}
>>>> +#else
>>>> +# define REG_OFFSET_NAME_64(n, r) {.name = n, .offset = -1}
>>>> +# define REG_OFFSET_NAME_32(n, r) {.name = n, .offset = offsetof(struct pt_regs, r)}
>>>> +#endif
>>>> +
>>>> +static const struct pt_regs_offset x86_32_regoffset_table[] = {
>>>> +	REG_OFFSET_NAME_32("%ax",	eax),
>>>> +	REG_OFFSET_NAME_32("%cx",	ecx),
>>>> +	REG_OFFSET_NAME_32("%dx",	edx),
>>>> +	REG_OFFSET_NAME_32("%bx",	ebx),
>>>> +	REG_OFFSET_NAME_32("$stack",	esp),	/* Stack address instead of %sp */
>>>> +	REG_OFFSET_NAME_32("%bp",	ebp),
>>>> +	REG_OFFSET_NAME_32("%si",	esi),
>>>> +	REG_OFFSET_NAME_32("%di",	edi),
>>>> +	REG_OFFSET_END,
>>>>   };
>>>>
>>>> -#define X86_64_MAX_REGS 16
>>>> -const char *x86_64_regs_table[X86_64_MAX_REGS] = {
>>>> -	"%ax",
>>>> -	"%dx",
>>>> -	"%cx",
>>>> -	"%bx",
>>>> -	"%si",
>>>> -	"%di",
>>>> -	"%bp",
>>>> -	"%sp",
>>>> -	"%r8",
>>>> -	"%r9",
>>>> -	"%r10",
>>>> -	"%r11",
>>>> -	"%r12",
>>>> -	"%r13",
>>>> -	"%r14",
>>>> -	"%r15",
>>>> +static const struct pt_regs_offset x86_64_regoffset_table[] = {
>>>> +	REG_OFFSET_NAME_64("%ax",	rax),
>>>> +	REG_OFFSET_NAME_64("%dx",	rdx),
>>>> +	REG_OFFSET_NAME_64("%cx",	rcx),
>>>> +	REG_OFFSET_NAME_64("%bx",	rbx),
>>>> +	REG_OFFSET_NAME_64("%si",	rsi),
>>>> +	REG_OFFSET_NAME_64("%di",	rdi),
>>>> +	REG_OFFSET_NAME_64("%bp",	rbp),
>>>> +	REG_OFFSET_NAME_64("%sp",	rsp),
>>>> +	REG_OFFSET_NAME_64("%r8",	r8),
>>>> +	REG_OFFSET_NAME_64("%r9",	r9),
>>>> +	REG_OFFSET_NAME_64("%r10",	r10),
>>>> +	REG_OFFSET_NAME_64("%r11",	r11),
>>>> +	REG_OFFSET_NAME_64("%r12",	r12),
>>>> +	REG_OFFSET_NAME_64("%r13",	r13),
>>>> +	REG_OFFSET_NAME_64("%r14",	r14),
>>>> +	REG_OFFSET_NAME_64("%r15",	r15),
>>>> +	REG_OFFSET_END,
>>>>   };
>>>>
>>>>   /* TODO: switching by dwarf address size */
>>>>   #ifdef __x86_64__
>>>> -#define ARCH_MAX_REGS X86_64_MAX_REGS
>>>> -#define arch_regs_table x86_64_regs_table
>>>> +#define regoffset_table x86_64_regoffset_table
>>>>   #else
>>>> -#define ARCH_MAX_REGS X86_32_MAX_REGS
>>>> -#define arch_regs_table x86_32_regs_table
>>>> +#define regoffset_table x86_32_regoffset_table
>>>>   #endif
>>>>
>>>> +/* 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)
>>>>   {
>>>> -	return (n < ARCH_MAX_REGS) ? arch_regs_table[n] : NULL;
>>>> +	return (n < ARCH_MAX_REGS) ? regoffset_table[n].name : NULL;
>>>> +}
>>>> +
>>>> +/* Reuse code from arch/x86/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
>>>> + * 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.3.4


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

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


#1219714 — [PATCH] perf test: Enforce LLVM test, add kbuild test

FromWang Nan <wangnan0@huawei.com>
Date2015-09-06 08:10 +0200
Subject[PATCH] perf test: Enforce LLVM test, add kbuild test
Message-ID<q5Bjk-79Y-31@gated-at.bofh.it>
In reply to#1219712
This patch enforces existing LLVM test, makes it compile more than one
BPF source file. The compiled results are stored, can be used for other
testcases. Except the first testcase (named LLVM_TESTCASE_BASE), failures
of other test cases are not considered as failure of the whole test.

Adds a kbuild testcase to check whether kernel headers can be correctly
found.

For example:

 # perf test LLVM

   38: Test LLVM searching and compiling                        : (llvm.kbuild-dir can be fixed) Ok

Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Alexei Starovoitov <ast@plumgrid.com>
Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: David Ahern <dsahern@gmail.com>
Cc: He Kuang <hekuang@huawei.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kaixu Xia <xiakaixu@huawei.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
---
 tools/perf/tests/Build                    |  11 ++-
 tools/perf/tests/bpf-script-example.c     |   4 +
 tools/perf/tests/bpf-script-test-kbuild.c |  21 ++++
 tools/perf/tests/bpf.c                    |   3 +-
 tools/perf/tests/llvm.c                   | 154 ++++++++++++++++++++++--------
 tools/perf/tests/llvm.h                   |  10 +-
 6 files changed, 156 insertions(+), 47 deletions(-)
 create mode 100644 tools/perf/tests/bpf-script-test-kbuild.c

diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build
index 5cfb420..2bd5f37 100644
--- a/tools/perf/tests/Build
+++ b/tools/perf/tests/Build
@@ -32,17 +32,24 @@ perf-y += sample-parsing.o
 perf-y += parse-no-sample-id-all.o
 perf-y += kmod-path.o
 perf-y += thread-map.o
-perf-y += llvm.o llvm-src.o
+perf-y += llvm.o llvm-src-base.o llvm-src-kbuild.o
 perf-y += bpf.o
 perf-y += topology.o
 
-$(OUTPUT)tests/llvm-src.c: tests/bpf-script-example.c
+$(OUTPUT)tests/llvm-src-base.c: tests/bpf-script-example.c
 	$(call rule_mkdir)
 	$(Q)echo '#include <tests/llvm.h>' > $@
 	$(Q)echo 'const char test_llvm__bpf_prog[] =' >> $@
 	$(Q)sed -e 's/"/\\"/g' -e 's/\(.*\)/"\1\\n"/g' $< >> $@
 	$(Q)echo ';' >> $@
 
+$(OUTPUT)tests/llvm-src-kbuild.c: tests/bpf-script-test-kbuild.c
+	$(call rule_mkdir)
+	$(Q)echo '#include <tests/llvm.h>' > $@
+	$(Q)echo 'const char test_llvm__bpf_test_kbuild_prog[] =' >> $@
+	$(Q)sed -e 's/"/\\"/g' -e 's/\(.*\)/"\1\\n"/g' $< >> $@
+	$(Q)echo ';' >> $@
+
 perf-$(CONFIG_X86) += perf-time-to-tsc.o
 ifdef CONFIG_AUXTRACE
 perf-$(CONFIG_X86) += insn-x86.o
diff --git a/tools/perf/tests/bpf-script-example.c b/tools/perf/tests/bpf-script-example.c
index 410a70b..0ec9c2c 100644
--- a/tools/perf/tests/bpf-script-example.c
+++ b/tools/perf/tests/bpf-script-example.c
@@ -1,3 +1,7 @@
+/*
+ * bpf-script-example.c
+ * Test basic LLVM building
+ */
 #ifndef LINUX_VERSION_CODE
 # error Need LINUX_VERSION_CODE
 # error Example: for 4.2 kernel, put 'clang-opt="-DLINUX_VERSION_CODE=0x40200" into llvm section of ~/.perfconfig'
diff --git a/tools/perf/tests/bpf-script-test-kbuild.c b/tools/perf/tests/bpf-script-test-kbuild.c
new file mode 100644
index 0000000..a11f589
--- /dev/null
+++ b/tools/perf/tests/bpf-script-test-kbuild.c
@@ -0,0 +1,21 @@
+/*
+ * bpf-script-test-kbuild.c
+ * Test include from kernel header
+ */
+#ifndef LINUX_VERSION_CODE
+# error Need LINUX_VERSION_CODE
+# error Example: for 4.2 kernel, put 'clang-opt="-DLINUX_VERSION_CODE=0x40200" into llvm section of ~/.perfconfig'
+#endif
+#define SEC(NAME) __attribute__((section(NAME), used))
+
+#include <uapi/linux/fs.h>
+#include <uapi/asm/ptrace.h>
+
+SEC("func=vfs_llseek")
+int bpf_func__vfs_llseek(struct pt_regs *ctx)
+{
+	return 0;
+}
+
+char _license[] SEC("license") = "GPL";
+int _version SEC("version") = LINUX_VERSION_CODE;
diff --git a/tools/perf/tests/bpf.c b/tools/perf/tests/bpf.c
index e256c12..64aaab68 100644
--- a/tools/perf/tests/bpf.c
+++ b/tools/perf/tests/bpf.c
@@ -143,7 +143,8 @@ int test__bpf(void)
 		return TEST_SKIP;
 	}
 
-	test_llvm__fetch_bpf_obj(&obj_buf, &obj_buf_sz);
+	test_llvm__fetch_bpf_obj(&obj_buf, &obj_buf_sz, LLVM_TESTCASE_BASE);
+
 	if (!obj_buf || !obj_buf_sz) {
 		if (verbose == 0)
 			fprintf(stderr, " (fix 'perf test LLVM' first)");
diff --git a/tools/perf/tests/llvm.c b/tools/perf/tests/llvm.c
index fd5fdb0..75cd99f 100644
--- a/tools/perf/tests/llvm.c
+++ b/tools/perf/tests/llvm.c
@@ -9,6 +9,22 @@
 #include "debug.h"
 #include "llvm.h"
 
+#define SHARED_BUF_INIT_SIZE	(1 << 20)
+struct llvm_testcase {
+	const char *source;
+	const char *errmsg;
+	struct test_llvm__bpf_result *result;
+	bool tried;
+} llvm_testcases[NR_LLVM_TESTCASES + 1] = {
+	[LLVM_TESTCASE_BASE]	= {.source = test_llvm__bpf_prog,
+				   .errmsg = "Basic LLVM compiling failed",
+				   .tried = false},
+	[LLVM_TESTCASE_KBUILD]	= {.source = test_llvm__bpf_test_kbuild_prog,
+				   .errmsg = "llvm.kbuild-dir can be fixed",
+				   .tried = false},
+	{.source = NULL}
+};
+
 static int perf_config_cb(const char *var, const char *val,
 			  void *arg __maybe_unused)
 {
@@ -36,7 +52,7 @@ static int test__bpf_parsing(void *obj_buf __maybe_unused,
 #endif
 
 static char *
-compose_source(void)
+compose_source(const char *raw_source)
 {
 	struct utsname utsname;
 	int version, patchlevel, sublevel, err;
@@ -56,25 +72,27 @@ compose_source(void)
 
 	version_code = (version << 16) + (patchlevel << 8) + sublevel;
 	err = asprintf(&code, "#define LINUX_VERSION_CODE 0x%08lx;\n%s",
-		       version_code, test_llvm__bpf_prog);
+		       version_code, raw_source);
 	if (err < 0)
 		return NULL;
 
 	return code;
 }
 
-#define SHARED_BUF_INIT_SIZE	(1 << 20)
-struct test_llvm__bpf_result *p_test_llvm__bpf_result;
 
-int test__llvm(void)
+static int __test__llvm(int i)
 {
-	char *tmpl_new, *clang_opt_new;
 	void *obj_buf;
 	size_t obj_buf_sz;
 	int err, old_verbose;
-	char *source;
+	const char *tmpl_old, *clang_opt_old;
+	char *tmpl_new, *clang_opt_new, *source;
+	const char *raw_source = llvm_testcases[i].source;
+	struct test_llvm__bpf_result *result = llvm_testcases[i].result;
 
 	perf_config(perf_config_cb, NULL);
+	clang_opt_old = llvm_param.clang_opt;
+	tmpl_old = llvm_param.clang_bpf_cmd_template;
 
 	/*
 	 * Skip this test if user's .perfconfig doesn't set [llvm] section
@@ -99,15 +117,17 @@ int test__llvm(void)
 	if (!llvm_param.clang_opt)
 		llvm_param.clang_opt = strdup("");
 
-	source = compose_source();
+	source = compose_source(raw_source);
 	if (!source) {
 		pr_err("Failed to compose source code\n");
 		return -1;
 	}
 
 	/* Quote __EOF__ so strings in source won't be expanded by shell */
-	err = asprintf(&tmpl_new, "cat << '__EOF__' | %s\n%s\n__EOF__\n",
-		       llvm_param.clang_bpf_cmd_template, source);
+	err = asprintf(&tmpl_new, "cat << '__EOF__' | %s %s \n%s\n__EOF__\n",
+		       llvm_param.clang_bpf_cmd_template,
+		       !old_verbose ? "2>/dev/null" : "",
+		       source);
 	free(source);
 	source = NULL;
 	if (err < 0) {
@@ -123,73 +143,123 @@ int test__llvm(void)
 	llvm_param.clang_opt = clang_opt_new;
 	err = llvm__compile_bpf("-", &obj_buf, &obj_buf_sz);
 
+	free((void *)llvm_param.clang_bpf_cmd_template);
+	free((void *)llvm_param.clang_opt);
+	llvm_param.clang_bpf_cmd_template = tmpl_old;
+	llvm_param.clang_opt = clang_opt_old;
+
 	verbose = old_verbose;
-	if (err) {
-		if (!verbose)
-			fprintf(stderr, " (use -v to see error message)");
+	if (err)
 		return -1;
-	}
 
 	err = test__bpf_parsing(obj_buf, obj_buf_sz);
-	if (!err && p_test_llvm__bpf_result) {
+	if (!err && result) {
 		if (obj_buf_sz > SHARED_BUF_INIT_SIZE) {
 			pr_err("Resulting object too large\n");
 		} else {
-			p_test_llvm__bpf_result->size = obj_buf_sz;
-			memcpy(p_test_llvm__bpf_result->object,
-			       obj_buf, obj_buf_sz);
+			result->size = obj_buf_sz;
+			memcpy(result->object, obj_buf, obj_buf_sz);
 		}
 	}
 	free(obj_buf);
 	return err;
 }
 
+int test__llvm(void)
+{
+	int i, ret;
+
+	for (i = 0; llvm_testcases[i].source; i++) {
+		ret = __test__llvm(i);
+		if (i == 0 && ret) {
+			/*
+			 * First testcase tests basic LLVM compiling. If it
+			 * fails, no need to check others.
+			 */
+			if (!verbose)
+				fprintf(stderr, " (use -v to see error message)");
+			return ret;
+		} else if (ret) {
+			if (!verbose && llvm_testcases[i].errmsg)
+				fprintf(stderr, " (%s)", llvm_testcases[i].errmsg);
+			return 0;
+		}
+	}
+	return 0;
+}
+
 void test__llvm_prepare(void)
 {
-	p_test_llvm__bpf_result = mmap(NULL, SHARED_BUF_INIT_SIZE,
-				       PROT_READ | PROT_WRITE,
-				       MAP_SHARED | MAP_ANONYMOUS, -1, 0);
-	if (!p_test_llvm__bpf_result)
-		return;
-	memset((void *)p_test_llvm__bpf_result, '\0', SHARED_BUF_INIT_SIZE);
+	int i;
+
+	for (i = 0; llvm_testcases[i].source; i++) {
+		struct test_llvm__bpf_result *result;
+
+		result = mmap(NULL, SHARED_BUF_INIT_SIZE,
+			      PROT_READ | PROT_WRITE,
+			      MAP_SHARED | MAP_ANONYMOUS, -1, 0);
+		if (!result)
+			return;
+		memset((void *)result, '\0', SHARED_BUF_INIT_SIZE);
+
+		llvm_testcases[i].result = result;
+	}
 }
 
 void test__llvm_cleanup(void)
 {
-	unsigned long boundary, buf_end;
+	int i;
 
-	if (!p_test_llvm__bpf_result)
-		return;
-	if (p_test_llvm__bpf_result->size == 0) {
-		munmap((void *)p_test_llvm__bpf_result, SHARED_BUF_INIT_SIZE);
-		p_test_llvm__bpf_result = NULL;
-		return;
-	}
+	for (i = 0; llvm_testcases[i].source; i++) {
+		struct test_llvm__bpf_result *result;
+		unsigned long boundary, buf_end;
 
-	buf_end = (unsigned long)p_test_llvm__bpf_result + SHARED_BUF_INIT_SIZE;
+		result = llvm_testcases[i].result;
+		llvm_testcases[i].tried = true;
 
-	boundary = (unsigned long)(p_test_llvm__bpf_result);
-	boundary += p_test_llvm__bpf_result->size;
-	boundary = (boundary + (page_size - 1)) &
+		if (!result)
+			continue;
+
+		if (result->size == 0) {
+			munmap((void *)result, SHARED_BUF_INIT_SIZE);
+			result = NULL;
+			llvm_testcases[i].result = NULL;
+			continue;
+		}
+
+		buf_end = (unsigned long)result + SHARED_BUF_INIT_SIZE;
+
+		boundary = (unsigned long)(result);
+		boundary += result->size;
+		boundary = (boundary + (page_size - 1)) &
 			(~((unsigned long)page_size - 1));
-	munmap((void *)boundary, buf_end - boundary);
+		munmap((void *)boundary, buf_end - boundary);
+	}
 }
 
 void
-test_llvm__fetch_bpf_obj(void **p_obj_buf, size_t *p_obj_buf_sz)
+test_llvm__fetch_bpf_obj(void **p_obj_buf, size_t *p_obj_buf_sz, int index)
 {
+	struct test_llvm__bpf_result *result;
+
 	*p_obj_buf = NULL;
 	*p_obj_buf_sz = 0;
 
-	if (!p_test_llvm__bpf_result) {
+	if (index > NR_LLVM_TESTCASES)
+		return;
+
+	result = llvm_testcases[index].result;
+
+	if (!result && !llvm_testcases[index].tried) {
 		test__llvm_prepare();
 		test__llvm();
 		test__llvm_cleanup();
 	}
 
-	if (!p_test_llvm__bpf_result)
+	result = llvm_testcases[index].result;
+	if (!result)
 		return;
 
-	*p_obj_buf = p_test_llvm__bpf_result->object;
-	*p_obj_buf_sz = p_test_llvm__bpf_result->size;
+	*p_obj_buf = result->object;
+	*p_obj_buf_sz = result->size;
 }
diff --git a/tools/perf/tests/llvm.h b/tools/perf/tests/llvm.h
index 2fd7ed6..78ec01d 100644
--- a/tools/perf/tests/llvm.h
+++ b/tools/perf/tests/llvm.h
@@ -8,8 +8,14 @@ struct test_llvm__bpf_result {
 	char object[];
 };
 
-extern struct test_llvm__bpf_result *p_test_llvm__bpf_result;
 extern const char test_llvm__bpf_prog[];
-void test_llvm__fetch_bpf_obj(void **p_obj_buf, size_t *p_obj_buf_sz);
+extern const char test_llvm__bpf_test_kbuild_prog[];
+
+enum test_llvm__testcase {
+	LLVM_TESTCASE_BASE,
+	LLVM_TESTCASE_KBUILD,
+	NR_LLVM_TESTCASES,
+};
+void test_llvm__fetch_bpf_obj(void **p_obj_buf, size_t *p_obj_buf_sz, int index);
 
 #endif
-- 
1.8.3.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

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


#1217631 — Re: [PATCH 22/31] perf tools: Add BPF_PROLOGUE config options for further patches

FromNamhyung Kim <namhyung@kernel.org>
Date2015-09-02 16:20 +0200
SubjectRe: [PATCH 22/31] perf tools: Add BPF_PROLOGUE config options for further patches
Message-ID<q4h3k-7tc-21@gated-at.bofh.it>
In reply to#1216634
On Tue, Sep 01, 2015 at 06:59:48AM +0000, Wang Nan wrote:
> If both LIBBPF and DWARF are detected, it is possible to create prologue
> for eBPF programs to help them accessing kernel data. HAVE_BPF_PROLOGUE
> and CONFIG_BPF_PROLOGUE is added as flags for this feature.
> 
> PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET indicates an architecture
> supports converting name of a register to its offset in
> 'struct pt_regs'. Without this support, BPF_PROLOGUE should be turned off.
> 
> HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET is introduced as the corresponding
> CFLAGS of PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET.
> 
> Signed-off-by: Wang Nan <wangnan0@huawei.com>
> Cc: Alexei Starovoitov <ast@plumgrid.com>
> Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
> Cc: Daniel Borkmann <daniel@iogearbox.net>
> Cc: David Ahern <dsahern@gmail.com>
> Cc: He Kuang <hekuang@huawei.com>
> Cc: Jiri Olsa <jolsa@kernel.org>
> Cc: Kaixu Xia <xiakaixu@huawei.com>
> Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
> Cc: Namhyung Kim <namhyung@kernel.org>
> Cc: Paul Mackerras <paulus@samba.org>
> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
> Cc: Zefan Li <lizefan@huawei.com>
> Cc: pi3orama@163.com
> Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
> Link: http://lkml.kernel.org/n/1436445342-1402-33-git-send-email-wangnan0@huawei.com
> [wawngnan:
>  - Introduce new CFLAGS to control BPF prologue and arch_get_reg_info()
>    separately.
>  - Rename ARCH_GET_REG_INFO to ARCH_REGS_QUERY_REGISTER_OFFSET,
>    arch_get_reg_info() to regs_query_register_offset(), change its API accordingly
>    to make it similar to kernel's regs_query_register_offset().
> ]
> ---
>  tools/perf/config/Makefile           | 17 +++++++++++++++++
>  tools/perf/util/include/dwarf-regs.h |  8 ++++++++
>  2 files changed, 25 insertions(+)
> 
> diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile
> index 38a4144..33785a1 100644
> --- a/tools/perf/config/Makefile
> +++ b/tools/perf/config/Makefile
> @@ -110,6 +110,11 @@ FEATURE_CHECK_CFLAGS-bpf = -I. -I$(srctree)/tools/include -I$(srctree)/arch/$(AR
>  # include ARCH specific config
>  -include $(src-perf)/arch/$(ARCH)/Makefile
>  
> +ifneq ($(origin PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET), undefined)

Why not just using

  ifdef PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET

?


> +  CFLAGS += -DHAVE_ARCH_REGS_QUERY_REGISTER_OFFSET
> +endif
> +
> +
>  include $(src-perf)/config/utilities.mak
>  
>  ifeq ($(call get-executable,$(FLEX)),)
> @@ -314,6 +319,18 @@ ifndef NO_LIBELF
>        CFLAGS += -DHAVE_LIBBPF_SUPPORT
>        $(call detected,CONFIG_LIBBPF)
>      endif
> +
> +    ifndef NO_DWARF
> +      ifneq ($(origin PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET), undefined)

Ditto.

Thanks,
Namhyung


> +        CFLAGS += -DHAVE_BPF_PROLOGUE
> +        $(call detected,CONFIG_BPF_PROLOGUE)
> +      else
> +        msg := $(warning BPF prologue is not supported by architecture $(ARCH), missing regs_query_register_offset());
> +      endif
> +    else
> +      msg := $(warning DWARF support is off, BPF prologue is disabled);
> +    endif
> +
>    endif # NO_LIBBPF
>  endif # NO_LIBELF
>  
> diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include/dwarf-regs.h
> index 8f14965..07c644e 100644
> --- a/tools/perf/util/include/dwarf-regs.h
> +++ b/tools/perf/util/include/dwarf-regs.h
> @@ -5,4 +5,12 @@
>  const char *get_arch_regstr(unsigned int n);
>  #endif
>  
> +#ifdef HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET
> +/*
> + * Arch should support fetching the offset of a register in pt_regs
> + * by its name. See kernel's regs_query_register_offset in
> + * arch/xxx/kernel/ptrace.c.
> + */
> +int regs_query_register_offset(const char *name);
> +#endif
>  #endif
> -- 
> 1.8.3.4
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web