1b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */ 2478b8fecSSam Ravnborg/* 3478b8fecSSam Ravnborg * Copyright (C) 2000 Anton Blanchard (anton@linuxcare.com) 4478b8fecSSam Ravnborg * 5478b8fecSSam Ravnborg * This file implements mcount(), which is used to collect profiling data. 6478b8fecSSam Ravnborg * This can also be tweaked for kernel stack overflow detection. 7478b8fecSSam Ravnborg */ 8478b8fecSSam Ravnborg 9*4cdb71b6SMasahiro Yamada#include <linux/export.h> 10478b8fecSSam Ravnborg#include <linux/linkage.h> 11478b8fecSSam Ravnborg 12478b8fecSSam Ravnborg/* 13478b8fecSSam Ravnborg * This is the main variant and is called by C code. GCC's -pg option 14478b8fecSSam Ravnborg * automatically instruments every C function with a call to this. 15478b8fecSSam Ravnborg */ 16478b8fecSSam Ravnborg 17478b8fecSSam Ravnborg .text 18478b8fecSSam Ravnborg .align 32 19478b8fecSSam Ravnborg .globl _mcount 20478b8fecSSam Ravnborg .type _mcount,#function 21d3867f04SAl Viro EXPORT_SYMBOL(_mcount) 22478b8fecSSam Ravnborg .globl mcount 23478b8fecSSam Ravnborg .type mcount,#function 24478b8fecSSam Ravnborg_mcount: 25478b8fecSSam Ravnborgmcount: 26478b8fecSSam Ravnborg#ifdef CONFIG_FUNCTION_TRACER 27478b8fecSSam Ravnborg#ifdef CONFIG_DYNAMIC_FTRACE 2863b75495SDavid S. Miller /* Do nothing, the retl/nop below is all we need. */ 29478b8fecSSam Ravnborg#else 30478b8fecSSam Ravnborg sethi %hi(ftrace_trace_function), %g1 31478b8fecSSam Ravnborg sethi %hi(ftrace_stub), %g2 32478b8fecSSam Ravnborg ldx [%g1 + %lo(ftrace_trace_function)], %g1 33478b8fecSSam Ravnborg or %g2, %lo(ftrace_stub), %g2 34478b8fecSSam Ravnborg cmp %g1, %g2 35478b8fecSSam Ravnborg be,pn %icc, 1f 369960e9e8SDavid S. Miller mov %i7, %g3 37035df35dSDavid S. Miller save %sp, -176, %sp 389960e9e8SDavid S. Miller mov %g3, %o1 39a71d1d6bSDavid S. Miller jmpl %g1, %o7 40a71d1d6bSDavid S. Miller mov %i7, %o0 41a71d1d6bSDavid S. Miller ret 42a71d1d6bSDavid S. Miller restore 43478b8fecSSam Ravnborg /* not reached */ 44478b8fecSSam Ravnborg1: 459960e9e8SDavid S. Miller#ifdef CONFIG_FUNCTION_GRAPH_TRACER 469960e9e8SDavid S. Miller sethi %hi(ftrace_graph_return), %g1 479960e9e8SDavid S. Miller ldx [%g1 + %lo(ftrace_graph_return)], %g3 489960e9e8SDavid S. Miller cmp %g2, %g3 499960e9e8SDavid S. Miller bne,pn %xcc, 5f 509960e9e8SDavid S. Miller sethi %hi(ftrace_graph_entry_stub), %g2 519960e9e8SDavid S. Miller sethi %hi(ftrace_graph_entry), %g1 529960e9e8SDavid S. Miller or %g2, %lo(ftrace_graph_entry_stub), %g2 539960e9e8SDavid S. Miller ldx [%g1 + %lo(ftrace_graph_entry)], %g1 549960e9e8SDavid S. Miller cmp %g1, %g2 559960e9e8SDavid S. Miller be,pt %xcc, 2f 569960e9e8SDavid S. Miller nop 579960e9e8SDavid S. Miller5: mov %i7, %g2 589960e9e8SDavid S. Miller mov %fp, %g3 59035df35dSDavid S. Miller save %sp, -176, %sp 609960e9e8SDavid S. Miller mov %g2, %l0 619960e9e8SDavid S. Miller ba,pt %xcc, ftrace_graph_caller 629960e9e8SDavid S. Miller mov %g3, %l1 639960e9e8SDavid S. Miller#endif 649960e9e8SDavid S. Miller2: 65478b8fecSSam Ravnborg#endif 66478b8fecSSam Ravnborg#endif 67478b8fecSSam Ravnborg retl 68478b8fecSSam Ravnborg nop 69478b8fecSSam Ravnborg .size _mcount,.-_mcount 70478b8fecSSam Ravnborg .size mcount,.-mcount 71478b8fecSSam Ravnborg 72478b8fecSSam Ravnborg#ifdef CONFIG_FUNCTION_TRACER 73478b8fecSSam Ravnborg .globl ftrace_stub 74478b8fecSSam Ravnborg .type ftrace_stub,#function 75478b8fecSSam Ravnborgftrace_stub: 76478b8fecSSam Ravnborg retl 77478b8fecSSam Ravnborg nop 78478b8fecSSam Ravnborg .size ftrace_stub,.-ftrace_stub 79478b8fecSSam Ravnborg#ifdef CONFIG_DYNAMIC_FTRACE 80478b8fecSSam Ravnborg .globl ftrace_caller 81478b8fecSSam Ravnborg .type ftrace_caller,#function 82478b8fecSSam Ravnborgftrace_caller: 83a71d1d6bSDavid S. Miller mov %i7, %g2 849960e9e8SDavid S. Miller mov %fp, %g3 85035df35dSDavid S. Miller save %sp, -176, %sp 86a71d1d6bSDavid S. Miller mov %g2, %o1 879960e9e8SDavid S. Miller mov %g2, %l0 889960e9e8SDavid S. Miller mov %g3, %l1 89478b8fecSSam Ravnborg .globl ftrace_call 90478b8fecSSam Ravnborgftrace_call: 91478b8fecSSam Ravnborg call ftrace_stub 92a71d1d6bSDavid S. Miller mov %i7, %o0 939960e9e8SDavid S. Miller#ifdef CONFIG_FUNCTION_GRAPH_TRACER 949960e9e8SDavid S. Miller .globl ftrace_graph_call 959960e9e8SDavid S. Millerftrace_graph_call: 969960e9e8SDavid S. Miller call ftrace_stub 979960e9e8SDavid S. Miller nop 989960e9e8SDavid S. Miller#endif 99a71d1d6bSDavid S. Miller ret 100a71d1d6bSDavid S. Miller restore 1019960e9e8SDavid S. Miller#ifdef CONFIG_FUNCTION_GRAPH_TRACER 1029960e9e8SDavid S. Miller .size ftrace_graph_call,.-ftrace_graph_call 1039960e9e8SDavid S. Miller#endif 10463b75495SDavid S. Miller .size ftrace_call,.-ftrace_call 105478b8fecSSam Ravnborg .size ftrace_caller,.-ftrace_caller 106478b8fecSSam Ravnborg#endif 107478b8fecSSam Ravnborg#endif 1089960e9e8SDavid S. Miller 1099960e9e8SDavid S. Miller#ifdef CONFIG_FUNCTION_GRAPH_TRACER 1109960e9e8SDavid S. MillerENTRY(ftrace_graph_caller) 1119960e9e8SDavid S. Miller mov %l0, %o0 1129960e9e8SDavid S. Miller mov %i7, %o1 1139960e9e8SDavid S. Miller call prepare_ftrace_return 1149960e9e8SDavid S. Miller mov %l1, %o2 1159960e9e8SDavid S. Miller ret 1169960e9e8SDavid S. Miller restore %o0, -8, %i7 1179960e9e8SDavid S. MillerEND(ftrace_graph_caller) 1189960e9e8SDavid S. Miller 1199960e9e8SDavid S. MillerENTRY(return_to_handler) 120035df35dSDavid S. Miller save %sp, -176, %sp 1219960e9e8SDavid S. Miller call ftrace_return_to_handler 1229960e9e8SDavid S. Miller mov %fp, %o0 1239960e9e8SDavid S. Miller jmpl %o0 + 8, %g0 1249960e9e8SDavid S. Miller restore 1259960e9e8SDavid S. MillerEND(return_to_handler) 1269960e9e8SDavid S. Miller#endif 127