Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 057fbfb2 authored by He Kuang's avatar He Kuang Committed by Arnaldo Carvalho de Melo
Browse files

perf callchain: Support aarch64 cross-platform



Support aarch64 cross platform callchain unwind.

Signed-off-by: default avatarHe Kuang <hekuang@huawei.com>
Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Ekaterina Tumanova <tumanova@linux.vnet.ibm.com>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Kan Liang <kan.liang@intel.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/r/1464924803-22214-15-git-send-email-hekuang@huawei.com


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 52ffe0ff
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line

#ifndef REMOTE_UNWIND_LIBUNWIND
#include <errno.h>
#include <libunwind.h>
#include "perf_regs.h"
#include "../../util/unwind.h"
#include "../../util/debug.h"
#endif

int libunwind__arch_reg_id(int regnum)
int LIBUNWIND__ARCH_REG_ID(int regnum)
{
	switch (regnum) {
	case UNW_AARCH64_X0:
+12 −0
Original line number Diff line number Diff line
@@ -362,6 +362,18 @@ ifndef NO_LIBUNWIND
    have_libunwind = 1
  endif

  ifeq ($(feature-libunwind-aarch64), 1)
    $(call detected,CONFIG_LIBUNWIND_AARCH64)
    CFLAGS += -DHAVE_LIBUNWIND_AARCH64_SUPPORT
    LDFLAGS += -lunwind-aarch64
    have_libunwind = 1
    $(call feature_check,libunwind-debug-frame-aarch64)
    ifneq ($(feature-libunwind-debug-frame-aarch64), 1)
      msg := $(warning No debug_frame support found in libunwind-aarch64);
      CFLAGS += -DNO_LIBUNWIND_DEBUG_FRAME_AARCH64
    endif
  endif

  ifneq ($(feature-libunwind), 1)
    msg := $(warning No libunwind found. Please install libunwind-dev[el] >= 1.1 and/or set LIBUNWIND_DIR);
    NO_LOCAL_LIBUNWIND := 1
+1 −0
Original line number Diff line number Diff line
@@ -102,6 +102,7 @@ libperf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
libperf-$(CONFIG_LOCAL_LIBUNWIND)    += unwind-libunwind-local.o
libperf-$(CONFIG_LIBUNWIND)          += unwind-libunwind.o
libperf-$(CONFIG_LIBUNWIND_X86)      += libunwind/x86_32.o
libperf-$(CONFIG_LIBUNWIND_AARCH64)  += libunwind/arm64.o

libperf-$(CONFIG_LIBBABELTRACE) += data-convert-bt.o

+35 −0
Original line number Diff line number Diff line
/*
 * This file setups defines to compile arch specific binary from the
 * generic one.
 *
 * The function 'LIBUNWIND__ARCH_REG_ID' name is set according to arch
 * name and the defination of this function is included directly from
 * 'arch/arm64/util/unwind-libunwind.c', to make sure that this function
 * is defined no matter what arch the host is.
 *
 * Finally, the arch specific unwind methods are exported which will
 * be assigned to each arm64 thread.
 */

#define REMOTE_UNWIND_LIBUNWIND

#define LIBUNWIND__ARCH_REG_ID(regnum) libunwind__arm64_reg_id(regnum)

#include "unwind.h"
#include "debug.h"
#include "libunwind-aarch64.h"
#include <../../../../arch/arm64/include/uapi/asm/perf_regs.h>
#include "../../arch/arm64/util/unwind-libunwind.c"

/* NO_LIBUNWIND_DEBUG_FRAME is a feature flag for local libunwind,
 * assign NO_LIBUNWIND_DEBUG_FRAME_AARCH64 to it for compiling arm64
 * unwind methods.
 */
#undef NO_LIBUNWIND_DEBUG_FRAME
#ifdef NO_LIBUNWIND_DEBUG_FRAME_AARCH64
#define NO_LIBUNWIND_DEBUG_FRAME
#endif
#include "util/unwind-libunwind-local.c"

struct unwind_libunwind_ops *
arm64_unwind_libunwind_ops = &_unwind_libunwind_ops;
+4 −0
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@

struct unwind_libunwind_ops __weak *local_unwind_libunwind_ops;
struct unwind_libunwind_ops __weak *x86_32_unwind_libunwind_ops;
struct unwind_libunwind_ops __weak *arm64_unwind_libunwind_ops;

static void unwind__register_ops(struct thread *thread,
			  struct unwind_libunwind_ops *ops)
@@ -38,6 +39,9 @@ int unwind__prepare_access(struct thread *thread, struct map *map)
	if (!strcmp(arch, "x86")) {
		if (dso_type != DSO__TYPE_64BIT)
			ops = x86_32_unwind_libunwind_ops;
	} else if (!strcmp(arch, "arm64") || !strcmp(arch, "arm")) {
		if (dso_type == DSO__TYPE_64BIT)
			ops = arm64_unwind_libunwind_ops;
	}

	if (!ops) {