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