mcount.S 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. /*
  2. * Copyright IBM Corp. 2008,2009
  3. *
  4. * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>,
  5. *
  6. */
  7. #include <asm/asm-offsets.h>
  8. .globl ftrace_stub
  9. ftrace_stub:
  10. br %r14
  11. #ifdef CONFIG_64BIT
  12. #ifdef CONFIG_DYNAMIC_FTRACE
  13. .globl _mcount
  14. _mcount:
  15. br %r14
  16. .globl ftrace_caller
  17. ftrace_caller:
  18. larl %r1,function_trace_stop
  19. icm %r1,0xf,0(%r1)
  20. bnzr %r14
  21. stmg %r2,%r5,32(%r15)
  22. stg %r14,112(%r15)
  23. lgr %r1,%r15
  24. aghi %r15,-160
  25. stg %r1,__SF_BACKCHAIN(%r15)
  26. lgr %r2,%r14
  27. lg %r3,168(%r15)
  28. larl %r14,ftrace_dyn_func
  29. lg %r14,0(%r14)
  30. basr %r14,%r14
  31. #ifdef CONFIG_FUNCTION_GRAPH_TRACER
  32. .globl ftrace_graph_caller
  33. ftrace_graph_caller:
  34. # This unconditional branch gets runtime patched. Change only if
  35. # you know what you are doing. See ftrace_enable_graph_caller().
  36. j 0f
  37. lg %r2,272(%r15)
  38. lg %r3,168(%r15)
  39. brasl %r14,prepare_ftrace_return
  40. stg %r2,168(%r15)
  41. 0:
  42. #endif
  43. aghi %r15,160
  44. lmg %r2,%r5,32(%r15)
  45. lg %r14,112(%r15)
  46. br %r14
  47. .data
  48. .globl ftrace_dyn_func
  49. ftrace_dyn_func:
  50. .quad ftrace_stub
  51. .previous
  52. #else /* CONFIG_DYNAMIC_FTRACE */
  53. .globl _mcount
  54. _mcount:
  55. larl %r1,function_trace_stop
  56. icm %r1,0xf,0(%r1)
  57. bnzr %r14
  58. stmg %r2,%r5,32(%r15)
  59. stg %r14,112(%r15)
  60. lgr %r1,%r15
  61. aghi %r15,-160
  62. stg %r1,__SF_BACKCHAIN(%r15)
  63. lgr %r2,%r14
  64. lg %r3,168(%r15)
  65. larl %r14,ftrace_trace_function
  66. lg %r14,0(%r14)
  67. basr %r14,%r14
  68. #ifdef CONFIG_FUNCTION_GRAPH_TRACER
  69. lg %r2,272(%r15)
  70. lg %r3,168(%r15)
  71. brasl %r14,prepare_ftrace_return
  72. stg %r2,168(%r15)
  73. #endif
  74. aghi %r15,160
  75. lmg %r2,%r5,32(%r15)
  76. lg %r14,112(%r15)
  77. br %r14
  78. #endif /* CONFIG_DYNAMIC_FTRACE */
  79. #ifdef CONFIG_FUNCTION_GRAPH_TRACER
  80. .globl return_to_handler
  81. return_to_handler:
  82. stmg %r2,%r5,32(%r15)
  83. lgr %r1,%r15
  84. aghi %r15,-160
  85. stg %r1,__SF_BACKCHAIN(%r15)
  86. brasl %r14,ftrace_return_to_handler
  87. aghi %r15,160
  88. lgr %r14,%r2
  89. lmg %r2,%r5,32(%r15)
  90. br %r14
  91. #endif /* CONFIG_FUNCTION_GRAPH_TRACER */
  92. #else /* CONFIG_64BIT */
  93. #ifdef CONFIG_DYNAMIC_FTRACE
  94. .globl _mcount
  95. _mcount:
  96. br %r14
  97. .globl ftrace_caller
  98. ftrace_caller:
  99. stm %r2,%r5,16(%r15)
  100. bras %r1,2f
  101. 0: .long ftrace_trace_function
  102. 1: .long function_trace_stop
  103. 2: l %r2,1b-0b(%r1)
  104. icm %r2,0xf,0(%r2)
  105. jnz 3f
  106. st %r14,56(%r15)
  107. lr %r0,%r15
  108. ahi %r15,-96
  109. l %r3,100(%r15)
  110. la %r2,0(%r14)
  111. st %r0,__SF_BACKCHAIN(%r15)
  112. la %r3,0(%r3)
  113. l %r14,0b-0b(%r1)
  114. l %r14,0(%r14)
  115. basr %r14,%r14
  116. #ifdef CONFIG_FUNCTION_GRAPH_TRACER
  117. .globl ftrace_graph_caller
  118. ftrace_graph_caller:
  119. # This unconditional branch gets runtime patched. Change only if
  120. # you know what you are doing. See ftrace_enable_graph_caller().
  121. j 1f
  122. bras %r1,0f
  123. .long prepare_ftrace_return
  124. 0: l %r2,152(%r15)
  125. l %r4,0(%r1)
  126. l %r3,100(%r15)
  127. basr %r14,%r4
  128. st %r2,100(%r15)
  129. 1:
  130. #endif
  131. ahi %r15,96
  132. l %r14,56(%r15)
  133. 3: lm %r2,%r5,16(%r15)
  134. br %r14
  135. .data
  136. .globl ftrace_dyn_func
  137. ftrace_dyn_func:
  138. .long ftrace_stub
  139. .previous
  140. #else /* CONFIG_DYNAMIC_FTRACE */
  141. .globl _mcount
  142. _mcount:
  143. stm %r2,%r5,16(%r15)
  144. bras %r1,2f
  145. 0: .long ftrace_trace_function
  146. 1: .long function_trace_stop
  147. 2: l %r2,1b-0b(%r1)
  148. icm %r2,0xf,0(%r2)
  149. jnz 3f
  150. st %r14,56(%r15)
  151. lr %r0,%r15
  152. ahi %r15,-96
  153. l %r3,100(%r15)
  154. la %r2,0(%r14)
  155. st %r0,__SF_BACKCHAIN(%r15)
  156. la %r3,0(%r3)
  157. l %r14,0b-0b(%r1)
  158. l %r14,0(%r14)
  159. basr %r14,%r14
  160. #ifdef CONFIG_FUNCTION_GRAPH_TRACER
  161. bras %r1,0f
  162. .long prepare_ftrace_return
  163. 0: l %r2,152(%r15)
  164. l %r4,0(%r1)
  165. l %r3,100(%r15)
  166. basr %r14,%r4
  167. st %r2,100(%r15)
  168. #endif
  169. ahi %r15,96
  170. l %r14,56(%r15)
  171. 3: lm %r2,%r5,16(%r15)
  172. br %r14
  173. #endif /* CONFIG_DYNAMIC_FTRACE */
  174. #ifdef CONFIG_FUNCTION_GRAPH_TRACER
  175. .globl return_to_handler
  176. return_to_handler:
  177. stm %r2,%r5,16(%r15)
  178. st %r14,56(%r15)
  179. lr %r0,%r15
  180. ahi %r15,-96
  181. st %r0,__SF_BACKCHAIN(%r15)
  182. bras %r1,0f
  183. .long ftrace_return_to_handler
  184. 0: l %r2,0b-0b(%r1)
  185. basr %r14,%r2
  186. lr %r14,%r2
  187. ahi %r15,96
  188. lm %r2,%r5,16(%r15)
  189. br %r14
  190. #endif /* CONFIG_FUNCTION_GRAPH_TRACER */
  191. #endif /* CONFIG_64BIT */