Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1215708 > unrolled thread
| Started by | Wang Nan <wangnan0@huawei.com> |
|---|---|
| First post | 2015-08-29 06:30 +0200 |
| Last post | 2015-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.
[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
| From | Wang Nan <wangnan0@huawei.com> |
|---|---|
| Date | 2015-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]
| From | Arnaldo Carvalho de Melo <acme@redhat.com> |
|---|---|
| Date | 2015-08-31 22:40 +0200 |
| Subject | Re: [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]
| From | Wang Nan <wangnan0@huawei.com> |
|---|---|
| Date | 2015-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]
| From | Wang Nan <wangnan0@huawei.com> |
|---|---|
| Date | 2015-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]
| From | 平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com> |
|---|---|
| Date | 2015-09-01 13:50 +0200 |
| Subject | RE: [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]
| From | "Wangnan (F)" <wangnan0@huawei.com> |
|---|---|
| Date | 2015-09-01 16:00 +0200 |
| Subject | Re: [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]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2015-09-01 17:00 +0200 |
| Subject | Re: [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]
| From | Arnaldo Carvalho de Melo <acme@redhat.com> |
|---|---|
| Date | 2015-09-01 16:20 +0200 |
| Subject | Re: [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]
| From | 平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com> |
|---|---|
| Date | 2015-09-01 18:00 +0200 |
| Subject | RE: [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]
| From | "Wangnan (F)" <wangnan0@huawei.com> |
|---|---|
| Date | 2015-09-06 08:10 +0200 |
| Subject | Re: [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]
| From | Wang Nan <wangnan0@huawei.com> |
|---|---|
| Date | 2015-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]
| From | Namhyung Kim <namhyung@kernel.org> |
|---|---|
| Date | 2015-09-02 16:20 +0200 |
| Subject | Re: [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