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