Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/loongarch/kernel/mcount.S
26439 views
1
/* SPDX-License-Identifier: GPL-2.0 */
2
/*
3
* LoongArch specific _mcount support
4
*
5
* Copyright (C) 2022 Loongson Technology Corporation Limited
6
*/
7
8
#include <linux/export.h>
9
#include <asm/ftrace.h>
10
#include <asm/regdef.h>
11
#include <asm/stackframe.h>
12
13
.text
14
15
#define MCOUNT_S0_OFFSET (0)
16
#define MCOUNT_RA_OFFSET (SZREG)
17
#define MCOUNT_STACK_SIZE (2 * SZREG)
18
19
.macro MCOUNT_SAVE_REGS
20
PTR_ADDI sp, sp, -MCOUNT_STACK_SIZE
21
PTR_S s0, sp, MCOUNT_S0_OFFSET
22
PTR_S ra, sp, MCOUNT_RA_OFFSET
23
move s0, a0
24
.endm
25
26
.macro MCOUNT_RESTORE_REGS
27
move a0, s0
28
PTR_L ra, sp, MCOUNT_RA_OFFSET
29
PTR_L s0, sp, MCOUNT_S0_OFFSET
30
PTR_ADDI sp, sp, MCOUNT_STACK_SIZE
31
.endm
32
33
SYM_FUNC_START(_mcount)
34
la.pcrel t1, ftrace_stub
35
la.pcrel t2, ftrace_trace_function /* Prepare t2 for (1) */
36
PTR_L t2, t2, 0
37
beq t1, t2, fgraph_trace
38
39
MCOUNT_SAVE_REGS
40
41
move a0, ra /* arg0: self return address */
42
move a1, s0 /* arg1: parent's return address */
43
jirl ra, t2, 0 /* (1) call *ftrace_trace_function */
44
45
MCOUNT_RESTORE_REGS
46
47
fgraph_trace:
48
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
49
la.pcrel t1, ftrace_stub
50
la.pcrel t3, ftrace_graph_return
51
PTR_L t3, t3, 0
52
bne t1, t3, ftrace_graph_caller
53
la.pcrel t1, ftrace_graph_entry_stub
54
la.pcrel t3, ftrace_graph_entry
55
PTR_L t3, t3, 0
56
bne t1, t3, ftrace_graph_caller
57
#endif
58
59
SYM_INNER_LABEL(ftrace_stub, SYM_L_GLOBAL)
60
jr ra
61
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
62
SYM_INNER_LABEL(ftrace_graph_func, SYM_L_GLOBAL)
63
bl ftrace_stub
64
#endif
65
SYM_FUNC_END(_mcount)
66
EXPORT_SYMBOL(_mcount)
67
68
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
69
SYM_FUNC_START(ftrace_graph_caller)
70
MCOUNT_SAVE_REGS
71
72
PTR_ADDI a0, ra, -4 /* arg0: Callsite self return addr */
73
PTR_ADDI a1, sp, MCOUNT_STACK_SIZE /* arg1: Callsite sp */
74
move a2, s0 /* arg2: Callsite parent ra */
75
bl prepare_ftrace_return
76
77
MCOUNT_RESTORE_REGS
78
jr ra
79
SYM_FUNC_END(ftrace_graph_caller)
80
81
SYM_FUNC_START(return_to_handler)
82
/* Save return value regs */
83
PTR_ADDI sp, sp, -PT_SIZE
84
PTR_S a0, sp, PT_R4
85
PTR_S a1, sp, PT_R5
86
PTR_S zero, sp, PT_R22
87
88
move a0, sp
89
bl ftrace_return_to_handler
90
91
/* Restore the real parent address: a0 -> ra */
92
move ra, a0
93
94
/* Restore return value regs */
95
PTR_L a0, sp, PT_R4
96
PTR_L a1, sp, PT_R5
97
PTR_ADDI sp, sp, PT_SIZE
98
99
jr ra
100
SYM_FUNC_END(return_to_handler)
101
#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
102
103