mcount.S 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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. aghi %r15,160
  32. lmg %r2,%r5,32(%r15)
  33. lg %r14,112(%r15)
  34. br %r14
  35. .data
  36. .globl ftrace_dyn_func
  37. ftrace_dyn_func:
  38. .quad ftrace_stub
  39. .previous
  40. #else /* CONFIG_DYNAMIC_FTRACE */
  41. .globl _mcount
  42. _mcount:
  43. larl %r1,function_trace_stop
  44. icm %r1,0xf,0(%r1)
  45. bnzr %r14
  46. stmg %r2,%r5,32(%r15)
  47. stg %r14,112(%r15)
  48. lgr %r1,%r15
  49. aghi %r15,-160
  50. stg %r1,__SF_BACKCHAIN(%r15)
  51. lgr %r2,%r14
  52. lg %r3,168(%r15)
  53. larl %r14,ftrace_trace_function
  54. lg %r14,0(%r14)
  55. basr %r14,%r14
  56. aghi %r15,160
  57. lmg %r2,%r5,32(%r15)
  58. lg %r14,112(%r15)
  59. br %r14
  60. #endif /* CONFIG_DYNAMIC_FTRACE */
  61. #else /* CONFIG_64BIT */
  62. #ifdef CONFIG_DYNAMIC_FTRACE
  63. .globl _mcount
  64. _mcount:
  65. br %r14
  66. .globl ftrace_caller
  67. ftrace_caller:
  68. stm %r2,%r5,16(%r15)
  69. bras %r1,2f
  70. 0: .long ftrace_trace_function
  71. 1: .long function_trace_stop
  72. 2: l %r2,1b-0b(%r1)
  73. icm %r2,0xf,0(%r2)
  74. jnz 3f
  75. st %r14,56(%r15)
  76. lr %r0,%r15
  77. ahi %r15,-96
  78. l %r3,100(%r15)
  79. la %r2,0(%r14)
  80. st %r0,__SF_BACKCHAIN(%r15)
  81. la %r3,0(%r3)
  82. l %r14,0b-0b(%r1)
  83. l %r14,0(%r14)
  84. basr %r14,%r14
  85. ahi %r15,96
  86. l %r14,56(%r15)
  87. 3: lm %r2,%r5,16(%r15)
  88. br %r14
  89. .data
  90. .globl ftrace_dyn_func
  91. ftrace_dyn_func:
  92. .long ftrace_stub
  93. .previous
  94. #else /* CONFIG_DYNAMIC_FTRACE */
  95. .globl _mcount
  96. _mcount:
  97. stm %r2,%r5,16(%r15)
  98. bras %r1,2f
  99. 0: .long ftrace_trace_function
  100. 1: .long function_trace_stop
  101. 2: l %r2,1b-0b(%r1)
  102. icm %r2,0xf,0(%r2)
  103. jnz 3f
  104. st %r14,56(%r15)
  105. lr %r0,%r15
  106. ahi %r15,-96
  107. l %r3,100(%r15)
  108. la %r2,0(%r14)
  109. st %r0,__SF_BACKCHAIN(%r15)
  110. la %r3,0(%r3)
  111. l %r14,0b-0b(%r1)
  112. l %r14,0(%r14)
  113. basr %r14,%r14
  114. ahi %r15,96
  115. l %r14,56(%r15)
  116. 3: lm %r2,%r5,16(%r15)
  117. br %r14
  118. #endif /* CONFIG_DYNAMIC_FTRACE */
  119. #endif /* CONFIG_64BIT */