mm: fix exec activate_mm vs TLB shootdown and lazy tlb switching race
[linux/fpc-iii.git] / arch / arm / kernel / debug.S
blob0a498cb3fad88d046c23073a5d1b7785fdfaf1a7
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>
15                 .text
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  */
23 #if !defined(CONFIG_DEBUG_SEMIHOSTING)
24 #include CONFIG_DEBUG_LL_INCLUDE
25 #endif
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
36 #else /* !CONFIG_MMU */
37                 .macro  addruart_current, rx, tmp1, tmp2
38                 addruart        \rx, \tmp1, \tmp2
39                 .endm
41 #endif /* CONFIG_MMU */
44  * Useful debugging routines
45  */
46 ENTRY(printhex8)
47                 mov     r1, #8
48                 b       printhex
49 ENDPROC(printhex8)
51 ENTRY(printhex4)
52                 mov     r1, #4
53                 b       printhex
54 ENDPROC(printhex4)
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)
74 hexbuf:         .space 16
76                 .ltorg
78 #ifndef CONFIG_DEBUG_SEMIHOSTING
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                 ret     lr
94 ENDPROC(printascii)
96 ENTRY(printch)
97                 addruart_current r3, r1, r2
98                 mov     r1, r0
99                 mov     r0, #0
100                 b       1b
101 ENDPROC(printch)
103 #ifdef CONFIG_MMU
104 ENTRY(debug_ll_addr)
105                 addruart r2, r3, ip
106                 str     r2, [r0]
107                 str     r3, [r1]
108                 ret     lr
109 ENDPROC(debug_ll_addr)
110 #endif
112 #else
114 ENTRY(printascii)
115                 mov     r1, r0
116                 mov     r0, #0x04               @ SYS_WRITE0
117         ARM(    svc     #0x123456       )
118 #ifdef CONFIG_CPU_V7M
119         THUMB(  bkpt    #0xab           )
120 #else
121         THUMB(  svc     #0xab           )
122 #endif
123                 ret     lr
124 ENDPROC(printascii)
126 ENTRY(printch)
127                 adr     r1, hexbuf
128                 strb    r0, [r1]
129                 mov     r0, #0x03               @ SYS_WRITEC
130         ARM(    svc     #0x123456       )
131 #ifdef CONFIG_CPU_V7M
132         THUMB(  bkpt    #0xab           )
133 #else
134         THUMB(  svc     #0xab           )
135 #endif
136                 ret     lr
137 ENDPROC(printch)
139 ENTRY(debug_ll_addr)
140                 mov     r2, #0
141                 str     r2, [r0]
142                 str     r2, [r1]
143                 ret     lr
144 ENDPROC(debug_ll_addr)
146 #endif