Merge tag 'fbdev-updates-for-3.5' of git://github.com/schandinat/linux-2.6
[linux-2.6-microblaze.git] / arch / arm / kernel / debug.S
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
15                 .text
16
17 /*
18  * Some debugging routines (useful if you've got MM problems and
19  * printk isn't working).  For DEBUGGING ONLY!!!  Do not leave
20  * references to these in a production kernel!
21  */
22
23 #if defined(CONFIG_DEBUG_ICEDCC)
24                 @@ debug using ARM EmbeddedICE DCC channel
25
26                 .macro  addruart, rp, rv, tmp
27                 .endm
28
29 #if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_V6K) || defined(CONFIG_CPU_V7)
30
31                 .macro  senduart, rd, rx
32                 mcr     p14, 0, \rd, c0, c5, 0
33                 .endm
34
35                 .macro  busyuart, rd, rx
36 1001:
37                 mrc     p14, 0, \rx, c0, c1, 0
38                 tst     \rx, #0x20000000
39                 beq     1001b
40                 .endm
41
42                 .macro  waituart, rd, rx
43                 mov     \rd, #0x2000000
44 1001:
45                 subs    \rd, \rd, #1
46                 bmi     1002f
47                 mrc     p14, 0, \rx, c0, c1, 0
48                 tst     \rx, #0x20000000
49                 bne     1001b
50 1002:
51                 .endm
52
53 #elif defined(CONFIG_CPU_XSCALE)
54
55                 .macro  senduart, rd, rx
56                 mcr     p14, 0, \rd, c8, c0, 0
57                 .endm
58
59                 .macro  busyuart, rd, rx
60 1001:
61                 mrc     p14, 0, \rx, c14, c0, 0
62                 tst     \rx, #0x10000000
63                 beq     1001b
64                 .endm
65
66                 .macro  waituart, rd, rx
67                 mov     \rd, #0x10000000
68 1001:
69                 subs    \rd, \rd, #1
70                 bmi     1002f
71                 mrc     p14, 0, \rx, c14, c0, 0
72                 tst     \rx, #0x10000000
73                 bne     1001b
74 1002:
75                 .endm
76
77 #else
78
79                 .macro  senduart, rd, rx
80                 mcr     p14, 0, \rd, c1, c0, 0
81                 .endm
82
83                 .macro  busyuart, rd, rx
84 1001:
85                 mrc     p14, 0, \rx, c0, c0, 0
86                 tst     \rx, #2
87                 beq     1001b
88
89                 .endm
90
91                 .macro  waituart, rd, rx
92                 mov     \rd, #0x2000000
93 1001:
94                 subs    \rd, \rd, #1
95                 bmi     1002f
96                 mrc     p14, 0, \rx, c0, c0, 0
97                 tst     \rx, #2
98                 bne     1001b
99 1002:
100                 .endm
101
102 #endif  /* CONFIG_CPU_V6 */
103
104 #elif !defined(CONFIG_DEBUG_SEMIHOSTING)
105 #include <mach/debug-macro.S>
106 #endif  /* CONFIG_DEBUG_ICEDCC */
107
108 #ifdef CONFIG_MMU
109                 .macro  addruart_current, rx, tmp1, tmp2
110                 addruart        \tmp1, \tmp2, \rx
111                 mrc             p15, 0, \rx, c1, c0
112                 tst             \rx, #1
113                 moveq           \rx, \tmp1
114                 movne           \rx, \tmp2
115                 .endm
116
117 #else /* !CONFIG_MMU */
118                 .macro  addruart_current, rx, tmp1, tmp2
119                 addruart        \rx, \tmp1
120                 .endm
121
122 #endif /* CONFIG_MMU */
123
124 /*
125  * Useful debugging routines
126  */
127 ENTRY(printhex8)
128                 mov     r1, #8
129                 b       printhex
130 ENDPROC(printhex8)
131
132 ENTRY(printhex4)
133                 mov     r1, #4
134                 b       printhex
135 ENDPROC(printhex4)
136
137 ENTRY(printhex2)
138                 mov     r1, #2
139 printhex:       adr     r2, hexbuf
140                 add     r3, r2, r1
141                 mov     r1, #0
142                 strb    r1, [r3]
143 1:              and     r1, r0, #15
144                 mov     r0, r0, lsr #4
145                 cmp     r1, #10
146                 addlt   r1, r1, #'0'
147                 addge   r1, r1, #'a' - 10
148                 strb    r1, [r3, #-1]!
149                 teq     r3, r2
150                 bne     1b
151                 mov     r0, r2
152                 b       printascii
153 ENDPROC(printhex2)
154
155 hexbuf:         .space 16
156
157                 .ltorg
158
159 #ifndef CONFIG_DEBUG_SEMIHOSTING
160
161 ENTRY(printascii)
162                 addruart_current r3, r1, r2
163                 b       2f
164 1:              waituart r2, r3
165                 senduart r1, r3
166                 busyuart r2, r3
167                 teq     r1, #'\n'
168                 moveq   r1, #'\r'
169                 beq     1b
170 2:              teq     r0, #0
171                 ldrneb  r1, [r0], #1
172                 teqne   r1, #0
173                 bne     1b
174                 mov     pc, lr
175 ENDPROC(printascii)
176
177 ENTRY(printch)
178                 addruart_current r3, r1, r2
179                 mov     r1, r0
180                 mov     r0, #0
181                 b       1b
182 ENDPROC(printch)
183
184 #else
185
186 ENTRY(printascii)
187                 mov     r1, r0
188                 mov     r0, #0x04               @ SYS_WRITE0
189         ARM(    svc     #0x123456       )
190         THUMB(  svc     #0xab           )
191                 mov     pc, lr
192 ENDPROC(printascii)
193
194 ENTRY(printch)
195                 adr     r1, hexbuf
196                 strb    r0, [r1]
197                 mov     r0, #0x03               @ SYS_WRITEC
198         ARM(    svc     #0x123456       )
199         THUMB(  svc     #0xab           )
200                 mov     pc, lr
201 ENDPROC(printch)
202
203 #endif