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

Commit 49863894 authored by Will Deacon's avatar Will Deacon
Browse files

ARM: perf: add support for perf registers API



This patch implements the functions required for the perf registers API,
allowing the perf tool to interface kernel register dumps with libunwind
in order to provide userspace backtracing.

Cc: Jean Pihet <jean.pihet@linaro.org>
Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
parent 15c03dd4
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -51,6 +51,8 @@ config ARM
	select HAVE_MOD_ARCH_SPECIFIC if ARM_UNWIND
	select HAVE_OPROFILE if (HAVE_PERF_EVENTS)
	select HAVE_PERF_EVENTS
	select HAVE_PERF_REGS
	select HAVE_PERF_USER_STACK_DUMP
	select HAVE_REGS_AND_STACK_ACCESS_API
	select HAVE_SYSCALL_TRACEPOINTS
	select HAVE_UID16
+1 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@ header-y += hwcap.h
header-y += ioctls.h
header-y += kvm_para.h
header-y += mman.h
header-y += perf_regs.h
header-y += posix_types.h
header-y += ptrace.h
header-y += setup.h
+23 −0
Original line number Diff line number Diff line
#ifndef _ASM_ARM_PERF_REGS_H
#define _ASM_ARM_PERF_REGS_H

enum perf_event_arm_regs {
	PERF_REG_ARM_R0,
	PERF_REG_ARM_R1,
	PERF_REG_ARM_R2,
	PERF_REG_ARM_R3,
	PERF_REG_ARM_R4,
	PERF_REG_ARM_R5,
	PERF_REG_ARM_R6,
	PERF_REG_ARM_R7,
	PERF_REG_ARM_R8,
	PERF_REG_ARM_R9,
	PERF_REG_ARM_R10,
	PERF_REG_ARM_FP,
	PERF_REG_ARM_IP,
	PERF_REG_ARM_SP,
	PERF_REG_ARM_LR,
	PERF_REG_ARM_PC,
	PERF_REG_ARM_MAX,
};
#endif /* _ASM_ARM_PERF_REGS_H */
+1 −0
Original line number Diff line number Diff line
@@ -78,6 +78,7 @@ obj-$(CONFIG_CPU_XSC3) += xscale-cp0.o
obj-$(CONFIG_CPU_MOHAWK)	+= xscale-cp0.o
obj-$(CONFIG_CPU_PJ4)		+= pj4-cp0.o
obj-$(CONFIG_IWMMXT)		+= iwmmxt.o
obj-$(CONFIG_PERF_EVENTS)	+= perf_regs.o
obj-$(CONFIG_HW_PERF_EVENTS)	+= perf_event.o perf_event_cpu.o
AFLAGS_iwmmxt.o			:= -Wa,-mcpu=iwmmxt
obj-$(CONFIG_ARM_CPU_TOPOLOGY)  += topology.o
+30 −0
Original line number Diff line number Diff line

#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/perf_event.h>
#include <linux/bug.h>
#include <asm/perf_regs.h>
#include <asm/ptrace.h>

u64 perf_reg_value(struct pt_regs *regs, int idx)
{
	if (WARN_ON_ONCE((u32)idx >= PERF_REG_ARM_MAX))
		return 0;

	return regs->uregs[idx];
}

#define REG_RESERVED (~((1ULL << PERF_REG_ARM_MAX) - 1))

int perf_reg_validate(u64 mask)
{
	if (!mask || mask & REG_RESERVED)
		return -EINVAL;

	return 0;
}

u64 perf_reg_abi(struct task_struct *task)
{
	return PERF_SAMPLE_REGS_ABI_32;
}