sw64: 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 (eg: $26).

Signed-off-by: Gu Yuchen <guyuchen@wxiat.com>
Reviewed-by: He Sheng <hesheng@wxiat.com>
Signed-off-by: Gu Zitao <guzitao@wxiat.com>
This commit is contained in:
Gu Yuchen 2025-05-23 18:24:49 +08:00 committed by Avenger-285714
parent b944542db4
commit 4477553a17
6 changed files with 271 additions and 0 deletions

View File

@ -120,6 +120,8 @@ config SW64
select HAVE_RELIABLE_STACKTRACE if STACKTRACE
select HAVE_RETHOOK
select HAVE_RSEQ
select HAVE_SAMPLE_FTRACE_DIRECT
select HAVE_SAMPLE_FTRACE_DIRECT_MULTI
select HAVE_SYSCALL_TRACEPOINTS
select IRQ_DOMAIN
select IRQ_FORCED_THREADING

View File

@ -164,6 +164,74 @@ asm (
#endif /* CONFIG_LOONGARCH */
#ifdef CONFIG_SW64
asm (
" .pushsection .text, \"ax\", @progbits\n"
" .type my_tramp1, @function\n"
" .globl my_tramp1\n"
" my_tramp1:\n"
" subl $sp, 0x10, $sp\n"
" stl $26, 0($sp)\n"
" stl $15, 0x8($sp)\n"
" ldi $15, 0($sp)\n"
/* save $28 & fp of caller */
" subl $sp, 0x10, $sp\n"
" stl $28, 0($sp)\n"
" stl $15, 0x8($sp)\n"
" ldi $15, 0($sp)\n"
/* save other regs */
" subl $sp, 0x18, $sp\n"
" stl $26, 0($sp)\n"
" stl $28, 0x8($sp)\n"
" stl $29, 0x10($sp)\n"
" br $27, 1f\n"
"1: ldgp $29, 0($27)\n"
" call my_direct_func1\n"
/* restore all regs */
" ldl $26, 0x0($sp)\n"
" ldl $28, 0x8($sp)\n"
" ldl $29, 0x10($sp)\n"
" addl $sp, 0x18, $sp\n"
" ldl $15, 0x18($sp)\n"
" addl $sp, 0x20, $sp\n"
" ret $31, ($28), 1\n"
" .size my_tramp1, .-my_tramp1\n"
" .type my_tramp2, @function\n"
" .globl my_tramp2\n"
" my_tramp2:\n"
" subl $sp, 0x10, $sp\n"
" stl $26, 0($sp)\n"
" stl $15, 0x8($sp)\n"
" ldi $15, 0($sp)\n"
/* save $28 & fp of caller */
" subl $sp, 0x10, $sp\n"
" stl $28, 0($sp)\n"
" stl $15, 0x8($sp)\n"
" ldi $15, 0($sp)\n"
/* save other regs */
" subl $sp, 0x18, $sp\n"
" stl $26, 0($sp)\n"
" stl $28, 0x8($sp)\n"
" stl $29, 0x10($sp)\n"
" br $27, 1f\n"
"1: ldgp $29, 0($27)\n"
" call my_direct_func2\n"
/* restore all regs */
" ldl $26, 0x0($sp)\n"
" ldl $28, 0x8($sp)\n"
" ldl $29, 0x10($sp)\n"
" addl $sp, 0x18, $sp\n"
" ldl $15, 0x18($sp)\n"
" addl $sp, 0x20, $sp\n"
" ret $31, ($28), 1\n"
" .size my_tramp2, .-my_tramp2\n"
" .popsection\n"
);
#endif /* CONFIG_SW64 */
static struct ftrace_ops direct;
static unsigned long my_tramp = (unsigned long)my_tramp1;

View File

@ -184,6 +184,80 @@ asm (
#endif /* CONFIG_LOONGARCH */
#ifdef CONFIG_SW64
asm (
" .pushsection .text, \"ax\", @progbits\n"
" .type my_tramp1, @function\n"
" .globl my_tramp1\n"
" my_tramp1:\n"
" subl $sp, 0x10, $sp\n"
" stl $26, 0($sp)\n"
" stl $15, 0x8($sp)\n"
" ldi $15, 0($sp)\n"
/* save $28 & fp of caller */
" subl $sp, 0x10, $sp\n"
" stl $28, 0($sp)\n"
" stl $15, 0x8($sp)\n"
" ldi $15, 0($sp)\n"
/* save other regs */
" subl $sp, 0x20, $sp\n"
" stl $16, 0($sp)\n"
" stl $26, 0x8($sp)\n"
" stl $28, 0x10($sp)\n"
" stl $29, 0x18($sp)\n"
" mov $28, $16\n"
" br $27, 1f\n"
"1: ldgp $29, 0($27)\n"
" call my_direct_func1\n"
/* restore all regs */
" ldl $16, 0($sp)\n"
" ldl $26, 0x8($sp)\n"
" ldl $28, 0x10($sp)\n"
" ldl $29, 0x18($sp)\n"
" addl $sp, 0x20, $sp\n"
" ldl $15, 0x18($sp)\n"
" addl $sp, 0x20, $sp\n"
" ret $31, ($28), 1\n"
" .size my_tramp1, .-my_tramp1\n"
" .type my_tramp2, @function\n"
" .globl my_tramp2\n"
" my_tramp2:\n"
" subl $sp, 0x10, $sp\n"
" stl $26, 0($sp)\n"
" stl $15, 0x8($sp)\n"
" ldi $15, 0($sp)\n"
/* save $28 & fp of caller */
" subl $sp, 0x10, $sp\n"
" stl $28, 0($sp)\n"
" stl $15, 0x8($sp)\n"
" ldi $15, 0($sp)\n"
/* save other regs */
" subl $sp, 0x20, $sp\n"
" stl $16, 0($sp)\n"
" stl $26, 0x8($sp)\n"
" stl $28, 0x10($sp)\n"
" stl $29, 0x18($sp)\n"
" mov $28, $16\n"
" br $27, 1f\n"
"1: ldgp $29, 0($2)\n"
" call my_direct_func2\n"
/* restore all regs */
" ldl $16, 0($sp)\n"
" ldl $26, 0x8($sp)\n"
" ldl $28, 0x10($sp)\n"
" ldl $29, 0x18($sp)\n"
" addl $sp, 0x20, $sp\n"
" ldl $15, 0x18($sp)\n"
" addl $sp, 0x20, $sp\n"
" ret $31, ($28), 1\n"
" .size my_tramp2, .-my_tramp2\n"
" .popsection\n"
);
#endif /* CONFIG_SW64 */
static unsigned long my_tramp = (unsigned long)my_tramp1;
static unsigned long tramps[2] = {
(unsigned long)my_tramp1,

View File

@ -116,6 +116,47 @@ asm (
#endif /* CONFIG_LOONGARCH */
#ifdef CONFIG_SW64
asm (
" .pushsection .text, \"ax\", @progbits\n"
" .type my_tramp, @function\n"
" .globl my_tramp\n"
" my_tramp:\n"
" subl $sp, 0x10, $sp\n"
" stl $26, 0($sp)\n"
" stl $15, 0x8($sp)\n"
" ldi $15, 0($sp)\n"
/* save $28 & fp of caller */
" subl $sp, 0x10, $sp\n"
" stl $28, 0($sp)\n"
" stl $15, 0x8($sp)\n"
" ldi $15, 0($sp)\n"
/* save other regs */
" subl $sp, 0x20, $sp\n"
" stl $16, 0($sp)\n"
" stl $26, 0x8($sp)\n"
" stl $28, 0x10($sp)\n"
" stl $29, 0x18($sp)\n"
" mov $28, $16\n"
" br $27, 1f\n"
"1: ldgp $29, 0($27)\n"
" call my_direct_func\n"
/* restore all regs */
" ldl $16, 0($sp)\n"
" ldl $26, 0x8($sp)\n"
" ldl $28, 0x10($sp)\n"
" ldl $29, 0x18($sp)\n"
" addl $sp, 0x20, $sp\n"
" ldl $15, 0x18($sp)\n"
" addl $sp, 0x20, $sp\n"
" ret $31, ($28), 1\n"
" .size my_tramp, .-my_tramp\n"
" .popsection\n"
);
#endif /* CONFIG_SW64 */
static struct ftrace_ops direct;
static int __init ftrace_direct_multi_init(void)

View File

@ -125,6 +125,52 @@ asm (
#endif /* CONFIG_LOONGARCH */
#ifdef CONFIG_SW64
asm (
" .pushsection .text, \"ax\", @progbits\n"
" .type my_tramp, @function\n"
" .globl my_tramp\n"
" my_tramp:\n"
" subl $sp, 0x10, $sp\n"
" stl $26, 0($sp)\n"
" stl $15, 0x8($sp)\n"
" ldi $15, 0($sp)\n"
/* save $28 & fp of caller */
" subl $sp, 0x10, $sp\n"
" stl $28, 0($sp)\n"
" stl $15, 0x8($sp)\n"
" ldi $15, 0($sp)\n"
/* save other regs */
" subl $sp, 0x38, $sp\n"
" stl $16, 0($sp)\n"
" stl $17, 0x8($sp)\n"
" stl $18, 0x10($sp)\n"
" stl $19, 0x18($sp)\n"
" stl $26, 0x20($sp)\n"
" stl $28, 0x28($sp)\n"
" stl $29, 0x30($sp)\n"
" br $27, 1f\n"
"1: ldgp $29, 0($27)\n"
" call my_direct_func\n"
/* restore all regs */
" ldl $16, 0($sp)\n"
" ldl $17, 0x8($sp)\n"
" ldl $18, 0x10($sp)\n"
" stl $19, 0x18($sp)\n"
" ldl $26, 0x20($sp)\n"
" ldl $28, 0x28($sp)\n"
" ldl $29, 0x30($sp)\n"
" addl $sp, 0x38, $sp\n"
" ldl $15, 0x18($sp)\n"
" addl $sp, 0x20, $sp\n"
" ret $31, ($28), 1\n"
" .size my_tramp, .-my_tramp\n"
" .popsection\n"
);
#endif /* CONFIG_SW64 */
static struct ftrace_ops direct;
static int __init ftrace_direct_init(void)

View File

@ -110,6 +110,46 @@ asm (
#endif /* CONFIG_LOONGARCH */
#ifdef CONFIG_SW64
asm (
" .pushsection .text, \"ax\", @progbits\n"
" .type my_tramp, @function\n"
" .globl my_tramp\n"
" my_tramp:\n"
" subl $sp, 0x10, $sp\n"
" stl $26, 0($sp)\n"
" stl $15, 0x8($sp)\n"
" ldi $15, 0($sp)\n"
/* save $28 & fp of caller */
" subl $sp, 0x10, $sp\n"
" stl $28, 0($sp)\n"
" stl $15, 0x8($sp)\n"
" ldi $15, 0($sp)\n"
/* save other regs */
" subl $sp, 0x20, $sp\n"
" stl $16, 0($sp)\n"
" stl $26, 0x8($sp)\n"
" stl $28, 0x10($sp)\n"
" stl $29, 0x18($sp)\n"
" br $27, 1f\n"
"1: ldgp $29, 0($27)\n"
" call my_direct_func\n"
/* restore all regs */
" ldl $16, 0($sp)\n"
" ldl $26, 0x8($sp)\n"
" ldl $28, 0x10($sp)\n"
" ldl $29, 0x18($sp)\n"
" addl $sp, 0x20, $sp\n"
" ldl $15, 0x18($sp)\n"
" addl $sp, 0x20, $sp\n"
" ret $31, ($28), 1\n"
" .size my_tramp, .-my_tramp\n"
" .popsection\n"
);
#endif /* CONFIG_SW64 */
static struct ftrace_ops direct;
static int __init ftrace_direct_init(void)