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

Commit 3711784e authored by AKASHI Takahiro's avatar AKASHI Takahiro Committed by Will Deacon
Browse files

arm64: ftrace: Add CALLER_ADDRx macros



CALLER_ADDRx returns caller's address at specified level in call stacks.
They are used for several tracers like irqsoff and preemptoff.
Strange to say, however, they are refered even without FTRACE.

Signed-off-by: default avatarAKASHI Takahiro <takahiro.akashi@linaro.org>
Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
parent bd7d38db
Loading
Loading
Loading
Loading
+4 −1
Original line number Original line Diff line number Diff line
@@ -18,6 +18,7 @@


#ifndef __ASSEMBLY__
#ifndef __ASSEMBLY__
extern void _mcount(unsigned long);
extern void _mcount(unsigned long);
extern void *return_address(unsigned int);


struct dyn_arch_ftrace {
struct dyn_arch_ftrace {
	/* No extra data needed for arm64 */
	/* No extra data needed for arm64 */
@@ -33,6 +34,8 @@ static inline unsigned long ftrace_call_adjust(unsigned long addr)
	 */
	 */
	return addr;
	return addr;
}
}
#endif /* __ASSEMBLY__ */

#define ftrace_return_address(n) return_address(n)
#endif /* ifndef __ASSEMBLY__ */


#endif /* __ASM_FTRACE_H */
#endif /* __ASM_FTRACE_H */
+2 −1
Original line number Original line Diff line number Diff line
@@ -7,12 +7,13 @@ AFLAGS_head.o := -DTEXT_OFFSET=$(TEXT_OFFSET)


CFLAGS_REMOVE_ftrace.o = -pg
CFLAGS_REMOVE_ftrace.o = -pg
CFLAGS_REMOVE_insn.o = -pg
CFLAGS_REMOVE_insn.o = -pg
CFLAGS_REMOVE_return_address.o = -pg


# Object file lists.
# Object file lists.
arm64-obj-y		:= cputable.o debug-monitors.o entry.o irq.o fpsimd.o	\
arm64-obj-y		:= cputable.o debug-monitors.o entry.o irq.o fpsimd.o	\
			   entry-fpsimd.o process.o ptrace.o setup.o signal.o	\
			   entry-fpsimd.o process.o ptrace.o setup.o signal.o	\
			   sys.o stacktrace.o time.o traps.o io.o vdso.o	\
			   sys.o stacktrace.o time.o traps.o io.o vdso.o	\
			   hyp-stub.o psci.o cpu_ops.o insn.o
			   hyp-stub.o psci.o cpu_ops.o insn.o return_address.o


arm64-obj-$(CONFIG_COMPAT)		+= sys32.o kuser32.o signal32.o 	\
arm64-obj-$(CONFIG_COMPAT)		+= sys32.o kuser32.o signal32.o 	\
					   sys_compat.o
					   sys_compat.o
+55 −0
Original line number Original line Diff line number Diff line
/*
 * arch/arm64/kernel/return_address.c
 *
 * Copyright (C) 2013 Linaro Limited
 * Author: AKASHI Takahiro <takahiro.akashi@linaro.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#include <linux/export.h>
#include <linux/ftrace.h>

#include <asm/stacktrace.h>

struct return_address_data {
	unsigned int level;
	void *addr;
};

static int save_return_addr(struct stackframe *frame, void *d)
{
	struct return_address_data *data = d;

	if (!data->level) {
		data->addr = (void *)frame->pc;
		return 1;
	} else {
		--data->level;
		return 0;
	}
}

void *return_address(unsigned int level)
{
	struct return_address_data data;
	struct stackframe frame;
	register unsigned long current_sp asm ("sp");

	data.level = level + 2;
	data.addr = NULL;

	frame.fp = (unsigned long)__builtin_frame_address(0);
	frame.sp = current_sp;
	frame.pc = (unsigned long)return_address; /* dummy */

	walk_stackframe(&frame, save_return_addr, &data);

	if (!data.level)
		return data.addr;
	else
		return NULL;
}
EXPORT_SYMBOL_GPL(return_address);