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