mcount.S 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Copyright (C) 2000 Anton Blanchard (anton@linuxcare.com)
  4. *
  5. * This file implements mcount(), which is used to collect profiling data.
  6. * This can also be tweaked for kernel stack overflow detection.
  7. */
  8. #include <linux/linkage.h>
  9. #include <asm/export.h>
  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. .text
  15. .align 32
  16. .globl _mcount
  17. .type _mcount,#function
  18. EXPORT_SYMBOL(_mcount)
  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. #ifdef CONFIG_FUNCTION_TRACER
  69. .globl ftrace_stub
  70. .type ftrace_stub,#function
  71. ftrace_stub:
  72. retl
  73. nop
  74. .size ftrace_stub,.-ftrace_stub
  75. #ifdef CONFIG_DYNAMIC_FTRACE
  76. .globl ftrace_caller
  77. .type ftrace_caller,#function
  78. ftrace_caller:
  79. mov %i7, %g2
  80. mov %fp, %g3
  81. save %sp, -176, %sp
  82. mov %g2, %o1
  83. mov %g2, %l0
  84. mov %g3, %l1
  85. .globl ftrace_call
  86. ftrace_call:
  87. call ftrace_stub
  88. mov %i7, %o0
  89. #ifdef CONFIG_FUNCTION_GRAPH_TRACER
  90. .globl ftrace_graph_call
  91. ftrace_graph_call:
  92. call ftrace_stub
  93. nop
  94. #endif
  95. ret
  96. restore
  97. #ifdef CONFIG_FUNCTION_GRAPH_TRACER
  98. .size ftrace_graph_call,.-ftrace_graph_call
  99. #endif
  100. .size ftrace_call,.-ftrace_call
  101. .size ftrace_caller,.-ftrace_caller
  102. #endif
  103. #endif
  104. #ifdef CONFIG_FUNCTION_GRAPH_TRACER
  105. ENTRY(ftrace_graph_caller)
  106. mov %l0, %o0
  107. mov %i7, %o1
  108. call prepare_ftrace_return
  109. mov %l1, %o2
  110. ret
  111. restore %o0, -8, %i7
  112. END(ftrace_graph_caller)
  113. ENTRY(return_to_handler)
  114. save %sp, -176, %sp
  115. call ftrace_return_to_handler
  116. mov %fp, %o0
  117. jmpl %o0 + 8, %g0
  118. restore
  119. END(return_to_handler)
  120. #endif