ARM: perf: wire up perf_regs and unwind support for ARM
This patch hooks in the perf_regs and libunwind code for ARM. Cc: Jean Pihet <jean.pihet@linaro.org> Signed-off-by: Will Deacon <will.deacon@arm.com>
This commit is contained in:
parent
49863894db
commit
7495f3742d
4 changed files with 110 additions and 2 deletions
|
@ -2,3 +2,6 @@ ifndef NO_DWARF
|
||||||
PERF_HAVE_DWARF_REGS := 1
|
PERF_HAVE_DWARF_REGS := 1
|
||||||
LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/dwarf-regs.o
|
LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/dwarf-regs.o
|
||||||
endif
|
endif
|
||||||
|
ifndef NO_LIBUNWIND
|
||||||
|
LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/unwind.o
|
||||||
|
endif
|
||||||
|
|
54
tools/perf/arch/arm/include/perf_regs.h
Normal file
54
tools/perf/arch/arm/include/perf_regs.h
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
#ifndef ARCH_PERF_REGS_H
|
||||||
|
#define ARCH_PERF_REGS_H
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "../../util/types.h"
|
||||||
|
#include <asm/perf_regs.h>
|
||||||
|
|
||||||
|
#define PERF_REGS_MASK ((1ULL << PERF_REG_ARM_MAX) - 1)
|
||||||
|
#define PERF_REG_IP PERF_REG_ARM_PC
|
||||||
|
#define PERF_REG_SP PERF_REG_ARM_SP
|
||||||
|
|
||||||
|
static inline const char *perf_reg_name(int id)
|
||||||
|
{
|
||||||
|
switch (id) {
|
||||||
|
case PERF_REG_ARM_R0:
|
||||||
|
return "r0";
|
||||||
|
case PERF_REG_ARM_R1:
|
||||||
|
return "r1";
|
||||||
|
case PERF_REG_ARM_R2:
|
||||||
|
return "r2";
|
||||||
|
case PERF_REG_ARM_R3:
|
||||||
|
return "r3";
|
||||||
|
case PERF_REG_ARM_R4:
|
||||||
|
return "r4";
|
||||||
|
case PERF_REG_ARM_R5:
|
||||||
|
return "r5";
|
||||||
|
case PERF_REG_ARM_R6:
|
||||||
|
return "r6";
|
||||||
|
case PERF_REG_ARM_R7:
|
||||||
|
return "r7";
|
||||||
|
case PERF_REG_ARM_R8:
|
||||||
|
return "r8";
|
||||||
|
case PERF_REG_ARM_R9:
|
||||||
|
return "r9";
|
||||||
|
case PERF_REG_ARM_R10:
|
||||||
|
return "r10";
|
||||||
|
case PERF_REG_ARM_FP:
|
||||||
|
return "fp";
|
||||||
|
case PERF_REG_ARM_IP:
|
||||||
|
return "ip";
|
||||||
|
case PERF_REG_ARM_SP:
|
||||||
|
return "sp";
|
||||||
|
case PERF_REG_ARM_LR:
|
||||||
|
return "lr";
|
||||||
|
case PERF_REG_ARM_PC:
|
||||||
|
return "pc";
|
||||||
|
default:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ARCH_PERF_REGS_H */
|
48
tools/perf/arch/arm/util/unwind.c
Normal file
48
tools/perf/arch/arm/util/unwind.c
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <libunwind.h>
|
||||||
|
#include "perf_regs.h"
|
||||||
|
#include "../../util/unwind.h"
|
||||||
|
|
||||||
|
int unwind__arch_reg_id(int regnum)
|
||||||
|
{
|
||||||
|
switch (regnum) {
|
||||||
|
case UNW_ARM_R0:
|
||||||
|
return PERF_REG_ARM_R0;
|
||||||
|
case UNW_ARM_R1:
|
||||||
|
return PERF_REG_ARM_R1;
|
||||||
|
case UNW_ARM_R2:
|
||||||
|
return PERF_REG_ARM_R2;
|
||||||
|
case UNW_ARM_R3:
|
||||||
|
return PERF_REG_ARM_R3;
|
||||||
|
case UNW_ARM_R4:
|
||||||
|
return PERF_REG_ARM_R4;
|
||||||
|
case UNW_ARM_R5:
|
||||||
|
return PERF_REG_ARM_R5;
|
||||||
|
case UNW_ARM_R6:
|
||||||
|
return PERF_REG_ARM_R6;
|
||||||
|
case UNW_ARM_R7:
|
||||||
|
return PERF_REG_ARM_R7;
|
||||||
|
case UNW_ARM_R8:
|
||||||
|
return PERF_REG_ARM_R8;
|
||||||
|
case UNW_ARM_R9:
|
||||||
|
return PERF_REG_ARM_R9;
|
||||||
|
case UNW_ARM_R10:
|
||||||
|
return PERF_REG_ARM_R10;
|
||||||
|
case UNW_ARM_R11:
|
||||||
|
return PERF_REG_ARM_FP;
|
||||||
|
case UNW_ARM_R12:
|
||||||
|
return PERF_REG_ARM_IP;
|
||||||
|
case UNW_ARM_R13:
|
||||||
|
return PERF_REG_ARM_SP;
|
||||||
|
case UNW_ARM_R14:
|
||||||
|
return PERF_REG_ARM_LR;
|
||||||
|
case UNW_ARM_R15:
|
||||||
|
return PERF_REG_ARM_PC;
|
||||||
|
default:
|
||||||
|
pr_err("unwind: invalid reg id %d\n", regnum);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
|
@ -29,6 +29,10 @@ ifeq ($(ARCH),x86_64)
|
||||||
NO_PERF_REGS := 0
|
NO_PERF_REGS := 0
|
||||||
LIBUNWIND_LIBS = -lunwind -lunwind-x86_64
|
LIBUNWIND_LIBS = -lunwind -lunwind-x86_64
|
||||||
endif
|
endif
|
||||||
|
ifeq ($(ARCH),arm)
|
||||||
|
NO_PERF_REGS := 0
|
||||||
|
LIBUNWIND_LIBS = -lunwind -lunwind-arm
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(NO_PERF_REGS),0)
|
ifeq ($(NO_PERF_REGS),0)
|
||||||
CFLAGS += -DHAVE_PERF_REGS
|
CFLAGS += -DHAVE_PERF_REGS
|
||||||
|
@ -208,8 +212,7 @@ ifeq ($(call try-cc,$(SOURCE_ELF_MMAP),$(FLAGS_LIBELF),-DLIBELF_MMAP),y)
|
||||||
endif # try-cc
|
endif # try-cc
|
||||||
endif # NO_LIBELF
|
endif # NO_LIBELF
|
||||||
|
|
||||||
# There's only x86 (both 32 and 64) support for CFI unwind so far
|
ifeq ($(LIBUNWIND_LIBS),)
|
||||||
ifneq ($(ARCH),x86)
|
|
||||||
NO_LIBUNWIND := 1
|
NO_LIBUNWIND := 1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue