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:
parent
b944542db4
commit
4477553a17
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue