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