debug.S 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. /*
  2. * linux/arch/arm/kernel/debug.S
  3. *
  4. * Copyright (C) 1994-1999 Russell King
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License version 2 as
  8. * published by the Free Software Foundation.
  9. *
  10. * 32-bit debugging code
  11. */
  12. #include <linux/linkage.h>
  13. #include <asm/assembler.h>
  14. .text
  15. /*
  16. * Some debugging routines (useful if you've got MM problems and
  17. * printk isn't working). For DEBUGGING ONLY!!! Do not leave
  18. * references to these in a production kernel!
  19. */
  20. #if defined(CONFIG_DEBUG_ICEDCC)
  21. @@ debug using ARM EmbeddedICE DCC channel
  22. .macro addruart, rp, rv, tmp
  23. .endm
  24. #if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_V6K) || defined(CONFIG_CPU_V7)
  25. .macro senduart, rd, rx
  26. mcr p14, 0, \rd, c0, c5, 0
  27. .endm
  28. .macro busyuart, rd, rx
  29. 1001:
  30. mrc p14, 0, \rx, c0, c1, 0
  31. tst \rx, #0x20000000
  32. beq 1001b
  33. .endm
  34. .macro waituart, rd, rx
  35. mov \rd, #0x2000000
  36. 1001:
  37. subs \rd, \rd, #1
  38. bmi 1002f
  39. mrc p14, 0, \rx, c0, c1, 0
  40. tst \rx, #0x20000000
  41. bne 1001b
  42. 1002:
  43. .endm
  44. #elif defined(CONFIG_CPU_XSCALE)
  45. .macro senduart, rd, rx
  46. mcr p14, 0, \rd, c8, c0, 0
  47. .endm
  48. .macro busyuart, rd, rx
  49. 1001:
  50. mrc p14, 0, \rx, c14, c0, 0
  51. tst \rx, #0x10000000
  52. beq 1001b
  53. .endm
  54. .macro waituart, rd, rx
  55. mov \rd, #0x10000000
  56. 1001:
  57. subs \rd, \rd, #1
  58. bmi 1002f
  59. mrc p14, 0, \rx, c14, c0, 0
  60. tst \rx, #0x10000000
  61. bne 1001b
  62. 1002:
  63. .endm
  64. #else
  65. .macro senduart, rd, rx
  66. mcr p14, 0, \rd, c1, c0, 0
  67. .endm
  68. .macro busyuart, rd, rx
  69. 1001:
  70. mrc p14, 0, \rx, c0, c0, 0
  71. tst \rx, #2
  72. beq 1001b
  73. .endm
  74. .macro waituart, rd, rx
  75. mov \rd, #0x2000000
  76. 1001:
  77. subs \rd, \rd, #1
  78. bmi 1002f
  79. mrc p14, 0, \rx, c0, c0, 0
  80. tst \rx, #2
  81. bne 1001b
  82. 1002:
  83. .endm
  84. #endif /* CONFIG_CPU_V6 */
  85. #elif !defined(CONFIG_DEBUG_SEMIHOSTING)
  86. #include <mach/debug-macro.S>
  87. #endif /* CONFIG_DEBUG_ICEDCC */
  88. #ifdef CONFIG_MMU
  89. .macro addruart_current, rx, tmp1, tmp2
  90. addruart \tmp1, \tmp2, \rx
  91. mrc p15, 0, \rx, c1, c0
  92. tst \rx, #1
  93. moveq \rx, \tmp1
  94. movne \rx, \tmp2
  95. .endm
  96. #else /* !CONFIG_MMU */
  97. .macro addruart_current, rx, tmp1, tmp2
  98. addruart \rx, \tmp1
  99. .endm
  100. #endif /* CONFIG_MMU */
  101. /*
  102. * Useful debugging routines
  103. */
  104. ENTRY(printhex8)
  105. mov r1, #8
  106. b printhex
  107. ENDPROC(printhex8)
  108. ENTRY(printhex4)
  109. mov r1, #4
  110. b printhex
  111. ENDPROC(printhex4)
  112. ENTRY(printhex2)
  113. mov r1, #2
  114. printhex: adr r2, hexbuf
  115. add r3, r2, r1
  116. mov r1, #0
  117. strb r1, [r3]
  118. 1: and r1, r0, #15
  119. mov r0, r0, lsr #4
  120. cmp r1, #10
  121. addlt r1, r1, #'0'
  122. addge r1, r1, #'a' - 10
  123. strb r1, [r3, #-1]!
  124. teq r3, r2
  125. bne 1b
  126. mov r0, r2
  127. b printascii
  128. ENDPROC(printhex2)
  129. hexbuf: .space 16
  130. .ltorg
  131. #ifndef CONFIG_DEBUG_SEMIHOSTING
  132. ENTRY(printascii)
  133. addruart_current r3, r1, r2
  134. b 2f
  135. 1: waituart r2, r3
  136. senduart r1, r3
  137. busyuart r2, r3
  138. teq r1, #'\n'
  139. moveq r1, #'\r'
  140. beq 1b
  141. 2: teq r0, #0
  142. ldrneb r1, [r0], #1
  143. teqne r1, #0
  144. bne 1b
  145. mov pc, lr
  146. ENDPROC(printascii)
  147. ENTRY(printch)
  148. addruart_current r3, r1, r2
  149. mov r1, r0
  150. mov r0, #0
  151. b 1b
  152. ENDPROC(printch)
  153. #else
  154. ENTRY(printascii)
  155. mov r1, r0
  156. mov r0, #0x04 @ SYS_WRITE0
  157. ARM( svc #0x123456 )
  158. THUMB( svc #0xab )
  159. mov pc, lr
  160. ENDPROC(printascii)
  161. ENTRY(printch)
  162. adr r1, hexbuf
  163. strb r0, [r1]
  164. mov r0, #0x03 @ SYS_WRITEC
  165. ARM( svc #0x123456 )
  166. THUMB( svc #0xab )
  167. mov pc, lr
  168. ENDPROC(printch)
  169. #endif