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