perf tools powerpc: Add support for generating bpf prologue
authorNaveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Thu, 5 May 2016 15:23:19 +0000 (20:53 +0530)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 6 May 2016 00:03:58 +0000 (21:03 -0300)
Generalize existing macros to serve the purpose.

Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Cc: Ian Munsie <imunsie@au1.ibm.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Wang Nan <wangnan0@huawei.com>
Cc: linuxppc-dev@lists.ozlabs.org
Link: http://lkml.kernel.org/r/1462461799-17518-1-git-send-email-naveen.n.rao@linux.vnet.ibm.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/arch/powerpc/Makefile
tools/perf/arch/powerpc/util/dwarf-regs.c

index 56e05f126ad8793d25bb1a70ce3dac5f100d3b3a..cc3930904d68951db327a4b2dbcc2841c71e106d 100644 (file)
@@ -3,4 +3,5 @@ PERF_HAVE_DWARF_REGS := 1
 endif
 
 HAVE_KVM_STAT_SUPPORT := 1
+PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET := 1
 PERF_HAVE_JITDUMP := 1
index 733151cdf46e08397fae0f293c73222cc54ef21e..41bdf9530d821d6b14d7bd1eb007e2ddda06a5a9 100644 (file)
  */
 
 #include <stddef.h>
+#include <errno.h>
+#include <string.h>
 #include <dwarf-regs.h>
-
+#include <linux/ptrace.h>
+#include <linux/kernel.h>
+#include "util.h"
 
 struct pt_regs_dwarfnum {
        const char *name;
        unsigned int dwarfnum;
+       unsigned int ptregs_offset;
 };
 
-#define STR(s) #s
-#define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num}
-#define GPR_DWARFNUM_NAME(num) \
-       {.name = STR(%gpr##num), .dwarfnum = num}
-#define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}
+#define REG_DWARFNUM_NAME(r, num)                                      \
+               {.name = STR(%)STR(r), .dwarfnum = num,                 \
+               .ptregs_offset = offsetof(struct pt_regs, r)}
+#define GPR_DWARFNUM_NAME(num)                                         \
+               {.name = STR(%gpr##num), .dwarfnum = num,               \
+               .ptregs_offset = offsetof(struct pt_regs, gpr[num])}
+#define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0, .ptregs_offset = 0}
 
 /*
  * Reference:
@@ -61,12 +68,12 @@ static const struct pt_regs_dwarfnum regdwarfnum_table[] = {
        GPR_DWARFNUM_NAME(29),
        GPR_DWARFNUM_NAME(30),
        GPR_DWARFNUM_NAME(31),
-       REG_DWARFNUM_NAME("%msr",   66),
-       REG_DWARFNUM_NAME("%ctr",   109),
-       REG_DWARFNUM_NAME("%link",  108),
-       REG_DWARFNUM_NAME("%xer",   101),
-       REG_DWARFNUM_NAME("%dar",   119),
-       REG_DWARFNUM_NAME("%dsisr", 118),
+       REG_DWARFNUM_NAME(msr,   66),
+       REG_DWARFNUM_NAME(ctr,   109),
+       REG_DWARFNUM_NAME(link,  108),
+       REG_DWARFNUM_NAME(xer,   101),
+       REG_DWARFNUM_NAME(dar,   119),
+       REG_DWARFNUM_NAME(dsisr, 118),
        REG_DWARFNUM_END,
 };
 
@@ -86,3 +93,12 @@ const char *get_arch_regstr(unsigned int n)
                        return roff->name;
        return NULL;
 }
+
+int regs_query_register_offset(const char *name)
+{
+       const struct pt_regs_dwarfnum *roff;
+       for (roff = regdwarfnum_table; roff->name != NULL; roff++)
+               if (!strcmp(roff->name, name))
+                       return roff->ptregs_offset;
+       return -EINVAL;
+}