perf/powerpc: Add support for unwinding perf-stackdump
authorChandan Kumar <chandan.kumar@linux.vnet.ibm.com>
Thu, 28 Apr 2016 09:31:09 +0000 (15:01 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 11 May 2016 11:54:06 +0000 (21:54 +1000)
Adds support for unwinding user stack dump by linking with libunwind.

Signed-off-by: Chandan Kumar <chandan.kumar@linux.vnet.ibm.com>
Reviewed-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Tested-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Acked-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
tools/perf/arch/powerpc/util/Build
tools/perf/arch/powerpc/util/unwind-libunwind.c [new file with mode: 0644]
tools/perf/config/Makefile

index 9ee33501659215b7a75ec968838f73206bb8caaa..90ad64b231cd821abe8756ed92d68d7c4c367804 100644 (file)
@@ -5,3 +5,4 @@ libperf-y += perf_regs.o
 
 libperf-$(CONFIG_DWARF) += dwarf-regs.o
 libperf-$(CONFIG_DWARF) += skip-callchain-idx.o
+libperf-$(CONFIG_LIBUNWIND) += unwind-libunwind.o
diff --git a/tools/perf/arch/powerpc/util/unwind-libunwind.c b/tools/perf/arch/powerpc/util/unwind-libunwind.c
new file mode 100644 (file)
index 0000000..9e15f92
--- /dev/null
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2016 Chandan Kumar, IBM Corporation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <errno.h>
+#include <libunwind.h>
+#include <asm/perf_regs.h>
+#include "../../util/unwind.h"
+#include "../../util/debug.h"
+
+int libunwind__arch_reg_id(int regnum)
+{
+       switch (regnum) {
+       case UNW_PPC64_R0:
+               return PERF_REG_POWERPC_R0;
+       case UNW_PPC64_R1:
+               return PERF_REG_POWERPC_R1;
+       case UNW_PPC64_R2:
+               return PERF_REG_POWERPC_R2;
+       case UNW_PPC64_R3:
+               return PERF_REG_POWERPC_R3;
+       case UNW_PPC64_R4:
+               return PERF_REG_POWERPC_R4;
+       case UNW_PPC64_R5:
+               return PERF_REG_POWERPC_R5;
+       case UNW_PPC64_R6:
+               return PERF_REG_POWERPC_R6;
+       case UNW_PPC64_R7:
+               return PERF_REG_POWERPC_R7;
+       case UNW_PPC64_R8:
+               return PERF_REG_POWERPC_R8;
+       case UNW_PPC64_R9:
+               return PERF_REG_POWERPC_R9;
+       case UNW_PPC64_R10:
+               return PERF_REG_POWERPC_R10;
+       case UNW_PPC64_R11:
+               return PERF_REG_POWERPC_R11;
+       case UNW_PPC64_R12:
+               return PERF_REG_POWERPC_R12;
+       case UNW_PPC64_R13:
+               return PERF_REG_POWERPC_R13;
+       case UNW_PPC64_R14:
+               return PERF_REG_POWERPC_R14;
+       case UNW_PPC64_R15:
+               return PERF_REG_POWERPC_R15;
+       case UNW_PPC64_R16:
+               return PERF_REG_POWERPC_R16;
+       case UNW_PPC64_R17:
+               return PERF_REG_POWERPC_R17;
+       case UNW_PPC64_R18:
+               return PERF_REG_POWERPC_R18;
+       case UNW_PPC64_R19:
+               return PERF_REG_POWERPC_R19;
+       case UNW_PPC64_R20:
+               return PERF_REG_POWERPC_R20;
+       case UNW_PPC64_R21:
+               return PERF_REG_POWERPC_R21;
+       case UNW_PPC64_R22:
+               return PERF_REG_POWERPC_R22;
+       case UNW_PPC64_R23:
+               return PERF_REG_POWERPC_R23;
+       case UNW_PPC64_R24:
+               return PERF_REG_POWERPC_R24;
+       case UNW_PPC64_R25:
+               return PERF_REG_POWERPC_R25;
+       case UNW_PPC64_R26:
+               return PERF_REG_POWERPC_R26;
+       case UNW_PPC64_R27:
+               return PERF_REG_POWERPC_R27;
+       case UNW_PPC64_R28:
+               return PERF_REG_POWERPC_R28;
+       case UNW_PPC64_R29:
+               return PERF_REG_POWERPC_R29;
+       case UNW_PPC64_R30:
+               return PERF_REG_POWERPC_R30;
+       case UNW_PPC64_R31:
+               return PERF_REG_POWERPC_R31;
+       case UNW_PPC64_LR:
+               return PERF_REG_POWERPC_LINK;
+       case UNW_PPC64_CTR:
+               return PERF_REG_POWERPC_CTR;
+       case UNW_PPC64_XER:
+               return PERF_REG_POWERPC_XER;
+       case UNW_PPC64_NIP:
+               return PERF_REG_POWERPC_NIP;
+       default:
+               pr_err("unwind: invalid reg id %d\n", regnum);
+               return -EINVAL;
+       }
+       return -EINVAL;
+}
index eda1cfbbfb2da38f0d30acde5695a2df9a0eab75..220536cf2b599ce1bd7e613263b60e6773e55ddb 100644 (file)
@@ -26,6 +26,7 @@ NO_PERF_REGS := 1
 # Additional ARCH settings for ppc
 ifeq ($(ARCH),powerpc)
   NO_PERF_REGS := 0
+  LIBUNWIND_LIBS := -lunwind -lunwind-ppc64
 endif
 
 # Additional ARCH settings for x86