LoongArch: ftrace: Add direct call trampoline samples support
authorYouling Tang <tangyouling@loongson.cn>
Mon, 1 May 2023 09:19:53 +0000 (17:19 +0800)
committerHuacai Chen <chenhuacai@loongson.cn>
Mon, 1 May 2023 09:19:53 +0000 (17:19 +0800)
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>
arch/loongarch/Kconfig
samples/ftrace/ftrace-direct-modify.c
samples/ftrace/ftrace-direct-multi-modify.c
samples/ftrace/ftrace-direct-multi.c
samples/ftrace/ftrace-direct-too.c
samples/ftrace/ftrace-direct.c

index 3a79bde6bf5b818403ac7570495ebdbe2bb5300c..ac3d3d9b57167eb95de3b8072f2881f6e68d812a 100644 (file)
@@ -120,6 +120,8 @@ config LOONGARCH
        select HAVE_PERF_USER_STACK_DUMP
        select HAVE_REGS_AND_STACK_ACCESS_API
        select HAVE_RSEQ
+       select HAVE_SAMPLE_FTRACE_DIRECT
+       select HAVE_SAMPLE_FTRACE_DIRECT_MULTI
        select HAVE_SETUP_PER_CPU_AREA if NUMA
        select HAVE_STACKPROTECTOR
        select HAVE_SYSCALL_TRACEPOINTS
index d93abbcb1f4c5433fd1b6211fb7670318de2c4f8..ca72c3b710eb5080841a429cdcf268dfb4fada88 100644 (file)
@@ -96,6 +96,40 @@ asm (
 
 #endif /* CONFIG_S390 */
 
+#ifdef CONFIG_LOONGARCH
+
+asm (
+"      .pushsection    .text, \"ax\", @progbits\n"
+"      .type           my_tramp1, @function\n"
+"      .globl          my_tramp1\n"
+"   my_tramp1:\n"
+"      addi.d  $sp, $sp, -16\n"
+"      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"
+"      addi.d  $sp, $sp, 16\n"
+"      jr      $t0\n"
+"      .size           my_tramp1, .-my_tramp1\n"
+
+"      .type           my_tramp2, @function\n"
+"      .globl          my_tramp2\n"
+"   my_tramp2:\n"
+"      addi.d  $sp, $sp, -16\n"
+"      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"
+"      addi.d  $sp, $sp, 16\n"
+"      jr      $t0\n"
+"      .size           my_tramp2, .-my_tramp2\n"
+"      .popsection\n"
+);
+
+#endif /* CONFIG_LOONGARCH */
+
 static unsigned long my_tramp = (unsigned long)my_tramp1;
 static unsigned long tramps[2] = {
        (unsigned long)my_tramp1,
index b58c594efb51e8149efc9705e5007beb484e0122..4708c24d47c6644129524dc1f41e0178bbc88902 100644 (file)
@@ -103,6 +103,47 @@ asm (
 
 #endif /* CONFIG_S390 */
 
+#ifdef CONFIG_LOONGARCH
+#include <asm/asm.h>
+
+asm (
+"      .pushsection    .text, \"ax\", @progbits\n"
+"      .type           my_tramp1, @function\n"
+"      .globl          my_tramp1\n"
+"   my_tramp1:\n"
+"      addi.d  $sp, $sp, -32\n"
+"      st.d    $a0, $sp, 0\n"
+"      st.d    $t0, $sp, 8\n"
+"      st.d    $ra, $sp, 16\n"
+"      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"
+"      addi.d  $sp, $sp, 32\n"
+"      jr      $t0\n"
+"      .size           my_tramp1, .-my_tramp1\n"
+
+"      .type           my_tramp2, @function\n"
+"      .globl          my_tramp2\n"
+"   my_tramp2:\n"
+"      addi.d  $sp, $sp, -32\n"
+"      st.d    $a0, $sp, 0\n"
+"      st.d    $t0, $sp, 8\n"
+"      st.d    $ra, $sp, 16\n"
+"      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"
+"      addi.d  $sp, $sp, 32\n"
+"      jr      $t0\n"
+"      .size           my_tramp2, .-my_tramp2\n"
+"      .popsection\n"
+);
+
+#endif /* CONFIG_LOONGARCH */
+
 static unsigned long my_tramp = (unsigned long)my_tramp1;
 static unsigned long tramps[2] = {
        (unsigned long)my_tramp1,
index c27cf130c3193b88672aeaacd32ddc1ada4911ed..c2f1652c67bc8c2b8922f667ac7956222a9c5978 100644 (file)
@@ -66,6 +66,31 @@ asm (
 
 #endif /* CONFIG_S390 */
 
+#ifdef CONFIG_LOONGARCH
+
+#include <asm/asm.h>
+asm (
+"      .pushsection    .text, \"ax\", @progbits\n"
+"      .type           my_tramp, @function\n"
+"      .globl          my_tramp\n"
+"   my_tramp:\n"
+"      addi.d  $sp, $sp, -32\n"
+"      st.d    $a0, $sp, 0\n"
+"      st.d    $t0, $sp, 8\n"
+"      st.d    $ra, $sp, 16\n"
+"      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"
+"      addi.d  $sp, $sp, 32\n"
+"      jr      $t0\n"
+"      .size           my_tramp, .-my_tramp\n"
+"      .popsection\n"
+);
+
+#endif /* CONFIG_LOONGARCH */
+
 static struct ftrace_ops direct;
 
 static int __init ftrace_direct_multi_init(void)
index 8139dce2a31cbd06b4f56f5463f4436dfe789487..ef64d750977378d2789652b1eac6b033069a6c64 100644 (file)
@@ -70,6 +70,33 @@ asm (
 
 #endif /* CONFIG_S390 */
 
+#ifdef CONFIG_LOONGARCH
+
+asm (
+"      .pushsection    .text, \"ax\", @progbits\n"
+"      .type           my_tramp, @function\n"
+"      .globl          my_tramp\n"
+"   my_tramp:\n"
+"      addi.d  $sp, $sp, -48\n"
+"      st.d    $a0, $sp, 0\n"
+"      st.d    $a1, $sp, 8\n"
+"      st.d    $a2, $sp, 16\n"
+"      st.d    $t0, $sp, 24\n"
+"      st.d    $ra, $sp, 32\n"
+"      bl      my_direct_func\n"
+"      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"
+"      addi.d  $sp, $sp, 48\n"
+"      jr      $t0\n"
+"      .size           my_tramp, .-my_tramp\n"
+"      .popsection\n"
+);
+
+#endif /* CONFIG_LOONGARCH */
+
 static int __init ftrace_direct_init(void)
 {
        return register_ftrace_direct((unsigned long)handle_mm_fault,
index 1d3d307ca33d6e64f5fa6529758d03595dfdfff1..9be720957bf8d06680428ecd37a0e1cdcdc23eec 100644 (file)
@@ -63,6 +63,29 @@ asm (
 
 #endif /* CONFIG_S390 */
 
+#ifdef CONFIG_LOONGARCH
+
+asm (
+"      .pushsection    .text, \"ax\", @progbits\n"
+"      .type           my_tramp, @function\n"
+"      .globl          my_tramp\n"
+"   my_tramp:\n"
+"      addi.d  $sp, $sp, -32\n"
+"      st.d    $a0, $sp, 0\n"
+"      st.d    $t0, $sp, 8\n"
+"      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"
+"      addi.d  $sp, $sp, 32\n"
+"      jr      $t0\n"
+"      .size           my_tramp, .-my_tramp\n"
+"      .popsection\n"
+);
+
+#endif /* CONFIG_LOONGARCH */
+
 static int __init ftrace_direct_init(void)
 {
        return register_ftrace_direct((unsigned long)wake_up_process,