Skip to content

Commit 9f972b6

Browse files
ARCv3: Implemented ftrace
Implemented both CONFIG_FTRACE (function entry tracing) and CONFIG_FUNCTION_GRAPH_TRACER (function entry and exit tracing) for ARCv33 Signed-off-by: BrunoASMauricio <[email protected]>
1 parent b42b437 commit 9f972b6

File tree

5 files changed

+173
-0
lines changed

5 files changed

+173
-0
lines changed

arch/arc/Kconfig

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ config ARC
3838
select HAVE_KERNEL_LZMA
3939
select HAVE_KPROBES
4040
select HAVE_KRETPROBES
41+
select HAVE_FUNCTION_TRACER if ISA_ARCV3
42+
select HAVE_FUNCTION_GRAPH_TRACER if ISA_ARCV3
4143
select HAVE_MOD_ARCH_SPECIFIC
4244
select HAVE_PERF_EVENTS
4345
select HANDLE_DOMAIN_IRQ

arch/arc/Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ cflags-$(CONFIG_64BIT) += -mcmodel=large
6161
cflags-$(CONFIG_ARC_HAS_LL128) += -m128
6262
endif
6363

64+
ifdef CONFIG_FTRACE
65+
cflags-y += -fno-omit-frame-pointer
66+
endif
67+
6468
cflags-y += -Wa,-I$(srctree)/arch/arc/include
6569

6670
ifdef CONFIG_ARC_CURR_IN_REG

arch/arc/kernel/Makefile

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,23 @@ else
1313
obj-y += intc-arcv2.o
1414
endif
1515

16+
ifdef CONFIG_FTRACE
17+
18+
# Currently ftrace only works on arcv3 due to ABI
19+
ifdef CONFIG_ISA_ARCV3
20+
21+
# ftrace cant be traced (infinite loop)
22+
CFLAGS_REMOVE_ftrace.o = -pg
23+
CFLAGS_REMOVE_mcount.o = -pg
24+
25+
26+
obj-$(CONFIG_FUNCTION_TRACER) += mcount.o
27+
obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o
28+
29+
endif
30+
31+
endif
32+
1633
obj-$(CONFIG_ISA_ARCOMPACT) += entry-compact.o
1734
obj-$(CONFIG_ISA_ARCV2) += entry-arcv2.o
1835
obj-$(CONFIG_ISA_ARCV3) += entry-arcv3.o

arch/arc/kernel/ftrace.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/* SPDX-License-Identifier: GPL-2.0-only */
2+
/*
3+
* Function tracing support for ARC
4+
*
5+
* Copyright (C) 2023 Synopsys, Inc. (www.synopsys.com)
6+
*/
7+
8+
#include <linux/ftrace.h>
9+
10+
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
11+
12+
/*
13+
* Setup return hook in traced routine
14+
* Function copied from riscv
15+
*/
16+
void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr,
17+
unsigned long frame_pointer)
18+
{
19+
unsigned long return_hooker = (unsigned long)&return_to_handler;
20+
unsigned long old;
21+
22+
if (unlikely(atomic_read(&current->tracing_graph_pause)))
23+
return;
24+
25+
old = *parent;
26+
27+
if (!function_graph_enter(old, self_addr, frame_pointer, parent))
28+
*parent = return_hooker;
29+
}
30+
31+
#endif /* CONFIG_FUNCTION_GRAPH_TRACER */

arch/arc/kernel/mcount.S

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
/* SPDX-License-Identifier: GPL-2.0-only */
2+
/*
3+
* Function tracing support for ARC
4+
*
5+
* Copyright (C) 2023 Synopsys, Inc. (www.synopsys.com)
6+
*/
7+
8+
9+
#include <linux/init.h>
10+
#include <linux/linkage.h>
11+
#include <asm-generic/export.h>
12+
#include <asm/asm-macro-64-bit.h>
13+
14+
.text
15+
; ftrace placeholder, just return to caller
16+
ENTRY(ftrace_stub)
17+
j_s [blink]
18+
ENDPROC(ftrace_stub)
19+
20+
; save ABI necessary registers
21+
.macro SAVE_ABI
22+
PUSHR blink
23+
PUSHR fp
24+
.endm
25+
26+
.macro LOAD_ABI
27+
POPR fp
28+
POPR blink
29+
.endm
30+
31+
.macro SAVE_ABI_RET
32+
PUSHR r0
33+
PUSHR r1
34+
PUSHR blink
35+
.endm
36+
37+
.macro LOAD_ABI_RET
38+
POPR blink
39+
POPR r1
40+
POPR r0
41+
.endm
42+
43+
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
44+
45+
; Return to the actual caller
46+
ENTRY(return_to_handler)
47+
; Save return value (if any) from handled routine
48+
SAVE_ABI_RET
49+
50+
; Will return true blink on r0
51+
MOVA r0, @ftrace_return_to_handler
52+
jl [r0]
53+
54+
MOVR r2, r0
55+
56+
LOAD_ABI_RET
57+
58+
j [r2]
59+
60+
ENDPROC(return_to_handler)
61+
#endif
62+
63+
; r0 has the frompc (targets parent ip)
64+
; blink has the selfpc (target ip)
65+
ENTRY(_mcount)
66+
67+
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
68+
69+
; *ftrace_graph_return != ftrace_stub
70+
MOVA r3, ftrace_graph_return
71+
LD64 r3, r3
72+
MOVA r4, @ftrace_stub
73+
brne r3, r4, @do_ftrace_graph_caller
74+
75+
; *ftrace_graph_entry != *ftrace_graph_entry_stub
76+
MOVA r3, @ftrace_graph_entry
77+
LD64 r3, r3
78+
MOVA r4, @ftrace_graph_entry_stub
79+
brne r3, r4, @do_ftrace_graph_caller
80+
81+
#endif
82+
83+
; *ftrace_trace_function != ftrace_stub
84+
MOVA r2, ftrace_trace_function
85+
LD64 r2, r2
86+
87+
MOVA r3, @ftrace_stub
88+
brne r2, r3, @do_trace
89+
90+
; Return
91+
j_s [blink]
92+
93+
ENDPROC(_mcount)
94+
95+
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
96+
do_ftrace_graph_caller:
97+
98+
SAVE_ABI
99+
100+
ADDR r0, fp, 8
101+
MOVR r1, blink
102+
103+
MOVA r2, @prepare_ftrace_return
104+
jl [r2]
105+
106+
LOAD_ABI
107+
108+
j_s [blink]
109+
#endif
110+
111+
do_trace:
112+
SAVE_ABI
113+
MOVR r1, r0
114+
MOVR r0, blink
115+
116+
jl [r2]
117+
118+
LOAD_ABI
119+
j_s [blink]

0 commit comments

Comments
 (0)