xref: /openbmc/linux/arch/arm/kernel/debug.S (revision 2c50a570e9dc649c182268e779dffe0712e98a6a)
1d2912cb1SThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-only */
21da177e4SLinus Torvalds/*
31da177e4SLinus Torvalds *  linux/arch/arm/kernel/debug.S
41da177e4SLinus Torvalds *
51da177e4SLinus Torvalds *  Copyright (C) 1994-1999 Russell King
61da177e4SLinus Torvalds *
71da177e4SLinus Torvalds *  32-bit debugging code
81da177e4SLinus Torvalds */
91da177e4SLinus Torvalds#include <linux/linkage.h>
106f6f6a70SRob Herring#include <asm/assembler.h>
111da177e4SLinus Torvalds
121da177e4SLinus Torvalds		.text
131da177e4SLinus Torvalds
141da177e4SLinus Torvalds/*
151da177e4SLinus Torvalds * Some debugging routines (useful if you've got MM problems and
161da177e4SLinus Torvalds * printk isn't working).  For DEBUGGING ONLY!!!  Do not leave
171da177e4SLinus Torvalds * references to these in a production kernel!
181da177e4SLinus Torvalds */
191da177e4SLinus Torvalds
2091a9fec0SRob Herring#if !defined(CONFIG_DEBUG_SEMIHOSTING)
2191a9fec0SRob Herring#include CONFIG_DEBUG_LL_INCLUDE
2291a9fec0SRob Herring#endif
231da177e4SLinus Torvalds
240ea12930SJeremy Kerr#ifdef CONFIG_MMU
250ea12930SJeremy Kerr		.macro	addruart_current, rx, tmp1, tmp2
26639da5eeSNicolas Pitre		addruart	\tmp1, \tmp2, \rx
270ea12930SJeremy Kerr		mrc		p15, 0, \rx, c1, c0
280ea12930SJeremy Kerr		tst		\rx, #1
290ea12930SJeremy Kerr		moveq		\rx, \tmp1
300ea12930SJeremy Kerr		movne		\rx, \tmp2
310ea12930SJeremy Kerr		.endm
320ea12930SJeremy Kerr
330ea12930SJeremy Kerr#else /* !CONFIG_MMU */
340ea12930SJeremy Kerr		.macro	addruart_current, rx, tmp1, tmp2
357505f042SStefan Agner		addruart	\rx, \tmp1, \tmp2
360ea12930SJeremy Kerr		.endm
370ea12930SJeremy Kerr
380ea12930SJeremy Kerr#endif /* CONFIG_MMU */
390ea12930SJeremy Kerr
401da177e4SLinus Torvalds/*
411da177e4SLinus Torvalds * Useful debugging routines
421da177e4SLinus Torvalds */
431da177e4SLinus TorvaldsENTRY(printhex8)
441da177e4SLinus Torvalds		mov	r1, #8
451da177e4SLinus Torvalds		b	printhex
4693ed3970SCatalin MarinasENDPROC(printhex8)
471da177e4SLinus Torvalds
481da177e4SLinus TorvaldsENTRY(printhex4)
491da177e4SLinus Torvalds		mov	r1, #4
501da177e4SLinus Torvalds		b	printhex
5193ed3970SCatalin MarinasENDPROC(printhex4)
521da177e4SLinus Torvalds
531da177e4SLinus TorvaldsENTRY(printhex2)
541da177e4SLinus Torvalds		mov	r1, #2
55e11d1314SNicolas Pitreprinthex:	adr	r2, hexbuf_rel
56e11d1314SNicolas Pitre		ldr	r3, [r2]
57e11d1314SNicolas Pitre		add	r2, r2, r3
581da177e4SLinus Torvalds		add	r3, r2, r1
591da177e4SLinus Torvalds		mov	r1, #0
601da177e4SLinus Torvalds		strb	r1, [r3]
611da177e4SLinus Torvalds1:		and	r1, r0, #15
621da177e4SLinus Torvalds		mov	r0, r0, lsr #4
631da177e4SLinus Torvalds		cmp	r1, #10
641da177e4SLinus Torvalds		addlt	r1, r1, #'0'
651da177e4SLinus Torvalds		addge	r1, r1, #'a' - 10
661da177e4SLinus Torvalds		strb	r1, [r3, #-1]!
671da177e4SLinus Torvalds		teq	r3, r2
681da177e4SLinus Torvalds		bne	1b
691da177e4SLinus Torvalds		mov	r0, r2
701da177e4SLinus Torvalds		b	printascii
7193ed3970SCatalin MarinasENDPROC(printhex2)
721da177e4SLinus Torvalds
73e11d1314SNicolas Pitre		.pushsection .bss
74e11d1314SNicolas Pitrehexbuf_addr:	.space 16
75e11d1314SNicolas Pitre		.popsection
76e11d1314SNicolas Pitre		.align
77e11d1314SNicolas Pitrehexbuf_rel:	.long	hexbuf_addr - .
78b55fa188SAfzal Mohammed
791da177e4SLinus Torvalds		.ltorg
801da177e4SLinus Torvalds
819b5a146aSNicolas Pitre#ifndef CONFIG_DEBUG_SEMIHOSTING
829b5a146aSNicolas Pitre
831da177e4SLinus TorvaldsENTRY(printascii)
840ea12930SJeremy Kerr		addruart_current r3, r1, r2
852a14b80cSNicolas Pitre1:		teq	r0, #0
86e44fc388SStefan Agner		ldrbne	r1, [r0], #1
871da177e4SLinus Torvalds		teqne	r1, #0
882a14b80cSNicolas Pitre		reteq	lr
892a14b80cSNicolas Pitre2:		teq     r1, #'\n'
902a14b80cSNicolas Pitre		bne	3f
912a14b80cSNicolas Pitre		mov	r1, #'\r'
92*2c50a570SLinus Walleij		waituartcts r2, r3
93*2c50a570SLinus Walleij		waituarttxrdy r2, r3
942a14b80cSNicolas Pitre		senduart r1, r3
952a14b80cSNicolas Pitre		busyuart r2, r3
962a14b80cSNicolas Pitre		mov	r1, #'\n'
97*2c50a570SLinus Walleij3:		waituartcts r2, r3
98*2c50a570SLinus Walleij		waituarttxrdy r2, r3
992a14b80cSNicolas Pitre		senduart r1, r3
1002a14b80cSNicolas Pitre		busyuart r2, r3
1012a14b80cSNicolas Pitre		b	1b
10293ed3970SCatalin MarinasENDPROC(printascii)
1031da177e4SLinus Torvalds
1041da177e4SLinus TorvaldsENTRY(printch)
1050ea12930SJeremy Kerr		addruart_current r3, r1, r2
1061da177e4SLinus Torvalds		mov	r1, r0
1071da177e4SLinus Torvalds		mov	r0, #0
1082a14b80cSNicolas Pitre		b	2b
10993ed3970SCatalin MarinasENDPROC(printch)
1109b5a146aSNicolas Pitre
111a73b59c5SUwe Kleine-König#ifdef CONFIG_MMU
112e5c5f2adSRob HerringENTRY(debug_ll_addr)
113e5c5f2adSRob Herring		addruart r2, r3, ip
114e5c5f2adSRob Herring		str	r2, [r0]
115e5c5f2adSRob Herring		str	r3, [r1]
1166ebbf2ceSRussell King		ret	lr
117e5c5f2adSRob HerringENDPROC(debug_ll_addr)
118a73b59c5SUwe Kleine-König#endif
119e5c5f2adSRob Herring
1209b5a146aSNicolas Pitre#else
1219b5a146aSNicolas Pitre
1229b5a146aSNicolas PitreENTRY(printascii)
1239b5a146aSNicolas Pitre		mov	r1, r0
1249b5a146aSNicolas Pitre		mov	r0, #0x04		@ SYS_WRITE0
1259b5a146aSNicolas Pitre	ARM(	svc	#0x123456	)
126ee3eaee6SNicolas Pitre#ifdef CONFIG_CPU_V7M
127ee3eaee6SNicolas Pitre	THUMB(	bkpt	#0xab		)
128ee3eaee6SNicolas Pitre#else
1299b5a146aSNicolas Pitre	THUMB(	svc	#0xab		)
130ee3eaee6SNicolas Pitre#endif
1316ebbf2ceSRussell King		ret	lr
1329b5a146aSNicolas PitreENDPROC(printascii)
1339b5a146aSNicolas Pitre
1349b5a146aSNicolas PitreENTRY(printch)
135e11d1314SNicolas Pitre		adr	r1, hexbuf_rel
136e11d1314SNicolas Pitre		ldr	r2, [r1]
137e11d1314SNicolas Pitre		add	r1, r1, r2
1389b5a146aSNicolas Pitre		strb	r0, [r1]
1399b5a146aSNicolas Pitre		mov	r0, #0x03		@ SYS_WRITEC
1409b5a146aSNicolas Pitre	ARM(	svc	#0x123456	)
141ee3eaee6SNicolas Pitre#ifdef CONFIG_CPU_V7M
142ee3eaee6SNicolas Pitre	THUMB(	bkpt	#0xab		)
143ee3eaee6SNicolas Pitre#else
1449b5a146aSNicolas Pitre	THUMB(	svc	#0xab		)
145ee3eaee6SNicolas Pitre#endif
1466ebbf2ceSRussell King		ret	lr
1479b5a146aSNicolas PitreENDPROC(printch)
1489b5a146aSNicolas Pitre
149e5c5f2adSRob HerringENTRY(debug_ll_addr)
150e5c5f2adSRob Herring		mov	r2, #0
151e5c5f2adSRob Herring		str	r2, [r0]
152e5c5f2adSRob Herring		str	r2, [r1]
1536ebbf2ceSRussell King		ret	lr
154e5c5f2adSRob HerringENDPROC(debug_ll_addr)
155e5c5f2adSRob Herring
1569b5a146aSNicolas Pitre#endif
157