Commit 3213486f authored by Mao Han's avatar Mao Han Committed by Guo Ren
Browse files

csky: Add support for perf unwind-libdw

This patch add support for DWARF register mappings and libdw registers
initialization, which is used by perf callchain analyzing, eg:

perf record --call-graph=dwarf <COMMAND>

Here is elfutils csky backend patch set:
https://sourceware.org/ml/elfutils-devel/2019-q2/msg00007.html



Signed-off-by: default avatarMao Han <han_mao@c-sky.com>
Signed-off-by: default avatarGuo Ren <ren_guo@c-sky.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Arnd Bergmann <arnd@arnd.de>
parent 085b7755
Loading
Loading
Loading
Loading
+51 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0 */
// Copyright (C) 2019 Hangzhou C-SKY Microsystems co.,ltd.

#ifndef _ASM_CSKY_PERF_REGS_H
#define _ASM_CSKY_PERF_REGS_H

/* Index of struct pt_regs */
enum perf_event_csky_regs {
	PERF_REG_CSKY_TLS,
	PERF_REG_CSKY_LR,
	PERF_REG_CSKY_PC,
	PERF_REG_CSKY_SR,
	PERF_REG_CSKY_SP,
	PERF_REG_CSKY_ORIG_A0,
	PERF_REG_CSKY_A0,
	PERF_REG_CSKY_A1,
	PERF_REG_CSKY_A2,
	PERF_REG_CSKY_A3,
	PERF_REG_CSKY_REGS0,
	PERF_REG_CSKY_REGS1,
	PERF_REG_CSKY_REGS2,
	PERF_REG_CSKY_REGS3,
	PERF_REG_CSKY_REGS4,
	PERF_REG_CSKY_REGS5,
	PERF_REG_CSKY_REGS6,
	PERF_REG_CSKY_REGS7,
	PERF_REG_CSKY_REGS8,
	PERF_REG_CSKY_REGS9,
#if defined(__CSKYABIV2__)
	PERF_REG_CSKY_EXREGS0,
	PERF_REG_CSKY_EXREGS1,
	PERF_REG_CSKY_EXREGS2,
	PERF_REG_CSKY_EXREGS3,
	PERF_REG_CSKY_EXREGS4,
	PERF_REG_CSKY_EXREGS5,
	PERF_REG_CSKY_EXREGS6,
	PERF_REG_CSKY_EXREGS7,
	PERF_REG_CSKY_EXREGS8,
	PERF_REG_CSKY_EXREGS9,
	PERF_REG_CSKY_EXREGS10,
	PERF_REG_CSKY_EXREGS11,
	PERF_REG_CSKY_EXREGS12,
	PERF_REG_CSKY_EXREGS13,
	PERF_REG_CSKY_EXREGS14,
	PERF_REG_CSKY_HI,
	PERF_REG_CSKY_LO,
	PERF_REG_CSKY_DCSR,
#endif
	PERF_REG_CSKY_MAX,
};
#endif /* _ASM_CSKY_PERF_REGS_H */
+5 −1
Original line number Diff line number Diff line
@@ -59,6 +59,10 @@ ifeq ($(SRCARCH),arm64)
  LIBUNWIND_LIBS = -lunwind -lunwind-aarch64
endif

ifeq ($(SRCARCH),csky)
  NO_PERF_REGS := 0
endif

ifeq ($(ARCH),s390)
  NO_PERF_REGS := 0
  NO_SYSCALL_TABLE := 0
@@ -77,7 +81,7 @@ endif
# Disable it on all other architectures in case libdw unwind
# support is detected in system. Add supported architectures
# to the check.
ifneq ($(SRCARCH),$(filter $(SRCARCH),x86 arm arm64 powerpc s390))
ifneq ($(SRCARCH),$(filter $(SRCARCH),x86 arm arm64 powerpc s390 csky))
  NO_LIBDW_DWARF_UNWIND := 1
endif

+1 −0
Original line number Diff line number Diff line
perf-y += util/
+3 −0
Original line number Diff line number Diff line
ifndef NO_DWARF
PERF_HAVE_DWARF_REGS := 1
endif
+100 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0 */
// Copyright (C) 2019 Hangzhou C-SKY Microsystems co.,ltd.

#ifndef ARCH_PERF_REGS_H
#define ARCH_PERF_REGS_H

#include <stdlib.h>
#include <linux/types.h>
#include <asm/perf_regs.h>

#define PERF_REGS_MASK	((1ULL << PERF_REG_CSKY_MAX) - 1)
#define PERF_REGS_MAX	PERF_REG_CSKY_MAX
#define PERF_SAMPLE_REGS_ABI	PERF_SAMPLE_REGS_ABI_32

#define PERF_REG_IP	PERF_REG_CSKY_PC
#define PERF_REG_SP	PERF_REG_CSKY_SP

static inline const char *perf_reg_name(int id)
{
	switch (id) {
	case PERF_REG_CSKY_A0:
		return "a0";
	case PERF_REG_CSKY_A1:
		return "a1";
	case PERF_REG_CSKY_A2:
		return "a2";
	case PERF_REG_CSKY_A3:
		return "a3";
	case PERF_REG_CSKY_REGS0:
		return "regs0";
	case PERF_REG_CSKY_REGS1:
		return "regs1";
	case PERF_REG_CSKY_REGS2:
		return "regs2";
	case PERF_REG_CSKY_REGS3:
		return "regs3";
	case PERF_REG_CSKY_REGS4:
		return "regs4";
	case PERF_REG_CSKY_REGS5:
		return "regs5";
	case PERF_REG_CSKY_REGS6:
		return "regs6";
	case PERF_REG_CSKY_REGS7:
		return "regs7";
	case PERF_REG_CSKY_REGS8:
		return "regs8";
	case PERF_REG_CSKY_REGS9:
		return "regs9";
	case PERF_REG_CSKY_SP:
		return "sp";
	case PERF_REG_CSKY_LR:
		return "lr";
	case PERF_REG_CSKY_PC:
		return "pc";
#if defined(__CSKYABIV2__)
	case PERF_REG_CSKY_EXREGS0:
		return "exregs0";
	case PERF_REG_CSKY_EXREGS1:
		return "exregs1";
	case PERF_REG_CSKY_EXREGS2:
		return "exregs2";
	case PERF_REG_CSKY_EXREGS3:
		return "exregs3";
	case PERF_REG_CSKY_EXREGS4:
		return "exregs4";
	case PERF_REG_CSKY_EXREGS5:
		return "exregs5";
	case PERF_REG_CSKY_EXREGS6:
		return "exregs6";
	case PERF_REG_CSKY_EXREGS7:
		return "exregs7";
	case PERF_REG_CSKY_EXREGS8:
		return "exregs8";
	case PERF_REG_CSKY_EXREGS9:
		return "exregs9";
	case PERF_REG_CSKY_EXREGS10:
		return "exregs10";
	case PERF_REG_CSKY_EXREGS11:
		return "exregs11";
	case PERF_REG_CSKY_EXREGS12:
		return "exregs12";
	case PERF_REG_CSKY_EXREGS13:
		return "exregs13";
	case PERF_REG_CSKY_EXREGS14:
		return "exregs14";
	case PERF_REG_CSKY_TLS:
		return "tls";
	case PERF_REG_CSKY_HI:
		return "hi";
	case PERF_REG_CSKY_LO:
		return "lo";
#endif
	default:
		return NULL;
	}

	return NULL;
}

#endif /* ARCH_PERF_REGS_H */
Loading