ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / arch / arm / kernel / debug.S
1 /*
2  *  linux/arch/arm/kernel/debug-armv.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/config.h>
13 #include <linux/linkage.h>
14 #include <asm/hardware.h>
15
16                 .text
17
18 /*
19  * Some debugging routines (useful if you've got MM problems and
20  * printk isn't working).  For DEBUGGING ONLY!!!  Do not leave
21  * references to these in a production kernel!
22  */
23 #if defined(CONFIG_ARCH_RPC)
24                 .macro  addruart,rx
25                 mov     \rx, #0xe0000000
26                 orr     \rx, \rx, #0x00010000
27                 orr     \rx, \rx, #0x00000fe0
28                 .endm
29
30                 .macro  senduart,rd,rx
31                 strb    \rd, [\rx]
32                 .endm
33
34                 .macro  busyuart,rd,rx
35 1001:           ldrb    \rd, [\rx, #0x14]
36                 and     \rd, \rd, #0x60
37                 teq     \rd, #0x60
38                 bne     1001b
39                 .endm
40
41                 .macro  waituart,rd,rx
42 1001:           ldrb    \rd, [\rx, #0x18]
43                 tst     \rd, #0x10
44                 beq     1001b
45                 .endm
46
47 #elif defined(CONFIG_DEBUG_ICEDCC)
48                 @@ debug using ARM EmbeddedICE DCC channel
49                 .macro  addruart, rx
50                 .endm
51
52                 .macro  senduart, rd, rx
53                 mcr     p14, 0, \rd, c1, c0, 0
54                 .endm
55
56                 .macro  busyuart, rd, rx
57 1001:
58                 mrc     p14, 0, \rx, c0, c0, 0
59                 tst     \rx, #2
60                 beq     1001b
61
62                 .endm
63
64                 .macro  waituart, rd, rx
65                 mov     \rd, #0x2000000
66 1001:
67                 subs    \rd, \rd, #1
68                 bmi     1002f
69                 mrc     p14, 0, \rx, c0, c0, 0
70                 tst     \rx, #2
71                 bne     1001b
72 1002:
73                 .endm
74
75 #elif defined(CONFIG_ARCH_EBSA110)
76                 .macro  addruart,rx
77                 mov     \rx, #0xf0000000
78                 orr     \rx, \rx, #0x00000be0
79                 .endm
80
81                 .macro  senduart,rd,rx
82                 strb    \rd, [\rx]
83                 .endm
84
85                 .macro  busyuart,rd,rx
86 1002:           ldrb    \rd, [\rx, #0x14]
87                 and     \rd, \rd, #0x60
88                 teq     \rd, #0x60
89                 bne     1002b
90                 .endm
91
92                 .macro  waituart,rd,rx
93 1001:           ldrb    \rd, [\rx, #0x18]
94                 tst     \rd, #0x10
95                 beq     1001b
96                 .endm
97         
98 #elif defined(CONFIG_ARCH_SHARK)
99                 .macro  addruart,rx
100                 mov     \rx, #0xe0000000
101                 orr     \rx, \rx, #0x000003f8
102                 .endm
103
104                 .macro  senduart,rd,rx
105                 strb    \rd, [\rx]
106                 .endm
107
108                 .macro  busyuart,rd,rx
109                 mov     \rd, #0
110 1001:           add     \rd, \rd, #1
111                 teq     \rd, #0x10000
112                 bne     1001b
113                 .endm
114
115                 .macro  waituart,rd,rx
116                 .endm
117
118 #elif defined(CONFIG_FOOTBRIDGE)
119
120 #include <asm/hardware/dec21285.h>
121
122 #ifndef CONFIG_DEBUG_DC21285_PORT
123         /* For NetWinder debugging */
124                 .macro  addruart,rx
125                 mrc     p15, 0, \rx, c1, c0
126                 tst     \rx, #1                 @ MMU enabled?
127                 moveq   \rx, #0x7c000000        @ physical
128                 movne   \rx, #0xff000000        @ virtual
129                 orr     \rx, \rx, #0x000003f8
130                 .endm
131
132                 .macro  senduart,rd,rx
133                 strb    \rd, [\rx]
134                 .endm
135
136                 .macro  busyuart,rd,rx
137 1002:           ldrb    \rd, [\rx, #0x5]
138                 and     \rd, \rd, #0x60
139                 teq     \rd, #0x60
140                 bne     1002b
141                 .endm
142
143                 .macro  waituart,rd,rx
144 1001:           ldrb    \rd, [\rx, #0x6]
145                 tst     \rd, #0x10
146                 beq     1001b
147                 .endm
148 #else
149         /* For EBSA285 debugging */
150                 .equ    dc21285_high, ARMCSR_BASE & 0xff000000
151                 .equ    dc21285_low,  ARMCSR_BASE & 0x00ffffff
152
153                 .macro  addruart,rx
154                 mov     \rx, #dc21285_high
155                 .if     dc21285_low
156                 orr     \rx, \rx, #dc21285_low
157                 .endif
158                 .endm
159
160                 .macro  senduart,rd,rx
161                 str     \rd, [\rx, #0x160]      @ UARTDR
162                 .endm
163
164                 .macro  busyuart,rd,rx
165 1001:           ldr     \rd, [\rx, #0x178]      @ UARTFLG
166                 tst     \rd, #1 << 3
167                 bne     1001b
168                 .endm
169
170                 .macro  waituart,rd,rx
171                 .endm
172 #endif
173 #elif defined(CONFIG_ARCH_FTVPCI)
174                 .macro  addruart,rx
175                 mrc     p15, 0, \rx, c1, c0
176                 tst     \rx, #1                 @ MMU enabled?
177                 movne   \rx, #0xe0000000
178                 moveq   \rx, #0x10000000
179                 .endm
180
181                 .macro  senduart,rd,rx
182                 str     \rd, [\rx, #0xc]
183                 .endm
184
185                 .macro  busyuart,rd,rx
186 1001:           ldr     \rd, [\rx, #0x4]
187                 tst     \rd, #1 << 2
188                 beq     1001b
189                 .endm
190
191                 .macro  waituart,rd,rx
192                 .endm
193
194 #elif defined(CONFIG_ARCH_SA1100)
195
196                 .macro  addruart,rx
197                 mrc     p15, 0, \rx, c1, c0
198                 tst     \rx, #1                 @ MMU enabled?
199                 moveq   \rx, #0x80000000        @ physical base address
200                 movne   \rx, #0xf8000000        @ virtual address
201
202                 @ We probe for the active serial port here, coherently with
203                 @ the comment in include/asm-arm/arch-sa1100/uncompress.h.
204                 @ We assume r1 can be clobbered.
205
206                 @ see if Ser3 is active
207                 add     \rx, \rx, #0x00050000
208                 ldr     r1, [\rx, #UTCR3]
209                 tst     r1, #UTCR3_TXE
210
211                 @ if Ser3 is inactive, then try Ser1
212                 addeq   \rx, \rx, #(0x00010000 - 0x00050000)
213                 ldreq   r1, [\rx, #UTCR3]
214                 tsteq   r1, #UTCR3_TXE
215
216                 @ if Ser1 is inactive, then try Ser2
217                 addeq   \rx, \rx, #(0x00030000 - 0x00010000)
218                 ldreq   r1, [\rx, #UTCR3]
219                 tsteq   r1, #UTCR3_TXE
220
221                 @ if all ports are inactive, then there is nothing we can do
222                 moveq   pc, lr
223                 .endm
224
225                 .macro  senduart,rd,rx
226                 str     \rd, [\rx, #UTDR]
227                 .endm
228
229                 .macro  waituart,rd,rx
230 1001:           ldr     \rd, [\rx, #UTSR1]
231                 tst     \rd, #UTSR1_TNF
232                 beq     1001b
233                 .endm
234
235                 .macro  busyuart,rd,rx
236 1001:           ldr     \rd, [\rx, #UTSR1]
237                 tst     \rd, #UTSR1_TBY
238                 bne     1001b
239                 .endm
240
241 #elif defined(CONFIG_ARCH_PXA)
242
243                 .macro  addruart,rx
244                 mrc     p15, 0, \rx, c1, c0
245                 tst     \rx, #1                 @ MMU enabled?
246                 moveq   \rx, #0x40000000                @ physical
247                 movne   \rx, #io_p2v(0x40000000)        @ virtual
248                 orr     \rx, \rx, #0x00100000
249                 .endm
250
251                 .macro  senduart,rd,rx
252                 str     \rd, [\rx, #0]
253                 .endm
254
255                 .macro  busyuart,rd,rx
256 1002:           ldr     \rd, [\rx, #0x14]
257                 tst     \rd, #(1 << 6)
258                 beq     1002b
259                 .endm
260
261                 .macro  waituart,rd,rx
262 1001:           ldr     \rd, [\rx, #0x14]
263                 tst     \rd, #(1 << 5)
264                 beq     1001b
265                 .endm
266 #elif defined(CONFIG_ARCH_CLPS7500)
267                 .macro  addruart,rx
268                 mov     \rx, #0xe0000000
269                 orr     \rx, \rx, #0x00010000
270                 orr     \rx, \rx, #0x00000be0
271                 .endm
272
273                 .macro  senduart,rd,rx
274                 strb    \rd, [\rx]
275                 .endm
276
277                 .macro  busyuart,rd,rx
278                 .endm
279
280                 .macro  waituart,rd,rx
281 1001:           ldrb    \rd, [\rx, #0x14]
282                 tst     \rd, #0x20
283                 beq     1001b
284                 .endm
285
286 #elif defined(CONFIG_ARCH_L7200)
287
288                 .equ    io_virt, IO_BASE
289                 .equ    io_phys, IO_START
290
291                 .macro  addruart,rx
292                 mrc     p15, 0, \rx, c1, c0
293                 tst     \rx, #1                 @ MMU enabled?
294                 moveq   \rx, #io_phys           @ physical base address
295                 movne   \rx, #io_virt           @ virtual address
296                 add     \rx, \rx, #0x00044000   @ UART1
297 @               add     \rx, \rx, #0x00045000   @ UART2
298                 .endm
299
300                 .macro  senduart,rd,rx
301                 str     \rd, [\rx, #0x0]        @ UARTDR
302                 .endm
303
304                 .macro  waituart,rd,rx
305 1001:           ldr     \rd, [\rx, #0x18]       @ UARTFLG
306                 tst     \rd, #1 << 5            @ UARTFLGUTXFF - 1 when full
307                 bne     1001b
308                 .endm
309
310                 .macro  busyuart,rd,rx
311 1001:           ldr     \rd, [\rx, #0x18]       @ UARTFLG
312                 tst     \rd, #1 << 3            @ UARTFLGUBUSY - 1 when busy
313                 bne     1001b
314                 .endm
315
316 #elif defined(CONFIG_ARCH_INTEGRATOR)
317
318 #include <asm/hardware/amba_serial.h>
319
320                 .macro  addruart,rx
321                 mrc     p15, 0, \rx, c1, c0
322                 tst     \rx, #1                 @ MMU enabled?
323                 moveq   \rx, #0x16000000        @ physical base address
324                 movne   \rx, #0xf0000000        @ virtual base
325                 addne   \rx, \rx, #0x16000000 >> 4
326                 .endm
327
328                 .macro  senduart,rd,rx
329                 strb    \rd, [\rx, #UART01x_DR]
330                 .endm
331
332                 .macro  waituart,rd,rx
333 1001:           ldr     \rd, [\rx, #0x18]       @ UARTFLG
334                 tst     \rd, #1 << 5            @ UARTFLGUTXFF - 1 when full
335                 bne     1001b
336                 .endm
337
338                 .macro  busyuart,rd,rx
339 1001:           ldr     \rd, [\rx, #0x18]       @ UARTFLG
340                 tst     \rd, #1 << 3            @ UARTFLGUBUSY - 1 when busy
341                 bne     1001b
342                 .endm
343
344 #elif defined(CONFIG_ARCH_CLPS711X)
345
346 #include <asm/hardware/clps7111.h>
347
348                 .macro  addruart,rx
349                 mrc     p15, 0, \rx, c1, c0
350                 tst     \rx, #1                 @ MMU enabled?
351                 moveq   \rx, #CLPS7111_PHYS_BASE
352                 movne   \rx, #CLPS7111_VIRT_BASE
353 #ifndef CONFIG_DEBUG_CLPS711X_UART2
354                 add     \rx, \rx, #0x0000       @ UART1
355 #else
356                 add     \rx, \rx, #0x1000       @ UART2
357 #endif
358                 .endm
359
360                 .macro  senduart,rd,rx
361                 str     \rd, [\rx, #0x0480]     @ UARTDR
362                 .endm
363
364                 .macro  waituart,rd,rx
365 1001:           ldr     \rd, [\rx, #0x0140]     @ SYSFLGx
366                 tst     \rd, #1 << 11           @ UBUSYx
367                 bne     1001b
368                 .endm
369
370                 .macro  busyuart,rd,rx
371                 tst     \rx, #0x1000            @ UART2 does not have CTS here
372                 bne     1002f
373 1001:           ldr     \rd, [\rx, #0x0140]     @ SYSFLGx
374                 tst     \rd, #1 << 8            @ CTS
375                 bne     1001b
376 1002:
377                 .endm
378
379 #elif defined(CONFIG_ARCH_CAMELOT)
380
381 #include <asm/arch/excalibur.h>
382 #define UART00_TYPE
383 #include <asm/arch/uart00.h>
384
385                 .macro  addruart,rx
386                 mrc     p15, 0, \rx, c1, c0
387                 tst     \rx, #1                 @ MMU enabled?
388                 ldr     \rx, =EXC_UART00_BASE   @ physical base address
389                 orrne   \rx, \rx, #0xff000000   @ virtual base
390                 orrne   \rx, \rx, #0x00f00000   
391                 .endm
392
393                 .macro  senduart,rd,rx
394                 str     \rd, [\rx, #UART_TD(0)]
395                 .endm
396
397                 .macro  waituart,rd,rx
398 1001:           ldr     \rd, [\rx, #UART_TSR(0)]
399                 and     \rd, \rd,  #UART_TSR_TX_LEVEL_MSK
400                 cmp     \rd, #15
401                 beq     1001b
402                 .endm
403
404                 .macro  busyuart,rd,rx
405 1001:           ldr     \rd, [\rx, #UART_TSR(0)]
406                 ands    \rd, \rd,  #UART_TSR_TX_LEVEL_MSK
407                 bne     1001b
408                 .endm
409
410 #elif defined(CONFIG_ARCH_IOP3XX)
411
412                 .macro  addruart,rx
413                 mov     \rx, #0xfe000000        @ physical
414 #ifdef CONFIG_ARCH_IQ80310
415                 orr     \rx, \rx, #0x00810000   @ location of the UART
416 #elif defined(CONFIG_ARCH_IQ80321)
417                 orr     \rx, \rx, #0x00800000   @ location of the UART
418 #else
419 #error Unknown IOP3XX implementation
420 #endif
421                 .endm
422
423                 .macro  senduart,rd,rx
424                 strb    \rd, [\rx]
425                 .endm
426
427                 .macro  busyuart,rd,rx
428 1002:           ldrb    \rd, [\rx, #0x5]
429                 and     \rd, \rd, #0x60
430                 teq     \rd, #0x60
431                 bne     1002b
432                 .endm
433
434                 .macro  waituart,rd,rx
435 #ifndef CONFIG_ARCH_IQ80321
436 1001:           ldrb    \rd, [\rx, #0x6]
437                 tst     \rd, #0x10
438                 beq     1001b
439 #endif
440                 .endm
441
442 #elif defined(CONFIG_ARCH_ADI_EVB)
443
444                 .macro  addruart,rx
445                 mrc     p15, 0, \rx, c1, c0
446                 tst     \rx, #1                 @ MMU enabled?
447                 mov     \rx, #0x00400000        @ physical base address
448                 orrne   \rx, \rx, #0xff000000   @ virtual base
449                 .endm
450
451                 .macro  senduart,rd,rx
452                 strb    \rd, [\rx]
453                 .endm
454
455                 .macro  busyuart,rd,rx
456 1002:           ldrb    \rd, [\rx, #0x5]
457                 and     \rd, \rd, #0x60
458                 teq     \rd, #0x60
459                 bne     1002b
460                 .endm
461
462                 .macro  waituart,rd,rx
463 1001:           ldrb    \rd, [\rx, #0x6]
464                 tst     \rd, #0x10
465                 beq     1001b
466                 .endm
467
468 #elif defined(CONFIG_ARCH_OMAP)
469
470 #include <asm/arch/serial.h>
471
472                 .macro  addruart,rx
473                 mov     \rx, #0xff000000
474                 orr     \rx, \rx, #0x00fb0000
475                 .endm
476
477                 .macro  senduart,rd,rx
478                 strb    \rd, [\rx]
479                 .endm
480
481                 .macro  busyuart,rd,rx
482 1002:           ldrb    \rd, [\rx, #(0x5 << OMAP_SERIAL_REG_SHIFT)]
483                 and     \rd, \rd, #0x60
484                 teq     \rd, #0x60
485                 bne     1002b
486                 .endm
487
488                 .macro  waituart,rd,rx
489 1001:           ldrb    \rd, [\rx, #(0x6 << OMAP_SERIAL_REG_SHIFT)]
490                 tst     \rd, #0x10
491                 beq     1001b
492                 .endm
493
494 #elif defined(CONFIG_ARCH_S3C2410)
495 #include <asm/arch/map.h>
496 #include <asm/arch/regs-serial.h>
497
498                 .macro addruart, rx
499                 mrc     p15, 0, \rx, c1, c0
500                 tst     \rx, #1
501                 ldreq   \rx, = S3C2410_PA_UART
502                 ldrne   \rx, = S3C2410_VA_UART
503 #if CONFIG_DEBUG_S3C2410_UART != 0
504                 add     \rx, \rx, #(S3C2410_UART1_OFF * CONFIG_DEBUG_S3C2410_UART)
505 #endif
506                 .endm
507
508                 .macro  senduart,rd,rx
509                 str     \rd, [\rx, # S3C2410_UTXH ]
510                 .endm
511
512                 .macro  busyuart, rd, rx
513                 ldr     \rd, [ \rx, # S3C2410_UFCON ]
514                 tst     \rd, #S3C2410_UFCON_FIFOMODE    @ fifo enabled?
515                 beq     1001f                           @
516                 @ FIFO enabled...
517 1003:
518                 ldr     \rd, [ \rx, # S3C2410_UFSTAT ]
519                 tst     \rd, #S3C2410_UFSTAT_TXFULL
520                 bne     1003b
521                 b       1002f
522
523 1001:
524                 @ busy waiting for non fifo
525                 ldr     \rd, [ \rx, # S3C2410_UTRSTAT ]
526                 tst     \rd, #S3C2410_UTRSTAT_TXFE
527                 beq     1001b
528
529 1002:           @ exit busyuart
530                 .endm
531
532                 .macro  waituart,rd,rx
533
534                 ldr     \rd, [ \rx, # S3C2410_UFCON ]
535                 tst     \rd, #S3C2410_UFCON_FIFOMODE    @ fifo enabled?
536                 beq     1001f                           @
537                 @ FIFO enabled...
538 1003:
539                 ldr     \rd, [ \rx, # S3C2410_UFSTAT ]
540                 ands    \rd, \rd, #15<<S3C2410_UFSTAT_TXSHIFT
541                 bne     1003b
542                 b       1002f
543
544 1001:
545                 @ idle waiting for non fifo
546                 ldr     \rd, [ \rx, # S3C2410_UTRSTAT ]
547                 tst     \rd, #S3C2410_UTRSTAT_TXFE
548                 beq     1001b
549
550 1002:           @ exit busyuart
551                 .endm
552
553 #elif defined(CONFIG_ARCH_LH7A40X)
554         @ It isn't known if this will be appropriate for every 40x
555         @ board.
556
557                 .macro  addruart,rx
558                 mrc     p15, 0, \rx, c1, c0
559                 tst     \rx, #1                 @ MMU enabled?
560                 ldr     \rx, =0x80000700        @ physical base address
561                 orrne   \rx, \rx, #0xf8000000   @ virtual base
562                 .endm
563
564                 .macro  senduart,rd,rx
565                 strb    \rd, [\rx]              @ DATA
566                 .endm
567
568                 .macro  busyuart,rd,rx          @ spin while busy
569 1001:           ldr     \rd, [\rx, #0x10]       @ STATUS
570                 tst     \rd, #1 << 3            @ BUSY (TX FIFO not empty)
571                 bne     1001b                   @ yes, spin
572                 .endm
573
574                 .macro  waituart,rd,rx          @ wait for Tx FIFO room
575 1001:           ldrb    \rd, [\rx, #0x10]       @ STATUS
576                 tst     \rd, #1 << 5            @ TXFF (TX FIFO full)
577                 bne     1001b                   @ yes, spin
578                 .endm
579
580
581 #elif defined(CONFIG_ARCH_VERSATILE_PB)
582
583 #include <asm/hardware/amba_serial.h>
584
585                 .macro  addruart,rx
586                 mrc     p15, 0, \rx, c1, c0
587                 tst     \rx, #1                 @ MMU enabled?
588                 moveq   \rx,      #0x10000000
589                 movne   \rx,      #0xf1000000   @ virtual base
590                 orr     \rx, \rx, #0x001F0000
591                 orr     \rx, \rx, #0x00001000
592                 .endm
593
594                 .macro  senduart,rd,rx
595                 strb    \rd, [\rx, #UART01x_DR]
596                 .endm
597
598                 .macro  waituart,rd,rx
599 1001:           ldr     \rd, [\rx, #0x18]       @ UARTFLG
600                 tst     \rd, #1 << 5            @ UARTFLGUTXFF - 1 when full
601                 bne     1001b
602                 .endm
603
604                 .macro  busyuart,rd,rx
605 1001:           ldr     \rd, [\rx, #0x18]       @ UARTFLG
606                 tst     \rd, #1 << 3            @ UARTFLGUBUSY - 1 when busy
607                 bne     1001b
608                 .endm
609 #else
610 #error Unknown architecture
611 #endif
612
613 /*
614  * Useful debugging routines
615  */
616 ENTRY(printhex8)
617                 mov     r1, #8
618                 b       printhex
619
620 ENTRY(printhex4)
621                 mov     r1, #4
622                 b       printhex
623
624 ENTRY(printhex2)
625                 mov     r1, #2
626 printhex:       adr     r2, hexbuf
627                 add     r3, r2, r1
628                 mov     r1, #0
629                 strb    r1, [r3]
630 1:              and     r1, r0, #15
631                 mov     r0, r0, lsr #4
632                 cmp     r1, #10
633                 addlt   r1, r1, #'0'
634                 addge   r1, r1, #'a' - 10
635                 strb    r1, [r3, #-1]!
636                 teq     r3, r2
637                 bne     1b
638                 mov     r0, r2
639                 b       printascii
640
641                 .ltorg
642
643 ENTRY(printascii)
644                 addruart r3
645                 b       2f
646 1:              waituart r2, r3
647                 senduart r1, r3
648                 busyuart r2, r3
649                 teq     r1, #'\n'
650                 moveq   r1, #'\r'
651                 beq     1b
652 2:              teq     r0, #0
653                 ldrneb  r1, [r0], #1
654                 teqne   r1, #0
655                 bne     1b
656                 mov     pc, lr
657
658 ENTRY(printch)
659                 addruart r3
660                 mov     r1, r0
661                 mov     r0, #0
662                 b       1b
663
664 hexbuf:         .space 16