xref: /linux-6.15/arch/arm/kernel/debug.S (revision 1ea64615)
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
14		.text
15
16/*
17 * Some debugging routines (useful if you've got MM problems and
18 * printk isn't working).  For DEBUGGING ONLY!!!  Do not leave
19 * references to these in a production kernel!
20 */
21
22#if defined(CONFIG_DEBUG_ICEDCC)
23		@@ debug using ARM EmbeddedICE DCC channel
24
25		.macro	addruart, rx, tmp
26		.endm
27
28#if defined(CONFIG_CPU_V6)
29
30		.macro	senduart, rd, rx
31		mcr	p14, 0, \rd, c0, c5, 0
32		.endm
33
34		.macro	busyuart, rd, rx
351001:
36		mrc	p14, 0, \rx, c0, c1, 0
37		tst	\rx, #0x20000000
38		beq	1001b
39		.endm
40
41		.macro	waituart, rd, rx
42		mov	\rd, #0x2000000
431001:
44		subs	\rd, \rd, #1
45		bmi	1002f
46		mrc	p14, 0, \rx, c0, c1, 0
47		tst	\rx, #0x20000000
48		bne	1001b
491002:
50		.endm
51
52#elif defined(CONFIG_CPU_V7)
53
54		.macro	senduart, rd, rx
55		mcr	p14, 0, \rd, c0, c5, 0
56		.endm
57
58		.macro	busyuart, rd, rx
59busy:		mrc	p14, 0, pc, c0, c1, 0
60		bcs	busy
61		.endm
62
63		.macro	waituart, rd, rx
64wait:		mrc	p14, 0, pc, c0, c1, 0
65		bcs	wait
66
67		.endm
68
69#elif defined(CONFIG_CPU_XSCALE)
70
71		.macro	senduart, rd, rx
72		mcr	p14, 0, \rd, c8, c0, 0
73		.endm
74
75		.macro	busyuart, rd, rx
761001:
77		mrc	p14, 0, \rx, c14, c0, 0
78		tst	\rx, #0x10000000
79		beq	1001b
80		.endm
81
82		.macro	waituart, rd, rx
83		mov	\rd, #0x10000000
841001:
85		subs	\rd, \rd, #1
86		bmi	1002f
87		mrc	p14, 0, \rx, c14, c0, 0
88		tst	\rx, #0x10000000
89		bne	1001b
901002:
91		.endm
92
93#else
94
95		.macro	senduart, rd, rx
96		mcr	p14, 0, \rd, c1, c0, 0
97		.endm
98
99		.macro	busyuart, rd, rx
1001001:
101		mrc	p14, 0, \rx, c0, c0, 0
102		tst	\rx, #2
103		beq	1001b
104
105		.endm
106
107		.macro	waituart, rd, rx
108		mov	\rd, #0x2000000
1091001:
110		subs	\rd, \rd, #1
111		bmi	1002f
112		mrc	p14, 0, \rx, c0, c0, 0
113		tst	\rx, #2
114		bne	1001b
1151002:
116		.endm
117
118#endif	/* CONFIG_CPU_V6 */
119
120#else
121#include <mach/debug-macro.S>
122#endif	/* CONFIG_DEBUG_ICEDCC */
123
124/*
125 * Useful debugging routines
126 */
127ENTRY(printhex8)
128		mov	r1, #8
129		b	printhex
130ENDPROC(printhex8)
131
132ENTRY(printhex4)
133		mov	r1, #4
134		b	printhex
135ENDPROC(printhex4)
136
137ENTRY(printhex2)
138		mov	r1, #2
139printhex:	adr	r2, hexbuf
140		add	r3, r2, r1
141		mov	r1, #0
142		strb	r1, [r3]
1431:		and	r1, r0, #15
144		mov	r0, r0, lsr #4
145		cmp	r1, #10
146		addlt	r1, r1, #'0'
147		addge	r1, r1, #'a' - 10
148		strb	r1, [r3, #-1]!
149		teq	r3, r2
150		bne	1b
151		mov	r0, r2
152		b	printascii
153ENDPROC(printhex2)
154
155		.ltorg
156
157ENTRY(printascii)
158		addruart r3, r1
159		b	2f
1601:		waituart r2, r3
161		senduart r1, r3
162		busyuart r2, r3
163		teq	r1, #'\n'
164		moveq	r1, #'\r'
165		beq	1b
1662:		teq	r0, #0
167		ldrneb	r1, [r0], #1
168		teqne	r1, #0
169		bne	1b
170		mov	pc, lr
171ENDPROC(printascii)
172
173ENTRY(printch)
174		addruart r3, r1
175		mov	r1, r0
176		mov	r0, #0
177		b	1b
178ENDPROC(printch)
179
180hexbuf:		.space 16
181