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

TOMOYO Linux Cross Reference
Linux/arch/riscv/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 ] ~

Diff markup

Differences between /arch/riscv/kernel/mcount.S (Version linux-6.12-rc7) and /arch/mips/kernel/mcount.S (Version linux-4.4.302)


  1 /* SPDX-License-Identifier: GPL-2.0 */         !!   1 /*
  2 /* Copyright (C) 2017 Andes Technology Corpora !!   2  * MIPS specific _mcount support
                                                   >>   3  *
                                                   >>   4  * This file is subject to the terms and conditions of the GNU General Public
                                                   >>   5  * License.  See the file "COPYING" in the main directory of this archive for
                                                   >>   6  * more details.
                                                   >>   7  *
                                                   >>   8  * Copyright (C) 2009 Lemote Inc. & DSLab, Lanzhou University, China
                                                   >>   9  * Copyright (C) 2010 DSLab, Lanzhou University, China
                                                   >>  10  * Author: Wu Zhangjin <wuzhangjin@gmail.com>
                                                   >>  11  */
  3                                                    12 
  4 #include <linux/init.h>                        !!  13 #include <asm/regdef.h>
  5 #include <linux/linkage.h>                     !!  14 #include <asm/stackframe.h>
  6 #include <linux/cfi_types.h>                   << 
  7 #include <linux/export.h>                      << 
  8 #include <asm/asm.h>                           << 
  9 #include <asm/csr.h>                           << 
 10 #include <asm/unistd.h>                        << 
 11 #include <asm/thread_info.h>                   << 
 12 #include <asm/asm-offsets.h>                   << 
 13 #include <asm/ftrace.h>                            15 #include <asm/ftrace.h>
 14                                                    16 
 15         .text                                      17         .text
                                                   >>  18         .set noreorder
                                                   >>  19         .set noat
 16                                                    20 
 17         .macro SAVE_ABI_STATE                  !!  21         .macro MCOUNT_SAVE_REGS
 18         addi    sp, sp, -16                    !!  22         PTR_SUBU        sp, PT_SIZE
 19         REG_S   s0, 0*SZREG(sp)                !!  23         PTR_S   ra, PT_R31(sp)
 20         REG_S   ra, 1*SZREG(sp)                !!  24         PTR_S   AT, PT_R1(sp)
 21         addi    s0, sp, 16                     !!  25         PTR_S   a0, PT_R4(sp)
                                                   >>  26         PTR_S   a1, PT_R5(sp)
                                                   >>  27         PTR_S   a2, PT_R6(sp)
                                                   >>  28         PTR_S   a3, PT_R7(sp)
                                                   >>  29 #ifdef CONFIG_64BIT
                                                   >>  30         PTR_S   a4, PT_R8(sp)
                                                   >>  31         PTR_S   a5, PT_R9(sp)
                                                   >>  32         PTR_S   a6, PT_R10(sp)
                                                   >>  33         PTR_S   a7, PT_R11(sp)
                                                   >>  34 #endif
 22         .endm                                      35         .endm
 23                                                    36 
 24         /*                                     !!  37         .macro MCOUNT_RESTORE_REGS
 25          * The call to ftrace_return_to_handle !!  38         PTR_L   ra, PT_R31(sp)
 26          * register if a0 was not saved.       !!  39         PTR_L   AT, PT_R1(sp)
 27          */                                    !!  40         PTR_L   a0, PT_R4(sp)
 28         .macro SAVE_RET_ABI_STATE              !!  41         PTR_L   a1, PT_R5(sp)
 29         addi    sp, sp, -4*SZREG               !!  42         PTR_L   a2, PT_R6(sp)
 30         REG_S   s0, 2*SZREG(sp)                !!  43         PTR_L   a3, PT_R7(sp)
 31         REG_S   ra, 3*SZREG(sp)                !!  44 #ifdef CONFIG_64BIT
 32         REG_S   a0, 1*SZREG(sp)                !!  45         PTR_L   a4, PT_R8(sp)
 33         REG_S   a1, 0*SZREG(sp)                !!  46         PTR_L   a5, PT_R9(sp)
 34         addi    s0, sp, 4*SZREG                !!  47         PTR_L   a6, PT_R10(sp)
                                                   >>  48         PTR_L   a7, PT_R11(sp)
                                                   >>  49 #endif
                                                   >>  50         PTR_ADDIU       sp, PT_SIZE
 35         .endm                                      51         .endm
 36                                                    52 
 37         .macro RESTORE_ABI_STATE               !!  53         .macro RETURN_BACK
 38         REG_L   ra, 1*SZREG(sp)                !!  54         jr ra
 39         REG_L   s0, 0*SZREG(sp)                !!  55          move ra, AT
 40         addi    sp, sp, 16                     << 
 41         .endm                                      56         .endm
 42                                                    57 
 43         .macro RESTORE_RET_ABI_STATE           !!  58 /*
 44         REG_L   ra, 3*SZREG(sp)                !!  59  * The -mmcount-ra-address option of gcc 4.5 uses register $12 to pass
 45         REG_L   s0, 2*SZREG(sp)                !!  60  * the location of the parent's return address.
 46         REG_L   a0, 1*SZREG(sp)                !!  61  */
 47         REG_L   a1, 0*SZREG(sp)                !!  62 #define MCOUNT_RA_ADDRESS_REG   $12
 48         addi    sp, sp, 4*SZREG                << 
 49         .endm                                  << 
 50                                                    63 
 51 SYM_TYPED_FUNC_START(ftrace_stub)              << 
 52 #ifdef CONFIG_DYNAMIC_FTRACE                       64 #ifdef CONFIG_DYNAMIC_FTRACE
 53        .global _mcount                         !!  65 
 54        .set    _mcount, ftrace_stub            !!  66 NESTED(ftrace_caller, PT_SIZE, ra)
 55 #endif                                         !!  67         .globl _mcount
 56         ret                                    !!  68 _mcount:
 57 SYM_FUNC_END(ftrace_stub)                      !!  69         b       ftrace_stub
                                                   >>  70 #ifdef CONFIG_32BIT
                                                   >>  71          addiu sp,sp,8
                                                   >>  72 #else
                                                   >>  73          nop
                                                   >>  74 #endif
                                                   >>  75 
                                                   >>  76         /* When tracing is activated, it calls ftrace_caller+8 (aka here) */
                                                   >>  77         MCOUNT_SAVE_REGS
                                                   >>  78 #ifdef KBUILD_MCOUNT_RA_ADDRESS
                                                   >>  79         PTR_S   MCOUNT_RA_ADDRESS_REG, PT_R12(sp)
                                                   >>  80 #endif
                                                   >>  81 
                                                   >>  82         PTR_SUBU a0, ra, 8      /* arg1: self address */
                                                   >>  83         PTR_LA   t1, _stext
                                                   >>  84         sltu     t2, a0, t1     /* t2 = (a0 < _stext) */
                                                   >>  85         PTR_LA   t1, _etext
                                                   >>  86         sltu     t3, t1, a0     /* t3 = (a0 > _etext) */
                                                   >>  87         or       t1, t2, t3
                                                   >>  88         beqz     t1, ftrace_call
                                                   >>  89          nop
                                                   >>  90 #if defined(KBUILD_MCOUNT_RA_ADDRESS) && defined(CONFIG_32BIT)
                                                   >>  91         PTR_SUBU a0, a0, 16     /* arg1: adjust to module's recorded callsite */
                                                   >>  92 #else
                                                   >>  93         PTR_SUBU a0, a0, 12
                                                   >>  94 #endif
                                                   >>  95 
                                                   >>  96         .globl ftrace_call
                                                   >>  97 ftrace_call:
                                                   >>  98         nop     /* a placeholder for the call to a real tracing function */
                                                   >>  99          move   a1, AT          /* arg2: parent's return address */
 58                                                   100 
 59 #ifdef CONFIG_FUNCTION_GRAPH_TRACER               101 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
 60 SYM_TYPED_FUNC_START(ftrace_stub_graph)        !! 102         .globl ftrace_graph_call
 61         ret                                    !! 103 ftrace_graph_call:
 62 SYM_FUNC_END(ftrace_stub_graph)                !! 104         nop
                                                   >> 105          nop
                                                   >> 106 #endif
 63                                                   107 
 64 SYM_FUNC_START(return_to_handler)              !! 108         MCOUNT_RESTORE_REGS
 65 /*                                             !! 109         .globl ftrace_stub
 66  * On implementing the frame point test, the i !! 110 ftrace_stub:
 67  * s0 (frame pointer, if enabled) on entry and !! 111         RETURN_BACK
 68  * However, the psABI of variable-length-argum !! 112         END(ftrace_caller)
 69  *                                             !! 113 
 70  * So alternatively we check the *old* frame p !! 114 #else   /* ! CONFIG_DYNAMIC_FTRACE */
 71  * value stored in -16(s0) on entry, and the s !! 115 
 72  */                                            !! 116 NESTED(_mcount, PT_SIZE, ra)
 73         SAVE_RET_ABI_STATE                     !! 117         PTR_LA  t1, ftrace_stub
 74         mv      a0, sp                         !! 118         PTR_L   t2, ftrace_trace_function /* Prepare t2 for (1) */
 75         call    ftrace_return_to_handler       !! 119         beq     t1, t2, fgraph_trace
 76         mv      a2, a0                         !! 120          nop
 77         RESTORE_RET_ABI_STATE                  !! 121 
 78         jalr    a2                             !! 122         MCOUNT_SAVE_REGS
 79 SYM_FUNC_END(return_to_handler)                !! 123 
                                                   >> 124         move    a0, ra          /* arg1: self return address */
                                                   >> 125         jalr    t2              /* (1) call *ftrace_trace_function */
                                                   >> 126          move   a1, AT          /* arg2: parent's return address */
                                                   >> 127 
                                                   >> 128         MCOUNT_RESTORE_REGS
                                                   >> 129 
                                                   >> 130 fgraph_trace:
                                                   >> 131 #ifdef  CONFIG_FUNCTION_GRAPH_TRACER
                                                   >> 132         PTR_LA  t1, ftrace_stub
                                                   >> 133         PTR_L   t3, ftrace_graph_return
                                                   >> 134         bne     t1, t3, ftrace_graph_caller
                                                   >> 135          nop
                                                   >> 136         PTR_LA  t1, ftrace_graph_entry_stub
                                                   >> 137         PTR_L   t3, ftrace_graph_entry
                                                   >> 138         bne     t1, t3, ftrace_graph_caller
                                                   >> 139          nop
 80 #endif                                            140 #endif
 81                                                   141 
 82 #ifndef CONFIG_DYNAMIC_FTRACE                  !! 142 #ifdef CONFIG_32BIT
 83 SYM_FUNC_START(_mcount)                        !! 143         addiu sp, sp, 8
 84         la      t4, ftrace_stub                !! 144 #endif
 85 #ifdef CONFIG_FUNCTION_GRAPH_TRACER            !! 145 
 86         la      t0, ftrace_graph_return        !! 146         .globl ftrace_stub
 87         REG_L   t1, 0(t0)                      !! 147 ftrace_stub:
 88         bne     t1, t4, .Ldo_ftrace_graph_call !! 148         RETURN_BACK
 89                                                !! 149         END(_mcount)
 90         la      t3, ftrace_graph_entry         !! 150 
 91         REG_L   t2, 0(t3)                      !! 151 #endif  /* ! CONFIG_DYNAMIC_FTRACE */
 92         la      t6, ftrace_graph_entry_stub    << 
 93         bne     t2, t6, .Ldo_ftrace_graph_call << 
 94 #endif                                         << 
 95         la      t3, ftrace_trace_function      << 
 96         REG_L   t5, 0(t3)                      << 
 97         bne     t5, t4, .Ldo_trace             << 
 98         ret                                    << 
 99                                                   152 
100 #ifdef CONFIG_FUNCTION_GRAPH_TRACER               153 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
101 /*                                             !! 154 
102  * A pseudo representation for the function gr !! 155 NESTED(ftrace_graph_caller, PT_SIZE, ra)
103  * prepare_to_return(&ra_to_caller_of_caller,  !! 156 #ifndef CONFIG_DYNAMIC_FTRACE
104  */                                            !! 157         MCOUNT_SAVE_REGS
105 .Ldo_ftrace_graph_caller:                      << 
106         addi    a0, s0, -SZREG                 << 
107         mv      a1, ra                         << 
108 #ifdef HAVE_FUNCTION_GRAPH_FP_TEST             << 
109         REG_L   a2, -2*SZREG(s0)               << 
110 #endif                                         << 
111         SAVE_ABI_STATE                         << 
112         call    prepare_ftrace_return          << 
113         RESTORE_ABI_STATE                      << 
114         ret                                    << 
115 #endif                                            158 #endif
116                                                   159 
117 /*                                             !! 160         /* arg1: Get the location of the parent's return address */
118  * A pseudo representation for the function tr !! 161 #ifdef KBUILD_MCOUNT_RA_ADDRESS
119  * (*ftrace_trace_function)(ra_to_caller, ra_t !! 162 #ifdef CONFIG_DYNAMIC_FTRACE
120  */                                            !! 163         PTR_L   a0, PT_R12(sp)
121 .Ldo_trace:                                    !! 164 #else
122         REG_L   a1, -SZREG(s0)                 !! 165         move    a0, MCOUNT_RA_ADDRESS_REG
123         mv      a0, ra                         !! 166 #endif
124                                                !! 167         bnez    a0, 1f  /* non-leaf func: stored in MCOUNT_RA_ADDRESS_REG */
125         SAVE_ABI_STATE                         !! 168          nop
126         jalr    t5                             !! 169 #endif
127         RESTORE_ABI_STATE                      !! 170         PTR_LA  a0, PT_R1(sp)   /* leaf func: the location in current stack */
128         ret                                    !! 171 1:
129 SYM_FUNC_END(_mcount)                          !! 172 
                                                   >> 173         /* arg2: Get self return address */
                                                   >> 174 #ifdef CONFIG_DYNAMIC_FTRACE
                                                   >> 175         PTR_L   a1, PT_R31(sp)
                                                   >> 176 #else
                                                   >> 177         move    a1, ra
                                                   >> 178 #endif
                                                   >> 179 
                                                   >> 180         /* arg3: Get frame pointer of current stack */
                                                   >> 181 #ifdef CONFIG_64BIT
                                                   >> 182         PTR_LA  a2, PT_SIZE(sp)
                                                   >> 183 #else
                                                   >> 184         PTR_LA  a2, (PT_SIZE+8)(sp)
                                                   >> 185 #endif
                                                   >> 186 
                                                   >> 187         jal     prepare_ftrace_return
                                                   >> 188          nop
                                                   >> 189         MCOUNT_RESTORE_REGS
                                                   >> 190 #ifndef CONFIG_DYNAMIC_FTRACE
                                                   >> 191 #ifdef CONFIG_32BIT
                                                   >> 192         addiu sp, sp, 8
130 #endif                                            193 #endif
131 EXPORT_SYMBOL(_mcount)                         !! 194 #endif
                                                   >> 195         RETURN_BACK
                                                   >> 196         END(ftrace_graph_caller)
                                                   >> 197 
                                                   >> 198         .align  2
                                                   >> 199         .globl  return_to_handler
                                                   >> 200 return_to_handler:
                                                   >> 201         PTR_SUBU        sp, PT_SIZE
                                                   >> 202         PTR_S   v0, PT_R2(sp)
                                                   >> 203 
                                                   >> 204         jal     ftrace_return_to_handler
                                                   >> 205          PTR_S  v1, PT_R3(sp)
                                                   >> 206 
                                                   >> 207         /* restore the real parent address: v0 -> ra */
                                                   >> 208         move    ra, v0
                                                   >> 209 
                                                   >> 210         PTR_L   v0, PT_R2(sp)
                                                   >> 211         PTR_L   v1, PT_R3(sp)
                                                   >> 212         jr      ra
                                                   >> 213          PTR_ADDIU      sp, PT_SIZE
                                                   >> 214 #endif /* CONFIG_FUNCTION_GRAPH_TRACER */
                                                   >> 215 
                                                   >> 216         .set at
                                                   >> 217         .set reorder
                                                      

~ [ 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