Commit bb85d206 authored by Chenghao Duan's avatar Chenghao Duan Committed by Huacai Chen
Browse files

samples/ftrace: Adjust LoongArch register restore order in direct calls



Ensure that in the ftrace direct call logic, the CPU register state
(with ra = parent return address) is restored to the correct state after
the execution of the custom trampoline function and before returning to
the traced function. Additionally, guarantee the correctness of the jump
logic for jr t0 (traced function address).

Cc: stable@vger.kernel.org
Fixes: 9cdc3b6a ("LoongArch: ftrace: Add direct call support")
Reported-by: default avatarYouling Tang <tangyouling@kylinos.cn>
Acked-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
Signed-off-by: default avatarChenghao Duan <duanchenghao@kylinos.cn>
Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
parent 73721d86
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -176,8 +176,8 @@ asm (
"	st.d	$t0, $sp, 0\n"
"	st.d	$ra, $sp, 8\n"
"	bl	my_direct_func1\n"
"	ld.d	$t0, $sp, 0\n"
"	ld.d	$ra, $sp, 8\n"
"	ld.d	$ra, $sp, 0\n"
"	ld.d	$t0, $sp, 8\n"
"	addi.d	$sp, $sp, 16\n"
"	jr	$t0\n"
"	.size		my_tramp1, .-my_tramp1\n"
@@ -189,8 +189,8 @@ asm (
"	st.d	$t0, $sp, 0\n"
"	st.d	$ra, $sp, 8\n"
"	bl	my_direct_func2\n"
"	ld.d	$t0, $sp, 0\n"
"	ld.d	$ra, $sp, 8\n"
"	ld.d	$ra, $sp, 0\n"
"	ld.d	$t0, $sp, 8\n"
"	addi.d	$sp, $sp, 16\n"
"	jr	$t0\n"
"	.size		my_tramp2, .-my_tramp2\n"
+4 −4
Original line number Diff line number Diff line
@@ -199,8 +199,8 @@ asm (
"	move	$a0, $t0\n"
"	bl	my_direct_func1\n"
"	ld.d	$a0, $sp, 0\n"
"	ld.d	$t0, $sp, 8\n"
"	ld.d	$ra, $sp, 16\n"
"	ld.d	$ra, $sp, 8\n"
"	ld.d	$t0, $sp, 16\n"
"	addi.d	$sp, $sp, 32\n"
"	jr	$t0\n"
"	.size		my_tramp1, .-my_tramp1\n"
@@ -215,8 +215,8 @@ asm (
"	move	$a0, $t0\n"
"	bl	my_direct_func2\n"
"	ld.d	$a0, $sp, 0\n"
"	ld.d	$t0, $sp, 8\n"
"	ld.d	$ra, $sp, 16\n"
"	ld.d	$ra, $sp, 8\n"
"	ld.d	$t0, $sp, 16\n"
"	addi.d	$sp, $sp, 32\n"
"	jr	$t0\n"
"	.size		my_tramp2, .-my_tramp2\n"
+2 −2
Original line number Diff line number Diff line
@@ -131,8 +131,8 @@ asm (
"	move	$a0, $t0\n"
"	bl	my_direct_func\n"
"	ld.d	$a0, $sp, 0\n"
"	ld.d	$t0, $sp, 8\n"
"	ld.d	$ra, $sp, 16\n"
"	ld.d	$ra, $sp, 8\n"
"	ld.d	$t0, $sp, 16\n"
"	addi.d	$sp, $sp, 32\n"
"	jr	$t0\n"
"	.size		my_tramp, .-my_tramp\n"
+2 −2
Original line number Diff line number Diff line
@@ -143,8 +143,8 @@ asm (
"	ld.d	$a0, $sp, 0\n"
"	ld.d	$a1, $sp, 8\n"
"	ld.d	$a2, $sp, 16\n"
"	ld.d	$t0, $sp, 24\n"
"	ld.d	$ra, $sp, 32\n"
"	ld.d	$ra, $sp, 24\n"
"	ld.d	$t0, $sp, 32\n"
"	addi.d	$sp, $sp, 48\n"
"	jr	$t0\n"
"	.size		my_tramp, .-my_tramp\n"
+2 −2
Original line number Diff line number Diff line
@@ -124,8 +124,8 @@ asm (
"	st.d	$ra, $sp, 16\n"
"	bl	my_direct_func\n"
"	ld.d	$a0, $sp, 0\n"
"	ld.d	$t0, $sp, 8\n"
"	ld.d	$ra, $sp, 16\n"
"	ld.d	$ra, $sp, 8\n"
"	ld.d	$t0, $sp, 16\n"
"	addi.d	$sp, $sp, 32\n"
"	jr	$t0\n"
"	.size		my_tramp, .-my_tramp\n"