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