1 /* SPDX-License-Identifier: GPL-2.0 */ << 2 /* 1 /* 3 * Copyright (C) 2000 Anton Blanchard (anton@l 2 * Copyright (C) 2000 Anton Blanchard (anton@linuxcare.com) 4 * 3 * 5 * This file implements mcount(), which is use 4 * This file implements mcount(), which is used to collect profiling data. 6 * This can also be tweaked for kernel stack o 5 * This can also be tweaked for kernel stack overflow detection. 7 */ 6 */ 8 7 9 #include <linux/export.h> << 10 #include <linux/linkage.h> 8 #include <linux/linkage.h> 11 9 12 /* 10 /* 13 * This is the main variant and is called by C 11 * This is the main variant and is called by C code. GCC's -pg option 14 * automatically instruments every C function 12 * automatically instruments every C function with a call to this. 15 */ 13 */ 16 14 17 .text 15 .text 18 .align 32 16 .align 32 19 .globl _mcount 17 .globl _mcount 20 .type _mcount,#function 18 .type _mcount,#function 21 EXPORT_SYMBOL(_mcount) << 22 .globl mcount 19 .globl mcount 23 .type mcount,#function 20 .type mcount,#function 24 _mcount: 21 _mcount: 25 mcount: 22 mcount: 26 #ifdef CONFIG_FUNCTION_TRACER 23 #ifdef CONFIG_FUNCTION_TRACER 27 #ifdef CONFIG_DYNAMIC_FTRACE 24 #ifdef CONFIG_DYNAMIC_FTRACE 28 /* Do nothing, the retl/nop below is a 25 /* Do nothing, the retl/nop below is all we need. */ 29 #else 26 #else 30 sethi %hi(ftrace_trace_funct !! 27 sethi %hi(function_trace_stop), %g1 >> 28 lduw [%g1 + %lo(function_trace_stop)], %g2 >> 29 brnz,pn %g2, 2f >> 30 sethi %hi(ftrace_trace_function), %g1 31 sethi %hi(ftrace_stub), %g2 31 sethi %hi(ftrace_stub), %g2 32 ldx [%g1 + %lo(ftrace_trac 32 ldx [%g1 + %lo(ftrace_trace_function)], %g1 33 or %g2, %lo(ftrace_stub), 33 or %g2, %lo(ftrace_stub), %g2 34 cmp %g1, %g2 34 cmp %g1, %g2 35 be,pn %icc, 1f 35 be,pn %icc, 1f 36 mov %i7, %g3 36 mov %i7, %g3 37 save %sp, -176, %sp 37 save %sp, -176, %sp 38 mov %g3, %o1 38 mov %g3, %o1 39 jmpl %g1, %o7 39 jmpl %g1, %o7 40 mov %i7, %o0 40 mov %i7, %o0 41 ret 41 ret 42 restore 42 restore 43 /* not reached */ 43 /* not reached */ 44 1: 44 1: 45 #ifdef CONFIG_FUNCTION_GRAPH_TRACER 45 #ifdef CONFIG_FUNCTION_GRAPH_TRACER 46 sethi %hi(ftrace_graph_retur 46 sethi %hi(ftrace_graph_return), %g1 47 ldx [%g1 + %lo(ftrace_grap 47 ldx [%g1 + %lo(ftrace_graph_return)], %g3 48 cmp %g2, %g3 48 cmp %g2, %g3 49 bne,pn %xcc, 5f 49 bne,pn %xcc, 5f 50 sethi %hi(ftrace_graph_entry 50 sethi %hi(ftrace_graph_entry_stub), %g2 51 sethi %hi(ftrace_graph_entry 51 sethi %hi(ftrace_graph_entry), %g1 52 or %g2, %lo(ftrace_graph_ 52 or %g2, %lo(ftrace_graph_entry_stub), %g2 53 ldx [%g1 + %lo(ftrace_grap 53 ldx [%g1 + %lo(ftrace_graph_entry)], %g1 54 cmp %g1, %g2 54 cmp %g1, %g2 55 be,pt %xcc, 2f 55 be,pt %xcc, 2f 56 nop 56 nop 57 5: mov %i7, %g2 57 5: mov %i7, %g2 58 mov %fp, %g3 58 mov %fp, %g3 59 save %sp, -176, %sp 59 save %sp, -176, %sp 60 mov %g2, %l0 60 mov %g2, %l0 61 ba,pt %xcc, ftrace_graph_cal 61 ba,pt %xcc, ftrace_graph_caller 62 mov %g3, %l1 62 mov %g3, %l1 63 #endif 63 #endif 64 2: 64 2: 65 #endif 65 #endif 66 #endif 66 #endif 67 retl 67 retl 68 nop 68 nop 69 .size _mcount,.-_mcount 69 .size _mcount,.-_mcount 70 .size mcount,.-mcount 70 .size mcount,.-mcount 71 71 72 #ifdef CONFIG_FUNCTION_TRACER 72 #ifdef CONFIG_FUNCTION_TRACER 73 .globl ftrace_stub 73 .globl ftrace_stub 74 .type ftrace_stub,#function 74 .type ftrace_stub,#function 75 ftrace_stub: 75 ftrace_stub: 76 retl 76 retl 77 nop 77 nop 78 .size ftrace_stub,.-ftrace_s 78 .size ftrace_stub,.-ftrace_stub 79 #ifdef CONFIG_DYNAMIC_FTRACE 79 #ifdef CONFIG_DYNAMIC_FTRACE 80 .globl ftrace_caller 80 .globl ftrace_caller 81 .type ftrace_caller,#functio 81 .type ftrace_caller,#function 82 ftrace_caller: 82 ftrace_caller: >> 83 sethi %hi(function_trace_stop), %g1 83 mov %i7, %g2 84 mov %i7, %g2 84 mov %fp, %g3 !! 85 lduw [%g1 + %lo(function_trace_stop)], %g1 >> 86 brnz,pn %g1, ftrace_stub >> 87 mov %fp, %g3 85 save %sp, -176, %sp 88 save %sp, -176, %sp 86 mov %g2, %o1 89 mov %g2, %o1 87 mov %g2, %l0 90 mov %g2, %l0 88 mov %g3, %l1 91 mov %g3, %l1 89 .globl ftrace_call 92 .globl ftrace_call 90 ftrace_call: 93 ftrace_call: 91 call ftrace_stub 94 call ftrace_stub 92 mov %i7, %o0 95 mov %i7, %o0 93 #ifdef CONFIG_FUNCTION_GRAPH_TRACER 96 #ifdef CONFIG_FUNCTION_GRAPH_TRACER 94 .globl ftrace_graph_call 97 .globl ftrace_graph_call 95 ftrace_graph_call: 98 ftrace_graph_call: 96 call ftrace_stub 99 call ftrace_stub 97 nop 100 nop 98 #endif 101 #endif 99 ret 102 ret 100 restore 103 restore 101 #ifdef CONFIG_FUNCTION_GRAPH_TRACER 104 #ifdef CONFIG_FUNCTION_GRAPH_TRACER 102 .size ftrace_graph_call,.-ft 105 .size ftrace_graph_call,.-ftrace_graph_call 103 #endif 106 #endif 104 .size ftrace_call,.-ftrace_c 107 .size ftrace_call,.-ftrace_call 105 .size ftrace_caller,.-ftrace 108 .size ftrace_caller,.-ftrace_caller 106 #endif 109 #endif 107 #endif 110 #endif 108 111 109 #ifdef CONFIG_FUNCTION_GRAPH_TRACER 112 #ifdef CONFIG_FUNCTION_GRAPH_TRACER 110 ENTRY(ftrace_graph_caller) 113 ENTRY(ftrace_graph_caller) 111 mov %l0, %o0 114 mov %l0, %o0 112 mov %i7, %o1 115 mov %i7, %o1 113 call prepare_ftrace_return 116 call prepare_ftrace_return 114 mov %l1, %o2 117 mov %l1, %o2 115 ret 118 ret 116 restore %o0, -8, %i7 119 restore %o0, -8, %i7 117 END(ftrace_graph_caller) 120 END(ftrace_graph_caller) 118 121 119 ENTRY(return_to_handler) 122 ENTRY(return_to_handler) 120 save %sp, -176, %sp 123 save %sp, -176, %sp 121 call ftrace_return_to_handl 124 call ftrace_return_to_handler 122 mov %fp, %o0 125 mov %fp, %o0 123 jmpl %o0 + 8, %g0 126 jmpl %o0 + 8, %g0 124 restore 127 restore 125 END(return_to_handler) 128 END(return_to_handler) 126 #endif 129 #endif
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.