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 */ 46ENTRY(printhex8) 47 mov r1, #8 48 b printhex 49ENDPROC(printhex8) 50 51ENTRY(printhex4) 52 mov r1, #4 53 b printhex 54ENDPROC(printhex4) 55 56ENTRY(printhex2) 57 mov r1, #2 58printhex: adr r2, hexbuf 59 add r3, r2, r1 60 mov r1, #0 61 strb r1, [r3] 621: 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 72ENDPROC(printhex2) 73 74hexbuf: .space 16 75 76 .ltorg 77 78#ifndef CONFIG_DEBUG_SEMIHOSTING 79 80ENTRY(printascii) 81 addruart_current r3, r1, r2 82 b 2f 831: waituart r2, r3 84 senduart r1, r3 85 busyuart r2, r3 86 teq r1, #'\n' 87 moveq r1, #'\r' 88 beq 1b 892: teq r0, #0 90 ldrneb r1, [r0], #1 91 teqne r1, #0 92 bne 1b 93 mov pc, lr 94ENDPROC(printascii) 95 96ENTRY(printch) 97 addruart_current r3, r1, r2 98 mov r1, r0 99 mov r0, #0 100 b 1b 101ENDPROC(printch) 102 103ENTRY(debug_ll_addr) 104 addruart r2, r3, ip 105 str r2, [r0] 106 str r3, [r1] 107 mov pc, lr 108ENDPROC(debug_ll_addr) 109 110#else 111 112ENTRY(printascii) 113 mov r1, r0 114 mov r0, #0x04 @ SYS_WRITE0 115 ARM( svc #0x123456 ) 116 THUMB( svc #0xab ) 117 mov pc, lr 118ENDPROC(printascii) 119 120ENTRY(printch) 121 adr r1, hexbuf 122 strb r0, [r1] 123 mov r0, #0x03 @ SYS_WRITEC 124 ARM( svc #0x123456 ) 125 THUMB( svc #0xab ) 126 mov pc, lr 127ENDPROC(printch) 128 129ENTRY(debug_ll_addr) 130 mov r2, #0 131 str r2, [r0] 132 str r2, [r1] 133 mov pc, lr 134ENDPROC(debug_ll_addr) 135 136#endif 137