[S390] ftrace: add function trace mcount test support
[linux-2.6] / arch / s390 / kernel / mcount.S
1 /*
2  * Copyright IBM Corp. 2008,2009
3  *
4  *   Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>,
5  *
6  */
7
8 #include <asm/asm-offsets.h>
9
10         .globl ftrace_stub
11 ftrace_stub:
12         br      %r14
13
14 #ifdef CONFIG_64BIT
15
16 #ifdef CONFIG_DYNAMIC_FTRACE
17
18         .globl _mcount
19 _mcount:
20         br      %r14
21
22         .globl ftrace_caller
23 ftrace_caller:
24         larl    %r1,function_trace_stop
25         icm     %r1,0xf,0(%r1)
26         bnzr    %r14
27         stmg    %r2,%r5,32(%r15)
28         stg     %r14,112(%r15)
29         lgr     %r1,%r15
30         aghi    %r15,-160
31         stg     %r1,__SF_BACKCHAIN(%r15)
32         lgr     %r2,%r14
33         lg      %r3,168(%r15)
34         larl    %r14,ftrace_dyn_func
35         lg      %r14,0(%r14)
36         basr    %r14,%r14
37         aghi    %r15,160
38         lmg     %r2,%r5,32(%r15)
39         lg      %r14,112(%r15)
40         br      %r14
41
42         .data
43         .globl  ftrace_dyn_func
44 ftrace_dyn_func:
45         .quad   ftrace_stub
46         .previous
47
48 #else /* CONFIG_DYNAMIC_FTRACE */
49
50         .globl _mcount
51 _mcount:
52         larl    %r1,function_trace_stop
53         icm     %r1,0xf,0(%r1)
54         bnzr    %r14
55         stmg    %r2,%r5,32(%r15)
56         stg     %r14,112(%r15)
57         lgr     %r1,%r15
58         aghi    %r15,-160
59         stg     %r1,__SF_BACKCHAIN(%r15)
60         lgr     %r2,%r14
61         lg      %r3,168(%r15)
62         larl    %r14,ftrace_trace_function
63         lg      %r14,0(%r14)
64         basr    %r14,%r14
65         aghi    %r15,160
66         lmg     %r2,%r5,32(%r15)
67         lg      %r14,112(%r15)
68         br      %r14
69
70 #endif /* CONFIG_DYNAMIC_FTRACE */
71
72 #else /* CONFIG_64BIT */
73
74 #ifdef CONFIG_DYNAMIC_FTRACE
75
76         .globl _mcount
77 _mcount:
78         br      %r14
79
80         .globl ftrace_caller
81 ftrace_caller:
82         stm     %r2,%r5,16(%r15)
83         bras    %r1,2f
84 0:      .long   ftrace_trace_function
85 1:      .long   function_trace_stop
86 2:      l       %r2,1b-0b(%r1)
87         icm     %r2,0xf,0(%r2)
88         jnz     3f
89         st      %r14,56(%r15)
90         lr      %r0,%r15
91         ahi     %r15,-96
92         l       %r3,100(%r15)
93         la      %r2,0(%r14)
94         st      %r0,__SF_BACKCHAIN(%r15)
95         la      %r3,0(%r3)
96         l       %r14,0b-0b(%r1)
97         l       %r14,0(%r14)
98         basr    %r14,%r14
99         ahi     %r15,96
100         l       %r14,56(%r15)
101 3:      lm      %r2,%r5,16(%r15)
102         br      %r14
103
104         .data
105         .globl  ftrace_dyn_func
106 ftrace_dyn_func:
107         .long   ftrace_stub
108         .previous
109
110 #else /* CONFIG_DYNAMIC_FTRACE */
111
112         .globl _mcount
113 _mcount:
114         stm     %r2,%r5,16(%r15)
115         bras    %r1,2f
116 0:      .long   ftrace_trace_function
117 1:      .long   function_trace_stop
118 2:      l       %r2,1b-0b(%r1)
119         icm     %r2,0xf,0(%r2)
120         jnz     3f
121         st      %r14,56(%r15)
122         lr      %r0,%r15
123         ahi     %r15,-96
124         l       %r3,100(%r15)
125         la      %r2,0(%r14)
126         st      %r0,__SF_BACKCHAIN(%r15)
127         la      %r3,0(%r3)
128         l       %r14,0b-0b(%r1)
129         l       %r14,0(%r14)
130         basr    %r14,%r14
131         ahi     %r15,96
132         l       %r14,56(%r15)
133 3:      lm      %r2,%r5,16(%r15)
134         br      %r14
135
136 #endif /* CONFIG_DYNAMIC_FTRACE */
137 #endif /* CONFIG_64BIT */