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 11ftrace_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 23ftrace_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#ifdef CONFIG_FUNCTION_GRAPH_TRACER 38 .globl ftrace_graph_caller 39ftrace_graph_caller: 40 # This unconditional branch gets runtime patched. Change only if 41 # you know what you are doing. See ftrace_enable_graph_caller(). 42 j 0f 43 lg %r2,272(%r15) 44 lg %r3,168(%r15) 45 brasl %r14,prepare_ftrace_return 46 stg %r2,168(%r15) 470: 48#endif 49 aghi %r15,160 50 lmg %r2,%r5,32(%r15) 51 lg %r14,112(%r15) 52 br %r14 53 54 .data 55 .globl ftrace_dyn_func 56ftrace_dyn_func: 57 .quad ftrace_stub 58 .previous 59 60#else /* CONFIG_DYNAMIC_FTRACE */ 61 62 .globl _mcount 63_mcount: 64 larl %r1,function_trace_stop 65 icm %r1,0xf,0(%r1) 66 bnzr %r14 67 stmg %r2,%r5,32(%r15) 68 stg %r14,112(%r15) 69 lgr %r1,%r15 70 aghi %r15,-160 71 stg %r1,__SF_BACKCHAIN(%r15) 72 lgr %r2,%r14 73 lg %r3,168(%r15) 74 larl %r14,ftrace_trace_function 75 lg %r14,0(%r14) 76 basr %r14,%r14 77#ifdef CONFIG_FUNCTION_GRAPH_TRACER 78 lg %r2,272(%r15) 79 lg %r3,168(%r15) 80 brasl %r14,prepare_ftrace_return 81 stg %r2,168(%r15) 82#endif 83 aghi %r15,160 84 lmg %r2,%r5,32(%r15) 85 lg %r14,112(%r15) 86 br %r14 87 88#endif /* CONFIG_DYNAMIC_FTRACE */ 89 90#ifdef CONFIG_FUNCTION_GRAPH_TRACER 91 92 .globl return_to_handler 93return_to_handler: 94 stmg %r2,%r5,32(%r15) 95 lgr %r1,%r15 96 aghi %r15,-160 97 stg %r1,__SF_BACKCHAIN(%r15) 98 brasl %r14,ftrace_return_to_handler 99 aghi %r15,160 100 lgr %r14,%r2 101 lmg %r2,%r5,32(%r15) 102 br %r14 103 104#endif /* CONFIG_FUNCTION_GRAPH_TRACER */ 105 106#else /* CONFIG_64BIT */ 107 108#ifdef CONFIG_DYNAMIC_FTRACE 109 110 .globl _mcount 111_mcount: 112 br %r14 113 114 .globl ftrace_caller 115ftrace_caller: 116 stm %r2,%r5,16(%r15) 117 bras %r1,2f 1180: .long ftrace_trace_function 1191: .long function_trace_stop 1202: l %r2,1b-0b(%r1) 121 icm %r2,0xf,0(%r2) 122 jnz 3f 123 st %r14,56(%r15) 124 lr %r0,%r15 125 ahi %r15,-96 126 l %r3,100(%r15) 127 la %r2,0(%r14) 128 st %r0,__SF_BACKCHAIN(%r15) 129 la %r3,0(%r3) 130 l %r14,0b-0b(%r1) 131 l %r14,0(%r14) 132 basr %r14,%r14 133#ifdef CONFIG_FUNCTION_GRAPH_TRACER 134 .globl ftrace_graph_caller 135ftrace_graph_caller: 136 # This unconditional branch gets runtime patched. Change only if 137 # you know what you are doing. See ftrace_enable_graph_caller(). 138 j 1f 139 bras %r1,0f 140 .long prepare_ftrace_return 1410: l %r2,152(%r15) 142 l %r4,0(%r1) 143 l %r3,100(%r15) 144 basr %r14,%r4 145 st %r2,100(%r15) 1461: 147#endif 148 ahi %r15,96 149 l %r14,56(%r15) 1503: lm %r2,%r5,16(%r15) 151 br %r14 152 153 .data 154 .globl ftrace_dyn_func 155ftrace_dyn_func: 156 .long ftrace_stub 157 .previous 158 159#else /* CONFIG_DYNAMIC_FTRACE */ 160 161 .globl _mcount 162_mcount: 163 stm %r2,%r5,16(%r15) 164 bras %r1,2f 1650: .long ftrace_trace_function 1661: .long function_trace_stop 1672: l %r2,1b-0b(%r1) 168 icm %r2,0xf,0(%r2) 169 jnz 3f 170 st %r14,56(%r15) 171 lr %r0,%r15 172 ahi %r15,-96 173 l %r3,100(%r15) 174 la %r2,0(%r14) 175 st %r0,__SF_BACKCHAIN(%r15) 176 la %r3,0(%r3) 177 l %r14,0b-0b(%r1) 178 l %r14,0(%r14) 179 basr %r14,%r14 180#ifdef CONFIG_FUNCTION_GRAPH_TRACER 181 bras %r1,0f 182 .long prepare_ftrace_return 1830: l %r2,152(%r15) 184 l %r4,0(%r1) 185 l %r3,100(%r15) 186 basr %r14,%r4 187 st %r2,100(%r15) 188#endif 189 ahi %r15,96 190 l %r14,56(%r15) 1913: lm %r2,%r5,16(%r15) 192 br %r14 193 194#endif /* CONFIG_DYNAMIC_FTRACE */ 195 196#ifdef CONFIG_FUNCTION_GRAPH_TRACER 197 198 .globl return_to_handler 199return_to_handler: 200 stm %r2,%r5,16(%r15) 201 st %r14,56(%r15) 202 lr %r0,%r15 203 ahi %r15,-96 204 st %r0,__SF_BACKCHAIN(%r15) 205 bras %r1,0f 206 .long ftrace_return_to_handler 2070: l %r2,0b-0b(%r1) 208 basr %r14,%r2 209 lr %r14,%r2 210 ahi %r15,96 211 lm %r2,%r5,16(%r15) 212 br %r14 213 214#endif /* CONFIG_FUNCTION_GRAPH_TRACER */ 215 216#endif /* CONFIG_64BIT */ 217