~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/loongarch/kernel/mcount.S

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* SPDX-License-Identifier: GPL-2.0 */
  2 /*
  3  * LoongArch specific _mcount support
  4  *
  5  * Copyright (C) 2022 Loongson Technology Corporation Limited
  6  */
  7 
  8 #include <linux/export.h>
  9 #include <asm/ftrace.h>
 10 #include <asm/regdef.h>
 11 #include <asm/stackframe.h>
 12 
 13         .text
 14 
 15 #define MCOUNT_S0_OFFSET        (0)
 16 #define MCOUNT_RA_OFFSET        (SZREG)
 17 #define MCOUNT_STACK_SIZE       (2 * SZREG)
 18 
 19         .macro MCOUNT_SAVE_REGS
 20         PTR_ADDI        sp, sp, -MCOUNT_STACK_SIZE
 21         PTR_S           s0, sp, MCOUNT_S0_OFFSET
 22         PTR_S           ra, sp, MCOUNT_RA_OFFSET
 23         move            s0, a0
 24         .endm
 25 
 26         .macro MCOUNT_RESTORE_REGS
 27         move            a0, s0
 28         PTR_L           ra, sp, MCOUNT_RA_OFFSET
 29         PTR_L           s0, sp, MCOUNT_S0_OFFSET
 30         PTR_ADDI        sp, sp, MCOUNT_STACK_SIZE
 31         .endm
 32 
 33 SYM_FUNC_START(_mcount)
 34         la.pcrel        t1, ftrace_stub
 35         la.pcrel        t2, ftrace_trace_function       /* Prepare t2 for (1) */
 36         PTR_L           t2, t2, 0
 37         beq             t1, t2, fgraph_trace
 38 
 39         MCOUNT_SAVE_REGS
 40 
 41         move            a0, ra                          /* arg0: self return address */
 42         move            a1, s0                          /* arg1: parent's return address */
 43         jirl            ra, t2, 0                       /* (1) call *ftrace_trace_function */
 44 
 45         MCOUNT_RESTORE_REGS
 46 
 47 fgraph_trace:
 48 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
 49         la.pcrel        t1, ftrace_stub
 50         la.pcrel        t3, ftrace_graph_return
 51         PTR_L           t3, t3, 0
 52         bne             t1, t3, ftrace_graph_caller
 53         la.pcrel        t1, ftrace_graph_entry_stub
 54         la.pcrel        t3, ftrace_graph_entry
 55         PTR_L           t3, t3, 0
 56         bne             t1, t3, ftrace_graph_caller
 57 #endif
 58 
 59 SYM_INNER_LABEL(ftrace_stub, SYM_L_GLOBAL)
 60         jr              ra
 61 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
 62 SYM_INNER_LABEL(ftrace_graph_func, SYM_L_GLOBAL)
 63         bl              ftrace_stub
 64 #endif
 65 SYM_FUNC_END(_mcount)
 66 EXPORT_SYMBOL(_mcount)
 67 
 68 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
 69 SYM_FUNC_START(ftrace_graph_caller)
 70         MCOUNT_SAVE_REGS
 71 
 72         PTR_ADDI        a0, ra, -4                      /* arg0: Callsite self return addr */
 73         PTR_ADDI        a1, sp, MCOUNT_STACK_SIZE       /* arg1: Callsite sp */
 74         move            a2, s0                          /* arg2: Callsite parent ra */
 75         bl              prepare_ftrace_return
 76 
 77         MCOUNT_RESTORE_REGS
 78         jr              ra
 79 SYM_FUNC_END(ftrace_graph_caller)
 80 
 81 SYM_FUNC_START(return_to_handler)
 82         PTR_ADDI        sp, sp, -FGRET_REGS_SIZE
 83         PTR_S           a0, sp, FGRET_REGS_A0
 84         PTR_S           a1, sp, FGRET_REGS_A1
 85         PTR_S           zero, sp, FGRET_REGS_FP
 86 
 87         move            a0, sp
 88         bl              ftrace_return_to_handler
 89 
 90         /* Restore the real parent address: a0 -> ra */
 91         move            ra, a0
 92 
 93         PTR_L           a0, sp, FGRET_REGS_A0
 94         PTR_L           a1, sp, FGRET_REGS_A1
 95         PTR_ADDI        sp, sp, FGRET_REGS_SIZE
 96         jr              ra
 97 SYM_FUNC_END(return_to_handler)
 98 #endif /* CONFIG_FUNCTION_GRAPH_TRACER */

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php