14f7c3b14632e22c02632faeaca9f07adcbc232f
[sfrench/cifs-2.6.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_SEMIHOSTING)
24 #include CONFIG_DEBUG_LL_INCLUDE
25 #endif
26
27 #ifdef CONFIG_MMU
28                 .macro  addruart_current, rx, tmp1, tmp2
29                 addruart        \tmp1, \tmp2, \rx
30                 mrc             p15, 0, \rx, c1, c0
31                 tst             \rx, #1
32                 moveq           \rx, \tmp1
33                 movne           \rx, \tmp2
34                 .endm
35
36 #else /* !CONFIG_MMU */
37                 .macro  addruart_current, rx, tmp1, tmp2
38                 addruart        \rx, \tmp1
39                 .endm
40
41 #endif /* CONFIG_MMU */
42
43 /*
44  * Useful debugging routines
45  */
46 ENTRY(printhex8)
47                 mov     r1, #8
48                 b       printhex
49 ENDPROC(printhex8)
50
51 ENTRY(printhex4)
52                 mov     r1, #4
53                 b       printhex
54 ENDPROC(printhex4)
55
56 ENTRY(printhex2)
57                 mov     r1, #2
58 printhex:       adr     r2, hexbuf
59                 add     r3, r2, r1
60                 mov     r1, #0
61                 strb    r1, [r3]
62 1:              and     r1, r0, #15
63                 mov     r0, r0, lsr #4
64                 cmp     r1, #10
65                 addlt   r1, r1, #'0'
66                 addge   r1, r1, #'a' - 10
67                 strb    r1, [r3, #-1]!
68                 teq     r3, r2
69                 bne     1b
70                 mov     r0, r2
71                 b       printascii
72 ENDPROC(printhex2)
73
74 hexbuf:         .space 16
75
76                 .ltorg
77
78 #ifndef CONFIG_DEBUG_SEMIHOSTING
79
80 ENTRY(printascii)
81                 addruart_current r3, r1, r2
82                 b       2f
83 1:              waituart r2, r3
84                 senduart r1, r3
85                 busyuart r2, r3
86                 teq     r1, #'\n'
87                 moveq   r1, #'\r'
88                 beq     1b
89 2:              teq     r0, #0
90                 ldrneb  r1, [r0], #1
91                 teqne   r1, #0
92                 bne     1b
93                 mov     pc, lr
94 ENDPROC(printascii)
95
96 ENTRY(printch)
97                 addruart_current r3, r1, r2
98                 mov     r1, r0
99                 mov     r0, #0
100                 b       1b
101 ENDPROC(printch)
102
103 #ifdef CONFIG_MMU
104 ENTRY(debug_ll_addr)
105                 addruart r2, r3, ip
106                 str     r2, [r0]
107                 str     r3, [r1]
108                 mov     pc, lr
109 ENDPROC(debug_ll_addr)
110 #endif
111
112 #else
113
114 ENTRY(printascii)
115                 mov     r1, r0
116                 mov     r0, #0x04               @ SYS_WRITE0
117         ARM(    svc     #0x123456       )
118         THUMB(  svc     #0xab           )
119                 mov     pc, lr
120 ENDPROC(printascii)
121
122 ENTRY(printch)
123                 adr     r1, hexbuf
124                 strb    r0, [r1]
125                 mov     r0, #0x03               @ SYS_WRITEC
126         ARM(    svc     #0x123456       )
127         THUMB(  svc     #0xab           )
128                 mov     pc, lr
129 ENDPROC(printch)
130
131 ENTRY(debug_ll_addr)
132                 mov     r2, #0
133                 str     r2, [r0]
134                 str     r2, [r1]
135                 mov     pc, lr
136 ENDPROC(debug_ll_addr)
137
138 #endif