debug.S 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * linux/arch/arm/kernel/debug.S
  4. *
  5. * Copyright (C) 1994-1999 Russell King
  6. *
  7. * 32-bit debugging code
  8. */
  9. #include <linux/linkage.h>
  10. #include <asm/assembler.h>
  11. .text
  12. /*
  13. * Some debugging routines (useful if you've got MM problems and
  14. * printk isn't working). For DEBUGGING ONLY!!! Do not leave
  15. * references to these in a production kernel!
  16. */
  17. #if !defined(CONFIG_DEBUG_SEMIHOSTING)
  18. #include CONFIG_DEBUG_LL_INCLUDE
  19. #endif
  20. #ifdef CONFIG_MMU
  21. .macro addruart_current, rx, tmp1, tmp2
  22. addruart \tmp1, \tmp2, \rx
  23. mrc p15, 0, \rx, c1, c0
  24. tst \rx, #1
  25. moveq \rx, \tmp1
  26. movne \rx, \tmp2
  27. .endm
  28. #else /* !CONFIG_MMU */
  29. .macro addruart_current, rx, tmp1, tmp2
  30. addruart \rx, \tmp1, \tmp2
  31. .endm
  32. #endif /* CONFIG_MMU */
  33. /*
  34. * Useful debugging routines
  35. */
  36. ENTRY(printhex8)
  37. mov r1, #8
  38. b printhex
  39. ENDPROC(printhex8)
  40. ENTRY(printhex4)
  41. mov r1, #4
  42. b printhex
  43. ENDPROC(printhex4)
  44. ENTRY(printhex2)
  45. mov r1, #2
  46. printhex: adr r2, hexbuf_rel
  47. ldr r3, [r2]
  48. add r2, r2, r3
  49. add r3, r2, r1
  50. mov r1, #0
  51. strb r1, [r3]
  52. 1: and r1, r0, #15
  53. mov r0, r0, lsr #4
  54. cmp r1, #10
  55. addlt r1, r1, #'0'
  56. addge r1, r1, #'a' - 10
  57. strb r1, [r3, #-1]!
  58. teq r3, r2
  59. bne 1b
  60. mov r0, r2
  61. b printascii
  62. ENDPROC(printhex2)
  63. .pushsection .bss
  64. hexbuf_addr: .space 16
  65. .popsection
  66. .align
  67. hexbuf_rel: .long hexbuf_addr - .
  68. .ltorg
  69. #ifndef CONFIG_DEBUG_SEMIHOSTING
  70. ENTRY(printascii)
  71. addruart_current r3, r1, r2
  72. 1: teq r0, #0
  73. ldrbne r1, [r0], #1
  74. teqne r1, #0
  75. reteq lr
  76. 2: teq r1, #'\n'
  77. bne 3f
  78. mov r1, #'\r'
  79. #ifdef CONFIG_DEBUG_UART_FLOW_CONTROL
  80. waituartcts r2, r3
  81. #endif
  82. waituarttxrdy r2, r3
  83. senduart r1, r3
  84. busyuart r2, r3
  85. mov r1, #'\n'
  86. 3:
  87. #ifdef CONFIG_DEBUG_UART_FLOW_CONTROL
  88. waituartcts r2, r3
  89. #endif
  90. waituarttxrdy r2, r3
  91. senduart r1, r3
  92. busyuart r2, r3
  93. b 1b
  94. ENDPROC(printascii)
  95. ENTRY(printch)
  96. addruart_current r3, r1, r2
  97. mov r1, r0
  98. mov r0, #0
  99. b 2b
  100. ENDPROC(printch)
  101. #ifdef CONFIG_MMU
  102. ENTRY(debug_ll_addr)
  103. addruart r2, r3, ip
  104. str r2, [r0]
  105. str r3, [r1]
  106. ret lr
  107. ENDPROC(debug_ll_addr)
  108. #endif
  109. #else
  110. ENTRY(printascii)
  111. mov r1, r0
  112. mov r0, #0x04 @ SYS_WRITE0
  113. ARM( svc #0x123456 )
  114. #ifdef CONFIG_CPU_V7M
  115. THUMB( bkpt #0xab )
  116. #else
  117. THUMB( svc #0xab )
  118. #endif
  119. ret lr
  120. ENDPROC(printascii)
  121. ENTRY(printch)
  122. adr r1, hexbuf_rel
  123. ldr r2, [r1]
  124. add r1, r1, r2
  125. strb r0, [r1]
  126. mov r0, #0x03 @ SYS_WRITEC
  127. ARM( svc #0x123456 )
  128. #ifdef CONFIG_CPU_V7M
  129. THUMB( bkpt #0xab )
  130. #else
  131. THUMB( svc #0xab )
  132. #endif
  133. ret lr
  134. ENDPROC(printch)
  135. ENTRY(debug_ll_addr)
  136. mov r2, #0
  137. str r2, [r0]
  138. str r2, [r1]
  139. ret lr
  140. ENDPROC(debug_ll_addr)
  141. #endif