-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This patch contains basic ftrace support for RV64I platform. Specifically, function tracer (HAVE_FUNCTION_TRACER), function graph tracer (HAVE_FUNCTION_GRAPH_TRACER), and a frame pointer test (HAVE_FUNCTION_GRAPH_FP_TEST) are implemented following the instructions in Documentation/trace/ftrace-design.txt. Note that the functions in both ftrace.c and setup.c should not be hooked with the compiler's -pg option: to prevent infinite self- referencing for the former, and to ignore early setup stuff for the latter. Signed-off-by: Alan Kao <alankao@andestech.com> Signed-off-by: Palmer Dabbelt <palmer@sifive.com>
- Loading branch information
Alan Kao
authored and
Palmer Dabbelt
committed
Jan 31, 2018
1 parent
5d44bf2
commit 10626c3
Showing
6 changed files
with
189 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 */ | ||
/* Copyright (C) 2017 Andes Technology Corporation */ | ||
|
||
/* | ||
* The graph frame test is not possible if CONFIG_FRAME_POINTER is not enabled. | ||
* Check arch/riscv/kernel/mcount.S for detail. | ||
*/ | ||
#if defined(CONFIG_FUNCTION_GRAPH_TRACER) && defined(CONFIG_FRAME_POINTER) | ||
#define HAVE_FUNCTION_GRAPH_FP_TEST | ||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 */ | ||
/* | ||
* Copyright (C) 2013 Linaro Limited | ||
* Author: AKASHI Takahiro <takahiro.akashi@linaro.org> | ||
* Copyright (C) 2017 Andes Technology Corporation | ||
*/ | ||
|
||
#include <linux/ftrace.h> | ||
|
||
/* | ||
* Most of this file is copied from arm64. | ||
*/ | ||
void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr, | ||
unsigned long frame_pointer) | ||
{ | ||
unsigned long return_hooker = (unsigned long)&return_to_handler; | ||
unsigned long old; | ||
struct ftrace_graph_ent trace; | ||
int err; | ||
|
||
if (unlikely(atomic_read(¤t->tracing_graph_pause))) | ||
return; | ||
|
||
/* | ||
* We don't suffer access faults, so no extra fault-recovery assembly | ||
* is needed here. | ||
*/ | ||
old = *parent; | ||
|
||
trace.func = self_addr; | ||
trace.depth = current->curr_ret_stack + 1; | ||
|
||
if (!ftrace_graph_entry(&trace)) | ||
return; | ||
|
||
err = ftrace_push_return_trace(old, self_addr, &trace.depth, | ||
frame_pointer, NULL); | ||
if (err == -EBUSY) | ||
return; | ||
*parent = return_hooker; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,126 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 */ | ||
/* Copyright (C) 2017 Andes Technology Corporation */ | ||
|
||
#include <linux/init.h> | ||
#include <linux/linkage.h> | ||
#include <asm/asm.h> | ||
#include <asm/csr.h> | ||
#include <asm/unistd.h> | ||
#include <asm/thread_info.h> | ||
#include <asm/asm-offsets.h> | ||
#include <asm-generic/export.h> | ||
#include <asm/ftrace.h> | ||
|
||
.text | ||
|
||
.macro SAVE_ABI_STATE | ||
addi sp, sp, -16 | ||
sd s0, 0(sp) | ||
sd ra, 8(sp) | ||
addi s0, sp, 16 | ||
.endm | ||
|
||
/* | ||
* The call to ftrace_return_to_handler would overwrite the return | ||
* register if a0 was not saved. | ||
*/ | ||
.macro SAVE_RET_ABI_STATE | ||
addi sp, sp, -32 | ||
sd s0, 16(sp) | ||
sd ra, 24(sp) | ||
sd a0, 8(sp) | ||
addi s0, sp, 32 | ||
.endm | ||
|
||
.macro STORE_ABI_STATE | ||
ld ra, 8(sp) | ||
ld s0, 0(sp) | ||
addi sp, sp, 16 | ||
.endm | ||
|
||
.macro STORE_RET_ABI_STATE | ||
ld ra, 24(sp) | ||
ld s0, 16(sp) | ||
ld a0, 8(sp) | ||
addi sp, sp, 32 | ||
.endm | ||
|
||
ENTRY(ftrace_stub) | ||
ret | ||
ENDPROC(ftrace_stub) | ||
|
||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER | ||
ENTRY(return_to_handler) | ||
/* | ||
* On implementing the frame point test, the ideal way is to compare the | ||
* s0 (frame pointer, if enabled) on entry and the sp (stack pointer) on return. | ||
* However, the psABI of variable-length-argument functions does not allow this. | ||
* | ||
* So alternatively we check the *old* frame pointer position, that is, the | ||
* value stored in -16(s0) on entry, and the s0 on return. | ||
*/ | ||
#ifdef HAVE_FUNCTION_GRAPH_FP_TEST | ||
mv t6, s0 | ||
#endif | ||
SAVE_RET_ABI_STATE | ||
#ifdef HAVE_FUNCTION_GRAPH_FP_TEST | ||
mv a0, t6 | ||
#endif | ||
la t0, ftrace_return_to_handler | ||
jalr t0 | ||
mv a1, a0 | ||
STORE_RET_ABI_STATE | ||
jalr a1 | ||
ENDPROC(return_to_handler) | ||
EXPORT_SYMBOL(return_to_handler) | ||
#endif | ||
|
||
ENTRY(_mcount) | ||
la t4, ftrace_stub | ||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER | ||
la t0, ftrace_graph_return | ||
ld t1, 0(t0) | ||
bne t1, t4, do_ftrace_graph_caller | ||
|
||
la t3, ftrace_graph_entry | ||
ld t2, 0(t3) | ||
la t6, ftrace_graph_entry_stub | ||
bne t2, t6, do_ftrace_graph_caller | ||
#endif | ||
la t3, ftrace_trace_function | ||
ld t5, 0(t3) | ||
bne t5, t4, do_trace | ||
ret | ||
|
||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER | ||
/* | ||
* A pseudo representation for the function graph tracer: | ||
* prepare_to_return(&ra_to_caller_of_caller, ra_to_caller) | ||
*/ | ||
do_ftrace_graph_caller: | ||
addi a0, s0, -8 | ||
mv a1, ra | ||
#ifdef HAVE_FUNCTION_GRAPH_FP_TEST | ||
ld a2, -16(s0) | ||
#endif | ||
SAVE_ABI_STATE | ||
la t0, prepare_ftrace_return | ||
jalr t0 | ||
STORE_ABI_STATE | ||
ret | ||
#endif | ||
|
||
/* | ||
* A pseudo representation for the function tracer: | ||
* (*ftrace_trace_function)(ra_to_caller, ra_to_caller_of_caller) | ||
*/ | ||
do_trace: | ||
ld a1, -8(s0) | ||
mv a0, ra | ||
|
||
SAVE_ABI_STATE | ||
jalr t5 | ||
STORE_ABI_STATE | ||
ret | ||
ENDPROC(_mcount) | ||
EXPORT_SYMBOL(_mcount) |