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 103#ifdef CONFIG_MMU 104ENTRY(debug_ll_addr) 105 addruart r2, r3, ip 106 str r2, [r0] 107 str r3, [r1] 108 mov pc, lr 109ENDPROC(debug_ll_addr) 110#endif 111 112#else 113 114ENTRY(printascii) 115 mov r1, r0 116 mov r0, #0x04 @ SYS_WRITE0 117 ARM( svc #0x123456 ) 118 THUMB( svc #0xab ) 119 mov pc, lr 120ENDPROC(printascii) 121 122ENTRY(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 129ENDPROC(printch) 130 131ENTRY(debug_ll_addr) 132 mov r2, #0 133 str r2, [r0] 134 str r2, [r1] 135 mov pc, lr 136ENDPROC(debug_ll_addr) 137 138#endif 139