Merge branches 'x86-build-for-linus', 'x86-cleanups-for-linus' and 'x86-debug-for...
[sfrench/cifs-2.6.git] / arch / sparc / lib / mcount.S
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:
22 mcount:
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 */
41 1:
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
54 5:      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
61 2:
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
72 ftrace_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
79 ftrace_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
87 ftrace_call:
88         call            ftrace_stub
89          mov            %i7, %o0
90 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
91         .globl          ftrace_graph_call
92 ftrace_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
107 ENTRY(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
114 END(ftrace_graph_caller)
115
116 ENTRY(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
122 END(return_to_handler)
123 #endif