Skip to content

Commit 22f367a

Browse files
Youling Tangchenhuacai
authored andcommitted
LoongArch: ftrace: Add direct call trampoline samples support
The ftrace samples need per-architecture trampoline implementations to save and restore argument registers around the calls to my_direct_func* and to restore polluted registers (e.g: ra). Signed-off-by: Qing Zhang <zhangqing@loongson.cn> Signed-off-by: Youling Tang <tangyouling@loongson.cn> Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
1 parent 9cdc3b6 commit 22f367a

File tree

6 files changed

+152
-0
lines changed

6 files changed

+152
-0
lines changed

arch/loongarch/Kconfig

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ config LOONGARCH
120120
select HAVE_PERF_USER_STACK_DUMP
121121
select HAVE_REGS_AND_STACK_ACCESS_API
122122
select HAVE_RSEQ
123+
select HAVE_SAMPLE_FTRACE_DIRECT
124+
select HAVE_SAMPLE_FTRACE_DIRECT_MULTI
123125
select HAVE_SETUP_PER_CPU_AREA if NUMA
124126
select HAVE_STACKPROTECTOR
125127
select HAVE_SYSCALL_TRACEPOINTS

samples/ftrace/ftrace-direct-modify.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,40 @@ asm (
9696

9797
#endif /* CONFIG_S390 */
9898

99+
#ifdef CONFIG_LOONGARCH
100+
101+
asm (
102+
" .pushsection .text, \"ax\", @progbits\n"
103+
" .type my_tramp1, @function\n"
104+
" .globl my_tramp1\n"
105+
" my_tramp1:\n"
106+
" addi.d $sp, $sp, -16\n"
107+
" st.d $t0, $sp, 0\n"
108+
" st.d $ra, $sp, 8\n"
109+
" bl my_direct_func1\n"
110+
" ld.d $t0, $sp, 0\n"
111+
" ld.d $ra, $sp, 8\n"
112+
" addi.d $sp, $sp, 16\n"
113+
" jr $t0\n"
114+
" .size my_tramp1, .-my_tramp1\n"
115+
116+
" .type my_tramp2, @function\n"
117+
" .globl my_tramp2\n"
118+
" my_tramp2:\n"
119+
" addi.d $sp, $sp, -16\n"
120+
" st.d $t0, $sp, 0\n"
121+
" st.d $ra, $sp, 8\n"
122+
" bl my_direct_func2\n"
123+
" ld.d $t0, $sp, 0\n"
124+
" ld.d $ra, $sp, 8\n"
125+
" addi.d $sp, $sp, 16\n"
126+
" jr $t0\n"
127+
" .size my_tramp2, .-my_tramp2\n"
128+
" .popsection\n"
129+
);
130+
131+
#endif /* CONFIG_LOONGARCH */
132+
99133
static unsigned long my_tramp = (unsigned long)my_tramp1;
100134
static unsigned long tramps[2] = {
101135
(unsigned long)my_tramp1,

samples/ftrace/ftrace-direct-multi-modify.c

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,47 @@ asm (
103103

104104
#endif /* CONFIG_S390 */
105105

106+
#ifdef CONFIG_LOONGARCH
107+
#include <asm/asm.h>
108+
109+
asm (
110+
" .pushsection .text, \"ax\", @progbits\n"
111+
" .type my_tramp1, @function\n"
112+
" .globl my_tramp1\n"
113+
" my_tramp1:\n"
114+
" addi.d $sp, $sp, -32\n"
115+
" st.d $a0, $sp, 0\n"
116+
" st.d $t0, $sp, 8\n"
117+
" st.d $ra, $sp, 16\n"
118+
" move $a0, $t0\n"
119+
" bl my_direct_func1\n"
120+
" ld.d $a0, $sp, 0\n"
121+
" ld.d $t0, $sp, 8\n"
122+
" ld.d $ra, $sp, 16\n"
123+
" addi.d $sp, $sp, 32\n"
124+
" jr $t0\n"
125+
" .size my_tramp1, .-my_tramp1\n"
126+
127+
" .type my_tramp2, @function\n"
128+
" .globl my_tramp2\n"
129+
" my_tramp2:\n"
130+
" addi.d $sp, $sp, -32\n"
131+
" st.d $a0, $sp, 0\n"
132+
" st.d $t0, $sp, 8\n"
133+
" st.d $ra, $sp, 16\n"
134+
" move $a0, $t0\n"
135+
" bl my_direct_func2\n"
136+
" ld.d $a0, $sp, 0\n"
137+
" ld.d $t0, $sp, 8\n"
138+
" ld.d $ra, $sp, 16\n"
139+
" addi.d $sp, $sp, 32\n"
140+
" jr $t0\n"
141+
" .size my_tramp2, .-my_tramp2\n"
142+
" .popsection\n"
143+
);
144+
145+
#endif /* CONFIG_LOONGARCH */
146+
106147
static unsigned long my_tramp = (unsigned long)my_tramp1;
107148
static unsigned long tramps[2] = {
108149
(unsigned long)my_tramp1,

samples/ftrace/ftrace-direct-multi.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,31 @@ asm (
6666

6767
#endif /* CONFIG_S390 */
6868

69+
#ifdef CONFIG_LOONGARCH
70+
71+
#include <asm/asm.h>
72+
asm (
73+
" .pushsection .text, \"ax\", @progbits\n"
74+
" .type my_tramp, @function\n"
75+
" .globl my_tramp\n"
76+
" my_tramp:\n"
77+
" addi.d $sp, $sp, -32\n"
78+
" st.d $a0, $sp, 0\n"
79+
" st.d $t0, $sp, 8\n"
80+
" st.d $ra, $sp, 16\n"
81+
" move $a0, $t0\n"
82+
" bl my_direct_func\n"
83+
" ld.d $a0, $sp, 0\n"
84+
" ld.d $t0, $sp, 8\n"
85+
" ld.d $ra, $sp, 16\n"
86+
" addi.d $sp, $sp, 32\n"
87+
" jr $t0\n"
88+
" .size my_tramp, .-my_tramp\n"
89+
" .popsection\n"
90+
);
91+
92+
#endif /* CONFIG_LOONGARCH */
93+
6994
static struct ftrace_ops direct;
7095

7196
static int __init ftrace_direct_multi_init(void)

samples/ftrace/ftrace-direct-too.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,33 @@ asm (
7070

7171
#endif /* CONFIG_S390 */
7272

73+
#ifdef CONFIG_LOONGARCH
74+
75+
asm (
76+
" .pushsection .text, \"ax\", @progbits\n"
77+
" .type my_tramp, @function\n"
78+
" .globl my_tramp\n"
79+
" my_tramp:\n"
80+
" addi.d $sp, $sp, -48\n"
81+
" st.d $a0, $sp, 0\n"
82+
" st.d $a1, $sp, 8\n"
83+
" st.d $a2, $sp, 16\n"
84+
" st.d $t0, $sp, 24\n"
85+
" st.d $ra, $sp, 32\n"
86+
" bl my_direct_func\n"
87+
" ld.d $a0, $sp, 0\n"
88+
" ld.d $a1, $sp, 8\n"
89+
" ld.d $a2, $sp, 16\n"
90+
" ld.d $t0, $sp, 24\n"
91+
" ld.d $ra, $sp, 32\n"
92+
" addi.d $sp, $sp, 48\n"
93+
" jr $t0\n"
94+
" .size my_tramp, .-my_tramp\n"
95+
" .popsection\n"
96+
);
97+
98+
#endif /* CONFIG_LOONGARCH */
99+
73100
static int __init ftrace_direct_init(void)
74101
{
75102
return register_ftrace_direct((unsigned long)handle_mm_fault,

samples/ftrace/ftrace-direct.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,29 @@ asm (
6363

6464
#endif /* CONFIG_S390 */
6565

66+
#ifdef CONFIG_LOONGARCH
67+
68+
asm (
69+
" .pushsection .text, \"ax\", @progbits\n"
70+
" .type my_tramp, @function\n"
71+
" .globl my_tramp\n"
72+
" my_tramp:\n"
73+
" addi.d $sp, $sp, -32\n"
74+
" st.d $a0, $sp, 0\n"
75+
" st.d $t0, $sp, 8\n"
76+
" st.d $ra, $sp, 16\n"
77+
" bl my_direct_func\n"
78+
" ld.d $a0, $sp, 0\n"
79+
" ld.d $t0, $sp, 8\n"
80+
" ld.d $ra, $sp, 16\n"
81+
" addi.d $sp, $sp, 32\n"
82+
" jr $t0\n"
83+
" .size my_tramp, .-my_tramp\n"
84+
" .popsection\n"
85+
);
86+
87+
#endif /* CONFIG_LOONGARCH */
88+
6689
static int __init ftrace_direct_init(void)
6790
{
6891
return register_ftrace_direct((unsigned long)wake_up_process,

0 commit comments

Comments
 (0)