2 * linux/arch/arm/kernel/debug-armv.S
4 * Copyright (C) 1994-1999 Russell King
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.
10 * 32-bit debugging code
12 #include <linux/config.h>
13 #include <linux/linkage.h>
14 #include <asm/hardware.h>
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!
23 #if defined(CONFIG_ARCH_RPC)
26 orr \rx, \rx, #0x00010000
27 orr \rx, \rx, #0x00000fe0
35 1001: ldrb \rd, [\rx, #0x14]
42 1001: ldrb \rd, [\rx, #0x18]
47 #elif defined(CONFIG_DEBUG_ICEDCC)
48 @@ debug using ARM EmbeddedICE DCC channel
52 .macro senduart, rd, rx
53 mcr p14, 0, \rd, c1, c0, 0
56 .macro busyuart, rd, rx
58 mrc p14, 0, \rx, c0, c0, 0
64 .macro waituart, rd, rx
69 mrc p14, 0, \rx, c0, c0, 0
75 #elif defined(CONFIG_ARCH_EBSA110)
78 orr \rx, \rx, #0x00000be0
86 1002: ldrb \rd, [\rx, #0x14]
93 1001: ldrb \rd, [\rx, #0x18]
98 #elif defined(CONFIG_ARCH_SHARK)
101 orr \rx, \rx, #0x000003f8
104 .macro senduart,rd,rx
108 .macro busyuart,rd,rx
110 1001: add \rd, \rd, #1
115 .macro waituart,rd,rx
118 #elif defined(CONFIG_FOOTBRIDGE)
120 #include <asm/hardware/dec21285.h>
122 #ifndef CONFIG_DEBUG_DC21285_PORT
123 /* For NetWinder debugging */
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
132 .macro senduart,rd,rx
136 .macro busyuart,rd,rx
137 1002: ldrb \rd, [\rx, #0x5]
143 .macro waituart,rd,rx
144 1001: ldrb \rd, [\rx, #0x6]
149 /* For EBSA285 debugging */
150 .equ dc21285_high, ARMCSR_BASE & 0xff000000
151 .equ dc21285_low, ARMCSR_BASE & 0x00ffffff
154 mov \rx, #dc21285_high
156 orr \rx, \rx, #dc21285_low
160 .macro senduart,rd,rx
161 str \rd, [\rx, #0x160] @ UARTDR
164 .macro busyuart,rd,rx
165 1001: ldr \rd, [\rx, #0x178] @ UARTFLG
170 .macro waituart,rd,rx
173 #elif defined(CONFIG_ARCH_FTVPCI)
175 mrc p15, 0, \rx, c1, c0
176 tst \rx, #1 @ MMU enabled?
177 movne \rx, #0xe0000000
178 moveq \rx, #0x10000000
181 .macro senduart,rd,rx
185 .macro busyuart,rd,rx
186 1001: ldr \rd, [\rx, #0x4]
191 .macro waituart,rd,rx
194 #elif defined(CONFIG_ARCH_SA1100)
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
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.
206 @ see if Ser3 is active
207 add \rx, \rx, #0x00050000
208 ldr r1, [\rx, #UTCR3]
211 @ if Ser3 is inactive, then try Ser1
212 addeq \rx, \rx, #(0x00010000 - 0x00050000)
213 ldreq r1, [\rx, #UTCR3]
216 @ if Ser1 is inactive, then try Ser2
217 addeq \rx, \rx, #(0x00030000 - 0x00010000)
218 ldreq r1, [\rx, #UTCR3]
221 @ if all ports are inactive, then there is nothing we can do
225 .macro senduart,rd,rx
226 str \rd, [\rx, #UTDR]
229 .macro waituart,rd,rx
230 1001: ldr \rd, [\rx, #UTSR1]
235 .macro busyuart,rd,rx
236 1001: ldr \rd, [\rx, #UTSR1]
241 #elif defined(CONFIG_ARCH_PXA)
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
251 .macro senduart,rd,rx
255 .macro busyuart,rd,rx
256 1002: ldr \rd, [\rx, #0x14]
261 .macro waituart,rd,rx
262 1001: ldr \rd, [\rx, #0x14]
266 #elif defined(CONFIG_ARCH_CLPS7500)
269 orr \rx, \rx, #0x00010000
270 orr \rx, \rx, #0x00000be0
273 .macro senduart,rd,rx
277 .macro busyuart,rd,rx
280 .macro waituart,rd,rx
281 1001: ldrb \rd, [\rx, #0x14]
286 #elif defined(CONFIG_ARCH_L7200)
288 .equ io_virt, IO_BASE
289 .equ io_phys, IO_START
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
300 .macro senduart,rd,rx
301 str \rd, [\rx, #0x0] @ UARTDR
304 .macro waituart,rd,rx
305 1001: ldr \rd, [\rx, #0x18] @ UARTFLG
306 tst \rd, #1 << 5 @ UARTFLGUTXFF - 1 when full
310 .macro busyuart,rd,rx
311 1001: ldr \rd, [\rx, #0x18] @ UARTFLG
312 tst \rd, #1 << 3 @ UARTFLGUBUSY - 1 when busy
316 #elif defined(CONFIG_ARCH_INTEGRATOR)
318 #include <asm/hardware/amba_serial.h>
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
328 .macro senduart,rd,rx
329 strb \rd, [\rx, #UART01x_DR]
332 .macro waituart,rd,rx
333 1001: ldr \rd, [\rx, #0x18] @ UARTFLG
334 tst \rd, #1 << 5 @ UARTFLGUTXFF - 1 when full
338 .macro busyuart,rd,rx
339 1001: ldr \rd, [\rx, #0x18] @ UARTFLG
340 tst \rd, #1 << 3 @ UARTFLGUBUSY - 1 when busy
344 #elif defined(CONFIG_ARCH_CLPS711X)
346 #include <asm/hardware/clps7111.h>
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
356 add \rx, \rx, #0x1000 @ UART2
360 .macro senduart,rd,rx
361 str \rd, [\rx, #0x0480] @ UARTDR
364 .macro waituart,rd,rx
365 1001: ldr \rd, [\rx, #0x0140] @ SYSFLGx
366 tst \rd, #1 << 11 @ UBUSYx
370 .macro busyuart,rd,rx
371 tst \rx, #0x1000 @ UART2 does not have CTS here
373 1001: ldr \rd, [\rx, #0x0140] @ SYSFLGx
374 tst \rd, #1 << 8 @ CTS
379 #elif defined(CONFIG_ARCH_CAMELOT)
381 #include <asm/arch/excalibur.h>
383 #include <asm/arch/uart00.h>
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
393 .macro senduart,rd,rx
394 str \rd, [\rx, #UART_TD(0)]
397 .macro waituart,rd,rx
398 1001: ldr \rd, [\rx, #UART_TSR(0)]
399 and \rd, \rd, #UART_TSR_TX_LEVEL_MSK
404 .macro busyuart,rd,rx
405 1001: ldr \rd, [\rx, #UART_TSR(0)]
406 ands \rd, \rd, #UART_TSR_TX_LEVEL_MSK
410 #elif defined(CONFIG_ARCH_IOP3XX)
413 mov \rx, #0xfe000000 @ physical
414 #if defined(CONFIG_ARCH_IQ80321) || defined(CONFIG_ARCH_IQ31244)
415 orr \rx, \rx, #0x00800000 @ location of the UART
416 #elif defined(CONFIG_ARCH_IOP331)
417 mrc p15, 0, \rx, c1, c0
418 tst \rx, #1 @ MMU enabled?
419 moveq \rx, #0x000fe000 @ Physical Base
421 orr \rx, \rx, #0xfe000000
422 orr \rx, \rx, #0x00f00000 @ Virtual Base
423 orr \rx, \rx, #0x00001700 @ location of the UART
425 #error Unknown IOP3XX implementation
429 .macro senduart,rd,rx
433 .macro busyuart,rd,rx
434 1002: ldrb \rd, [\rx, #0x5]
440 .macro waituart,rd,rx
441 #if !defined(CONFIG_ARCH_IQ80321) || !defined(CONFIG_ARCH_IQ31244) || !defined(CONFIG_ARCH_IQ80331)
442 1001: ldrb \rd, [\rx, #0x6]
448 #elif defined(CONFIG_ARCH_IXP4XX)
451 mrc p15, 0, \rx, c1, c0
452 tst \rx, #1 @ MMU enabled?
453 moveq \rx, #0xc8000000
454 movne \rx, #0xff000000
455 add \rx,\rx,#3 @ Uart regs are at off set of 3 if
456 @ byte writes used - Big Endian.
459 .macro senduart,rd,rx
463 .macro waituart,rd,rx
464 1002: ldrb \rd, [\rx, #0x14]
465 and \rd, \rd, #0x60 @ check THRE and TEMT bits
470 .macro busyuart,rd,rx
473 #elif defined(CONFIG_ARCH_IXP2000)
476 mrc p15, 0, \rx, c1, c0
477 tst \rx, #1 @ MMU enabled?
478 moveq \rx, #0xc0000000 @ Physical base
479 movne \rx, #0xfe000000 @ virtual base
480 orrne \rx, \rx, #0x00f00000
481 orr \rx, \rx, #0x00030000
483 orr \rx, \rx, #0x00000003
487 .macro senduart,rd,rx
491 .macro busyuart,rd,rx
492 1002: ldrb \rd, [\rx, #0x14]
497 .macro waituart,rd,rx
503 #elif defined(CONFIG_ARCH_OMAP)
506 mrc p15, 0, \rx, c1, c0
507 tst \rx, #1 @ MMU enabled?
508 moveq \rx, #0xff000000 @ physical base address
509 movne \rx, #0xfe000000 @ virtual base
510 orr \rx, \rx, #0x00fb0000
511 #ifdef CONFIG_OMAP_LL_DEBUG_UART3
512 orr \rx, \rx, #0x00009000 @ UART 3
514 #if defined(CONFIG_OMAP_LL_DEBUG_UART2) || defined(CONFIG_OMAP_LL_DEBUG_UART3)
515 orr \rx, \rx, #0x00000800 @ UART 2 & 3
519 .macro senduart,rd,rx
523 .macro busyuart,rd,rx
524 1001: ldrb \rd, [\rx, #(0x5 << 2)] @ OMAP-1510 and friends
528 ldrb \rd, [\rx, #(0x5 << 0)] @ OMAP-730 only
535 .macro waituart,rd,rx
538 #elif defined(CONFIG_ARCH_S3C2410)
539 #include <asm/arch/map.h>
540 #include <asm/arch/regs-serial.h>
543 mrc p15, 0, \rx, c1, c0
545 ldreq \rx, = S3C2410_PA_UART
546 ldrne \rx, = S3C2410_VA_UART
547 #if CONFIG_DEBUG_S3C2410_UART != 0
548 add \rx, \rx, #(S3C2410_UART1_OFF * CONFIG_DEBUG_S3C2410_UART)
552 .macro senduart,rd,rx
553 str \rd, [\rx, # S3C2410_UTXH ]
556 .macro busyuart, rd, rx
557 ldr \rd, [ \rx, # S3C2410_UFCON ]
558 tst \rd, #S3C2410_UFCON_FIFOMODE @ fifo enabled?
562 ldr \rd, [ \rx, # S3C2410_UFSTAT ]
563 tst \rd, #S3C2410_UFSTAT_TXFULL
568 @ busy waiting for non fifo
569 ldr \rd, [ \rx, # S3C2410_UTRSTAT ]
570 tst \rd, #S3C2410_UTRSTAT_TXFE
573 1002: @ exit busyuart
576 .macro waituart,rd,rx
578 ldr \rd, [ \rx, # S3C2410_UFCON ]
579 tst \rd, #S3C2410_UFCON_FIFOMODE @ fifo enabled?
583 ldr \rd, [ \rx, # S3C2410_UFSTAT ]
584 ands \rd, \rd, #15<<S3C2410_UFSTAT_TXSHIFT
589 @ idle waiting for non fifo
590 ldr \rd, [ \rx, # S3C2410_UTRSTAT ]
591 tst \rd, #S3C2410_UTRSTAT_TXFE
594 1002: @ exit busyuart
597 #elif defined(CONFIG_ARCH_LH7A40X)
598 @ It is not known if this will be appropriate for every 40x
602 mrc p15, 0, \rx, c1, c0
603 tst \rx, #1 @ MMU enabled?
604 mov \rx, #0x00000700 @ offset from base
605 orreq \rx, \rx, #0x80000000 @ physical base
606 orrne \rx, \rx, #0xf8000000 @ virtual base
609 .macro senduart,rd,rx
610 strb \rd, [\rx] @ DATA
613 .macro busyuart,rd,rx @ spin while busy
614 1001: ldr \rd, [\rx, #0x10] @ STATUS
615 tst \rd, #1 << 3 @ BUSY (TX FIFO not empty)
616 bne 1001b @ yes, spin
619 .macro waituart,rd,rx @ wait for Tx FIFO room
620 1001: ldrb \rd, [\rx, #0x10] @ STATUS
621 tst \rd, #1 << 5 @ TXFF (TX FIFO full)
622 bne 1001b @ yes, spin
626 #elif defined(CONFIG_ARCH_VERSATILE_PB)
628 #include <asm/hardware/amba_serial.h>
631 mrc p15, 0, \rx, c1, c0
632 tst \rx, #1 @ MMU enabled?
633 moveq \rx, #0x10000000
634 movne \rx, #0xf1000000 @ virtual base
635 orr \rx, \rx, #0x001F0000
636 orr \rx, \rx, #0x00001000
639 .macro senduart,rd,rx
640 strb \rd, [\rx, #UART01x_DR]
643 .macro waituart,rd,rx
644 1001: ldr \rd, [\rx, #0x18] @ UARTFLG
645 tst \rd, #1 << 5 @ UARTFLGUTXFF - 1 when full
649 .macro busyuart,rd,rx
650 1001: ldr \rd, [\rx, #0x18] @ UARTFLG
651 tst \rd, #1 << 3 @ UARTFLGUBUSY - 1 when busy
655 #elif defined(CONFIG_ARCH_IMX)
658 mrc p15, 0, \rx, c1, c0
659 tst \rx, #1 @ MMU enabled?
660 moveq \rx, #0x00000000 @ physical
661 movne \rx, #0xe0000000 @ virtual
662 orr \rx, \rx, #0x00200000
663 orr \rx, \rx, #0x00006000 @ UART1 offset
666 .macro senduart,rd,rx
667 str \rd, [\rx, #0x40] @ TXDATA
670 .macro waituart,rd,rx
673 .macro busyuart,rd,rx
674 1002: ldr \rd, [\rx, #0x98] @ SR2
675 tst \rd, #1 << 3 @ TXDC
676 beq 1002b @ wait until transmit done
679 #elif defined(CONFIG_ARCH_H720X)
681 .equ io_virt, IO_BASE
682 .equ io_phys, IO_START
685 mrc p15, 0, \rx, c1, c0
686 tst \rx, #1 @ MMU enabled?
687 moveq \rx, #io_phys @ physical base address
688 movne \rx, #io_virt @ virtual address
689 add \rx, \rx, #0x00020000 @ UART1
692 .macro senduart,rd,rx
693 str \rd, [\rx, #0x0] @ UARTDR
697 .macro waituart,rd,rx
698 1001: ldr \rd, [\rx, #0x18] @ UARTFLG
699 tst \rd, #1 << 5 @ UARTFLGUTXFF - 1 when full
703 .macro busyuart,rd,rx
704 1001: ldr \rd, [\rx, #0x18] @ UARTFLG
705 tst \rd, #1 << 3 @ UARTFLGUBUSY - 1 when busy
708 #elif defined(CONFIG_ARCH_MOXACPU)
710 mrc p15, 0, \rx, c1, c0
712 moveq \rx, #0x98000000
713 addeq \rx, \rx, #2 << 20
714 movne \rx, #0xf0000000
715 addne \rx, \rx, #0x09800000
716 addne \rx, \rx, #0x2 << 20
720 .macro senduart,rd,rx
724 .macro waituart,rd,rx
725 1001: ldr \rd, [\rx, #0x20] @ UARTFLG
726 tst \rd, #1 << 5 @ UARTFLGUTXFF - 1 when full
730 .macro busyuart,rd,rx
732 nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop
733 nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop
734 nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop
735 nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop
739 #error Unknown architecture
743 * Useful debugging routines
755 printhex: adr r2, hexbuf
763 addge r1, r1, #'a' - 10