debug.S 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. /* SPDX-License-Identifier: GPL-2.0+ */
  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
  47. add r3, r2, r1
  48. mov r1, #0
  49. strb r1, [r3]
  50. 1: and r1, r0, #15
  51. mov r0, r0, lsr #4
  52. cmp r1, #10
  53. addlt r1, r1, #'0'
  54. addge r1, r1, #'a' - 10
  55. strb r1, [r3, #-1]!
  56. teq r3, r2
  57. bne 1b
  58. mov r0, r2
  59. b printascii
  60. ENDPROC(printhex2)
  61. hexbuf: .space 16
  62. .ltorg
  63. #ifndef CONFIG_DEBUG_SEMIHOSTING
  64. ENTRY(printascii)
  65. addruart_current r3, r1, r2
  66. b 2f
  67. 1: waituart r2, r3
  68. senduart r1, r3
  69. busyuart r2, r3
  70. teq r1, #'\n'
  71. moveq r1, #'\r'
  72. beq 1b
  73. 2: teq r0, #0
  74. ldrneb r1, [r0], #1
  75. teqne r1, #0
  76. bne 1b
  77. mov pc, lr
  78. ENDPROC(printascii)
  79. ENTRY(printch)
  80. addruart_current r3, r1, r2
  81. mov r1, r0
  82. mov r0, #0
  83. b 1b
  84. ENDPROC(printch)
  85. #ifdef CONFIG_MMU
  86. ENTRY(debug_ll_addr)
  87. addruart r2, r3, ip
  88. str r2, [r0]
  89. str r3, [r1]
  90. mov pc, lr
  91. ENDPROC(debug_ll_addr)
  92. #endif
  93. #else
  94. ENTRY(printascii)
  95. mov r1, r0
  96. mov r0, #0x04 @ SYS_WRITE0
  97. ARM( svc #0x123456 )
  98. THUMB( svc #0xab )
  99. mov pc, lr
  100. ENDPROC(printascii)
  101. ENTRY(printch)
  102. adr r1, hexbuf
  103. strb r0, [r1]
  104. mov r0, #0x03 @ SYS_WRITEC
  105. ARM( svc #0x123456 )
  106. THUMB( svc #0xab )
  107. mov pc, lr
  108. ENDPROC(printch)
  109. ENTRY(debug_ll_addr)
  110. mov r2, #0
  111. str r2, [r0]
  112. str r2, [r1]
  113. mov pc, lr
  114. ENDPROC(debug_ll_addr)
  115. #endif