Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf/powerpc: Add support for unwinding perf-stackdump

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>

authored by

Chandan Kumar and committed by
Michael Ellerman
c4522469 17ed7c38

+98
+1
tools/perf/arch/powerpc/util/Build
··· 5 5 6 6 libperf-$(CONFIG_DWARF) += dwarf-regs.o 7 7 libperf-$(CONFIG_DWARF) += skip-callchain-idx.o 8 + libperf-$(CONFIG_LIBUNWIND) += unwind-libunwind.o
+96
tools/perf/arch/powerpc/util/unwind-libunwind.c
··· 1 + /* 2 + * Copyright 2016 Chandan Kumar, IBM Corporation. 3 + * 4 + * This program is free software; you can redistribute it and/or 5 + * modify it under the terms of the GNU General Public License 6 + * as published by the Free Software Foundation; either version 7 + * 2 of the License, or (at your option) any later version. 8 + */ 9 + 10 + #include <errno.h> 11 + #include <libunwind.h> 12 + #include <asm/perf_regs.h> 13 + #include "../../util/unwind.h" 14 + #include "../../util/debug.h" 15 + 16 + int libunwind__arch_reg_id(int regnum) 17 + { 18 + switch (regnum) { 19 + case UNW_PPC64_R0: 20 + return PERF_REG_POWERPC_R0; 21 + case UNW_PPC64_R1: 22 + return PERF_REG_POWERPC_R1; 23 + case UNW_PPC64_R2: 24 + return PERF_REG_POWERPC_R2; 25 + case UNW_PPC64_R3: 26 + return PERF_REG_POWERPC_R3; 27 + case UNW_PPC64_R4: 28 + return PERF_REG_POWERPC_R4; 29 + case UNW_PPC64_R5: 30 + return PERF_REG_POWERPC_R5; 31 + case UNW_PPC64_R6: 32 + return PERF_REG_POWERPC_R6; 33 + case UNW_PPC64_R7: 34 + return PERF_REG_POWERPC_R7; 35 + case UNW_PPC64_R8: 36 + return PERF_REG_POWERPC_R8; 37 + case UNW_PPC64_R9: 38 + return PERF_REG_POWERPC_R9; 39 + case UNW_PPC64_R10: 40 + return PERF_REG_POWERPC_R10; 41 + case UNW_PPC64_R11: 42 + return PERF_REG_POWERPC_R11; 43 + case UNW_PPC64_R12: 44 + return PERF_REG_POWERPC_R12; 45 + case UNW_PPC64_R13: 46 + return PERF_REG_POWERPC_R13; 47 + case UNW_PPC64_R14: 48 + return PERF_REG_POWERPC_R14; 49 + case UNW_PPC64_R15: 50 + return PERF_REG_POWERPC_R15; 51 + case UNW_PPC64_R16: 52 + return PERF_REG_POWERPC_R16; 53 + case UNW_PPC64_R17: 54 + return PERF_REG_POWERPC_R17; 55 + case UNW_PPC64_R18: 56 + return PERF_REG_POWERPC_R18; 57 + case UNW_PPC64_R19: 58 + return PERF_REG_POWERPC_R19; 59 + case UNW_PPC64_R20: 60 + return PERF_REG_POWERPC_R20; 61 + case UNW_PPC64_R21: 62 + return PERF_REG_POWERPC_R21; 63 + case UNW_PPC64_R22: 64 + return PERF_REG_POWERPC_R22; 65 + case UNW_PPC64_R23: 66 + return PERF_REG_POWERPC_R23; 67 + case UNW_PPC64_R24: 68 + return PERF_REG_POWERPC_R24; 69 + case UNW_PPC64_R25: 70 + return PERF_REG_POWERPC_R25; 71 + case UNW_PPC64_R26: 72 + return PERF_REG_POWERPC_R26; 73 + case UNW_PPC64_R27: 74 + return PERF_REG_POWERPC_R27; 75 + case UNW_PPC64_R28: 76 + return PERF_REG_POWERPC_R28; 77 + case UNW_PPC64_R29: 78 + return PERF_REG_POWERPC_R29; 79 + case UNW_PPC64_R30: 80 + return PERF_REG_POWERPC_R30; 81 + case UNW_PPC64_R31: 82 + return PERF_REG_POWERPC_R31; 83 + case UNW_PPC64_LR: 84 + return PERF_REG_POWERPC_LINK; 85 + case UNW_PPC64_CTR: 86 + return PERF_REG_POWERPC_CTR; 87 + case UNW_PPC64_XER: 88 + return PERF_REG_POWERPC_XER; 89 + case UNW_PPC64_NIP: 90 + return PERF_REG_POWERPC_NIP; 91 + default: 92 + pr_err("unwind: invalid reg id %d\n", regnum); 93 + return -EINVAL; 94 + } 95 + return -EINVAL; 96 + }
+1
tools/perf/config/Makefile
··· 26 26 # Additional ARCH settings for ppc 27 27 ifeq ($(ARCH),powerpc) 28 28 NO_PERF_REGS := 0 29 + LIBUNWIND_LIBS := -lunwind -lunwind-ppc64 29 30 endif 30 31 31 32 # Additional ARCH settings for x86