~ [ 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.16.18)


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