1*1cfe9fa0SMasahiro Yamada/* 2*1cfe9fa0SMasahiro Yamada * linux/arch/arm/kernel/debug.S 3*1cfe9fa0SMasahiro Yamada * 4*1cfe9fa0SMasahiro Yamada * Copyright (C) 1994-1999 Russell King 5*1cfe9fa0SMasahiro Yamada * 6*1cfe9fa0SMasahiro Yamada * This program is free software; you can redistribute it and/or modify 7*1cfe9fa0SMasahiro Yamada * it under the terms of the GNU General Public License version 2 as 8*1cfe9fa0SMasahiro Yamada * published by the Free Software Foundation. 9*1cfe9fa0SMasahiro Yamada * 10*1cfe9fa0SMasahiro Yamada * 32-bit debugging code 11*1cfe9fa0SMasahiro Yamada */ 12*1cfe9fa0SMasahiro Yamada#include <linux/linkage.h> 13*1cfe9fa0SMasahiro Yamada#include <asm/assembler.h> 14*1cfe9fa0SMasahiro Yamada 15*1cfe9fa0SMasahiro Yamada .text 16*1cfe9fa0SMasahiro Yamada 17*1cfe9fa0SMasahiro Yamada/* 18*1cfe9fa0SMasahiro Yamada * Some debugging routines (useful if you've got MM problems and 19*1cfe9fa0SMasahiro Yamada * printk isn't working). For DEBUGGING ONLY!!! Do not leave 20*1cfe9fa0SMasahiro Yamada * references to these in a production kernel! 21*1cfe9fa0SMasahiro Yamada */ 22*1cfe9fa0SMasahiro Yamada 23*1cfe9fa0SMasahiro Yamada#if !defined(CONFIG_DEBUG_SEMIHOSTING) 24*1cfe9fa0SMasahiro Yamada#include CONFIG_DEBUG_LL_INCLUDE 25*1cfe9fa0SMasahiro Yamada#endif 26*1cfe9fa0SMasahiro Yamada 27*1cfe9fa0SMasahiro Yamada#ifdef CONFIG_MMU 28*1cfe9fa0SMasahiro Yamada .macro addruart_current, rx, tmp1, tmp2 29*1cfe9fa0SMasahiro Yamada addruart \tmp1, \tmp2, \rx 30*1cfe9fa0SMasahiro Yamada mrc p15, 0, \rx, c1, c0 31*1cfe9fa0SMasahiro Yamada tst \rx, #1 32*1cfe9fa0SMasahiro Yamada moveq \rx, \tmp1 33*1cfe9fa0SMasahiro Yamada movne \rx, \tmp2 34*1cfe9fa0SMasahiro Yamada .endm 35*1cfe9fa0SMasahiro Yamada 36*1cfe9fa0SMasahiro Yamada#else /* !CONFIG_MMU */ 37*1cfe9fa0SMasahiro Yamada .macro addruart_current, rx, tmp1, tmp2 38*1cfe9fa0SMasahiro Yamada addruart \rx, \tmp1 39*1cfe9fa0SMasahiro Yamada .endm 40*1cfe9fa0SMasahiro Yamada 41*1cfe9fa0SMasahiro Yamada#endif /* CONFIG_MMU */ 42*1cfe9fa0SMasahiro Yamada 43*1cfe9fa0SMasahiro Yamada/* 44*1cfe9fa0SMasahiro Yamada * Useful debugging routines 45*1cfe9fa0SMasahiro Yamada */ 46*1cfe9fa0SMasahiro YamadaENTRY(printhex8) 47*1cfe9fa0SMasahiro Yamada mov r1, #8 48*1cfe9fa0SMasahiro Yamada b printhex 49*1cfe9fa0SMasahiro YamadaENDPROC(printhex8) 50*1cfe9fa0SMasahiro Yamada 51*1cfe9fa0SMasahiro YamadaENTRY(printhex4) 52*1cfe9fa0SMasahiro Yamada mov r1, #4 53*1cfe9fa0SMasahiro Yamada b printhex 54*1cfe9fa0SMasahiro YamadaENDPROC(printhex4) 55*1cfe9fa0SMasahiro Yamada 56*1cfe9fa0SMasahiro YamadaENTRY(printhex2) 57*1cfe9fa0SMasahiro Yamada mov r1, #2 58*1cfe9fa0SMasahiro Yamadaprinthex: adr r2, hexbuf 59*1cfe9fa0SMasahiro Yamada add r3, r2, r1 60*1cfe9fa0SMasahiro Yamada mov r1, #0 61*1cfe9fa0SMasahiro Yamada strb r1, [r3] 62*1cfe9fa0SMasahiro Yamada1: and r1, r0, #15 63*1cfe9fa0SMasahiro Yamada mov r0, r0, lsr #4 64*1cfe9fa0SMasahiro Yamada cmp r1, #10 65*1cfe9fa0SMasahiro Yamada addlt r1, r1, #'0' 66*1cfe9fa0SMasahiro Yamada addge r1, r1, #'a' - 10 67*1cfe9fa0SMasahiro Yamada strb r1, [r3, #-1]! 68*1cfe9fa0SMasahiro Yamada teq r3, r2 69*1cfe9fa0SMasahiro Yamada bne 1b 70*1cfe9fa0SMasahiro Yamada mov r0, r2 71*1cfe9fa0SMasahiro Yamada b printascii 72*1cfe9fa0SMasahiro YamadaENDPROC(printhex2) 73*1cfe9fa0SMasahiro Yamada 74*1cfe9fa0SMasahiro Yamadahexbuf: .space 16 75*1cfe9fa0SMasahiro Yamada 76*1cfe9fa0SMasahiro Yamada .ltorg 77*1cfe9fa0SMasahiro Yamada 78*1cfe9fa0SMasahiro Yamada#ifndef CONFIG_DEBUG_SEMIHOSTING 79*1cfe9fa0SMasahiro Yamada 80*1cfe9fa0SMasahiro YamadaENTRY(printascii) 81*1cfe9fa0SMasahiro Yamada addruart_current r3, r1, r2 82*1cfe9fa0SMasahiro Yamada b 2f 83*1cfe9fa0SMasahiro Yamada1: waituart r2, r3 84*1cfe9fa0SMasahiro Yamada senduart r1, r3 85*1cfe9fa0SMasahiro Yamada busyuart r2, r3 86*1cfe9fa0SMasahiro Yamada teq r1, #'\n' 87*1cfe9fa0SMasahiro Yamada moveq r1, #'\r' 88*1cfe9fa0SMasahiro Yamada beq 1b 89*1cfe9fa0SMasahiro Yamada2: teq r0, #0 90*1cfe9fa0SMasahiro Yamada ldrneb r1, [r0], #1 91*1cfe9fa0SMasahiro Yamada teqne r1, #0 92*1cfe9fa0SMasahiro Yamada bne 1b 93*1cfe9fa0SMasahiro Yamada mov pc, lr 94*1cfe9fa0SMasahiro YamadaENDPROC(printascii) 95*1cfe9fa0SMasahiro Yamada 96*1cfe9fa0SMasahiro YamadaENTRY(printch) 97*1cfe9fa0SMasahiro Yamada addruart_current r3, r1, r2 98*1cfe9fa0SMasahiro Yamada mov r1, r0 99*1cfe9fa0SMasahiro Yamada mov r0, #0 100*1cfe9fa0SMasahiro Yamada b 1b 101*1cfe9fa0SMasahiro YamadaENDPROC(printch) 102*1cfe9fa0SMasahiro Yamada 103*1cfe9fa0SMasahiro Yamada#ifdef CONFIG_MMU 104*1cfe9fa0SMasahiro YamadaENTRY(debug_ll_addr) 105*1cfe9fa0SMasahiro Yamada addruart r2, r3, ip 106*1cfe9fa0SMasahiro Yamada str r2, [r0] 107*1cfe9fa0SMasahiro Yamada str r3, [r1] 108*1cfe9fa0SMasahiro Yamada mov pc, lr 109*1cfe9fa0SMasahiro YamadaENDPROC(debug_ll_addr) 110*1cfe9fa0SMasahiro Yamada#endif 111*1cfe9fa0SMasahiro Yamada 112*1cfe9fa0SMasahiro Yamada#else 113*1cfe9fa0SMasahiro Yamada 114*1cfe9fa0SMasahiro YamadaENTRY(printascii) 115*1cfe9fa0SMasahiro Yamada mov r1, r0 116*1cfe9fa0SMasahiro Yamada mov r0, #0x04 @ SYS_WRITE0 117*1cfe9fa0SMasahiro Yamada ARM( svc #0x123456 ) 118*1cfe9fa0SMasahiro Yamada THUMB( svc #0xab ) 119*1cfe9fa0SMasahiro Yamada mov pc, lr 120*1cfe9fa0SMasahiro YamadaENDPROC(printascii) 121*1cfe9fa0SMasahiro Yamada 122*1cfe9fa0SMasahiro YamadaENTRY(printch) 123*1cfe9fa0SMasahiro Yamada adr r1, hexbuf 124*1cfe9fa0SMasahiro Yamada strb r0, [r1] 125*1cfe9fa0SMasahiro Yamada mov r0, #0x03 @ SYS_WRITEC 126*1cfe9fa0SMasahiro Yamada ARM( svc #0x123456 ) 127*1cfe9fa0SMasahiro Yamada THUMB( svc #0xab ) 128*1cfe9fa0SMasahiro Yamada mov pc, lr 129*1cfe9fa0SMasahiro YamadaENDPROC(printch) 130*1cfe9fa0SMasahiro Yamada 131*1cfe9fa0SMasahiro YamadaENTRY(debug_ll_addr) 132*1cfe9fa0SMasahiro Yamada mov r2, #0 133*1cfe9fa0SMasahiro Yamada str r2, [r0] 134*1cfe9fa0SMasahiro Yamada str r2, [r1] 135*1cfe9fa0SMasahiro Yamada mov pc, lr 136*1cfe9fa0SMasahiro YamadaENDPROC(debug_ll_addr) 137*1cfe9fa0SMasahiro Yamada 138*1cfe9fa0SMasahiro Yamada#endif 139