xref: /rk3399_ARM-atf/common/aarch32/debug.S (revision 4d91838b8d01a9e99c44fd0ed72f5d81b4595f17)
1f24307deSSoby Mathew/*
2801cf93cSAntonio Nino Diaz * Copyright (c) 2016-2017, ARM Limited and Contributors. All rights reserved.
3f24307deSSoby Mathew *
482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause
5f24307deSSoby Mathew */
6f24307deSSoby Mathew
7f24307deSSoby Mathew#include <arch.h>
8f24307deSSoby Mathew#include <asm_macros.S>
9f24307deSSoby Mathew
10e12cb61fSJeenu Viswambharan	.globl	asm_assert
11f24307deSSoby Mathew	.globl	do_panic
121a0a3f06SYatharth Kochar	.globl	report_exception
13f24307deSSoby Mathew
14e12cb61fSJeenu Viswambharan/* Since the max decimal input number is 65536 */
15e12cb61fSJeenu Viswambharan#define MAX_DEC_DIVISOR		10000
16e12cb61fSJeenu Viswambharan
17e12cb61fSJeenu Viswambharan/* The offset to add to get ascii for numerals '0 - 9' */
18e12cb61fSJeenu Viswambharan#define ASCII_OFFSET_NUM	'0'
19e12cb61fSJeenu Viswambharan
20e12cb61fSJeenu Viswambharan	.section .rodata.panic_str, "aS"
21e12cb61fSJeenu Viswambharanpanic_msg:
22e12cb61fSJeenu Viswambharan	.asciz "PANIC at PC : 0x"
23e12cb61fSJeenu Viswambharanpanic_end:
24e12cb61fSJeenu Viswambharan	.asciz "\r\n"
25e12cb61fSJeenu Viswambharan
26f24307deSSoby Mathew	/***********************************************************
27f24307deSSoby Mathew	 * The common implementation of do_panic for all BL stages
28f24307deSSoby Mathew	 ***********************************************************/
29f24307deSSoby Mathewfunc do_panic
30e12cb61fSJeenu Viswambharan	/* Have LR copy point to PC at the time of panic */
31e12cb61fSJeenu Viswambharan	sub	r6, lr, #4
32e12cb61fSJeenu Viswambharan
33e12cb61fSJeenu Viswambharan	/* Initialize crash console and verify success */
34e12cb61fSJeenu Viswambharan	bl	plat_crash_console_init
35e12cb61fSJeenu Viswambharan	cmp	r0, #0
36e12cb61fSJeenu Viswambharan	beq	1f
37e12cb61fSJeenu Viswambharan
38e12cb61fSJeenu Viswambharan	/* Print panic message */
39e12cb61fSJeenu Viswambharan	ldr	r4, =panic_msg
40e12cb61fSJeenu Viswambharan	bl	asm_print_str
41e12cb61fSJeenu Viswambharan
42e12cb61fSJeenu Viswambharan	/* Print LR in hex */
43e12cb61fSJeenu Viswambharan	mov	r4, r6
44e12cb61fSJeenu Viswambharan	bl	asm_print_hex
45e12cb61fSJeenu Viswambharan
46e12cb61fSJeenu Viswambharan	/* Print new line */
47e12cb61fSJeenu Viswambharan	ldr	r4, =panic_end
48e12cb61fSJeenu Viswambharan	bl	asm_print_str
49801cf93cSAntonio Nino Diaz
50801cf93cSAntonio Nino Diaz	bl	plat_crash_console_flush
51801cf93cSAntonio Nino Diaz
52e12cb61fSJeenu Viswambharan1:
53e12cb61fSJeenu Viswambharan	mov	lr, r6
54*4d91838bSJulius Werner	b	plat_panic_handler
55f24307deSSoby Mathewendfunc do_panic
56f24307deSSoby Mathew
571a0a3f06SYatharth Kochar	/***********************************************************
581a0a3f06SYatharth Kochar	 * This function is called from the vector table for
591a0a3f06SYatharth Kochar	 * unhandled exceptions. It reads the current mode and
601a0a3f06SYatharth Kochar	 * passes it to platform.
611a0a3f06SYatharth Kochar	 ***********************************************************/
621a0a3f06SYatharth Kocharfunc report_exception
631a0a3f06SYatharth Kochar	mrs	r0, cpsr
641a0a3f06SYatharth Kochar	and	r0, #MODE32_MASK
651a0a3f06SYatharth Kochar	bl	plat_report_exception
66a806dad5SJeenu Viswambharan	no_ret	plat_panic_handler
671a0a3f06SYatharth Kocharendfunc report_exception
68e12cb61fSJeenu Viswambharan
69044bb2faSAntonio Nino Diaz#if ENABLE_ASSERTIONS
70e12cb61fSJeenu Viswambharan.section .rodata.assert_str, "aS"
71e12cb61fSJeenu Viswambharanassert_msg1:
72e12cb61fSJeenu Viswambharan	.asciz "ASSERT: File "
73e12cb61fSJeenu Viswambharanassert_msg2:
74e12cb61fSJeenu Viswambharan	.asciz " Line "
75e12cb61fSJeenu Viswambharan
76e12cb61fSJeenu Viswambharan/* ---------------------------------------------------------------------------
77e12cb61fSJeenu Viswambharan * Assertion support in assembly.
78e12cb61fSJeenu Viswambharan * The below function helps to support assertions in assembly where we do not
79e12cb61fSJeenu Viswambharan * have a C runtime stack. Arguments to the function are :
80e12cb61fSJeenu Viswambharan * r0 - File name
81e12cb61fSJeenu Viswambharan * r1 - Line no
82e12cb61fSJeenu Viswambharan * Clobber list : lr, r0 - r6
83e12cb61fSJeenu Viswambharan * ---------------------------------------------------------------------------
84e12cb61fSJeenu Viswambharan */
85e12cb61fSJeenu Viswambharanfunc asm_assert
86cc8b5632SAntonio Nino Diaz#if LOG_LEVEL >= LOG_LEVEL_INFO
87cc8b5632SAntonio Nino Diaz	/*
88cc8b5632SAntonio Nino Diaz	 * Only print the output if LOG_LEVEL is higher or equal to
89cc8b5632SAntonio Nino Diaz	 * LOG_LEVEL_INFO, which is the default value for builds with DEBUG=1.
90cc8b5632SAntonio Nino Diaz	 */
91e12cb61fSJeenu Viswambharan	/* Stash the parameters already in r0 and r1 */
92e12cb61fSJeenu Viswambharan	mov	r5, r0
93e12cb61fSJeenu Viswambharan	mov	r6, r1
94e12cb61fSJeenu Viswambharan
95e12cb61fSJeenu Viswambharan	/* Initialize crash console and verify success */
96e12cb61fSJeenu Viswambharan	bl	plat_crash_console_init
97e12cb61fSJeenu Viswambharan	cmp	r0, #0
98e12cb61fSJeenu Viswambharan	beq	1f
99e12cb61fSJeenu Viswambharan
100e12cb61fSJeenu Viswambharan	/* Print file name */
101e12cb61fSJeenu Viswambharan	ldr	r4, =assert_msg1
102e12cb61fSJeenu Viswambharan	bl	asm_print_str
103e12cb61fSJeenu Viswambharan	mov	r4, r5
104e12cb61fSJeenu Viswambharan	bl	asm_print_str
105e12cb61fSJeenu Viswambharan
106e12cb61fSJeenu Viswambharan	/* Print line number string */
107e12cb61fSJeenu Viswambharan	ldr	r4, =assert_msg2
108e12cb61fSJeenu Viswambharan	bl	asm_print_str
109e12cb61fSJeenu Viswambharan
110e12cb61fSJeenu Viswambharan	/* Test for maximum supported line number */
111e12cb61fSJeenu Viswambharan	ldr	r4, =~0xffff
112e12cb61fSJeenu Viswambharan	tst	r6, r4
113e12cb61fSJeenu Viswambharan	bne	1f
114e12cb61fSJeenu Viswambharan	mov	r4, r6
115e12cb61fSJeenu Viswambharan
116e12cb61fSJeenu Viswambharan	/* Print line number in decimal */
117e12cb61fSJeenu Viswambharan	mov	r6, #10			/* Divide by 10 after every loop iteration */
118e12cb61fSJeenu Viswambharan	ldr	r5, =MAX_DEC_DIVISOR
119e12cb61fSJeenu Viswambharandec_print_loop:
120e12cb61fSJeenu Viswambharan	udiv	r0, r4, r5			/* Quotient */
121e12cb61fSJeenu Viswambharan	mls	r4, r0, r5, r4			/* Remainder */
122e12cb61fSJeenu Viswambharan	add	r0, r0, #ASCII_OFFSET_NUM	/* Convert to ASCII */
123e12cb61fSJeenu Viswambharan	bl	plat_crash_console_putc
124e12cb61fSJeenu Viswambharan	udiv	r5, r5, r6			/* Reduce divisor */
125e12cb61fSJeenu Viswambharan	cmp	r5, #0
126e12cb61fSJeenu Viswambharan	bne	dec_print_loop
127801cf93cSAntonio Nino Diaz
128801cf93cSAntonio Nino Diaz	bl	plat_crash_console_flush
129801cf93cSAntonio Nino Diaz
130e12cb61fSJeenu Viswambharan1:
131cc8b5632SAntonio Nino Diaz#endif /* LOG_LEVEL >= LOG_LEVEL_INFO */
132e12cb61fSJeenu Viswambharan	no_ret	plat_panic_handler
133e12cb61fSJeenu Viswambharanendfunc asm_assert
134044bb2faSAntonio Nino Diaz#endif /* ENABLE_ASSERTIONS */
135e12cb61fSJeenu Viswambharan
136e12cb61fSJeenu Viswambharan/*
137e12cb61fSJeenu Viswambharan * This function prints a string from address in r4
138e12cb61fSJeenu Viswambharan * Clobber: lr, r0 - r4
139e12cb61fSJeenu Viswambharan */
140e12cb61fSJeenu Viswambharanfunc asm_print_str
141e12cb61fSJeenu Viswambharan	mov	r3, lr
142e12cb61fSJeenu Viswambharan1:
143e12cb61fSJeenu Viswambharan	ldrb	r0, [r4], #0x1
144e12cb61fSJeenu Viswambharan	cmp	r0, #0
145e12cb61fSJeenu Viswambharan	beq	2f
146e12cb61fSJeenu Viswambharan	bl	plat_crash_console_putc
147e12cb61fSJeenu Viswambharan	b	1b
148e12cb61fSJeenu Viswambharan2:
149e12cb61fSJeenu Viswambharan	bx	r3
150e12cb61fSJeenu Viswambharanendfunc asm_print_str
151e12cb61fSJeenu Viswambharan
152e12cb61fSJeenu Viswambharan/*
153e12cb61fSJeenu Viswambharan * This function prints a hexadecimal number in r4.
154e12cb61fSJeenu Viswambharan * In: r4 = the hexadecimal to print.
155e12cb61fSJeenu Viswambharan * Clobber: lr, r0 - r3, r5
156e12cb61fSJeenu Viswambharan */
157e12cb61fSJeenu Viswambharanfunc asm_print_hex
158e12cb61fSJeenu Viswambharan	mov	r3, lr
159e12cb61fSJeenu Viswambharan	mov	r5, #32  /* No of bits to convert to ascii */
160e12cb61fSJeenu Viswambharan1:
161e12cb61fSJeenu Viswambharan	sub	r5, r5, #4
162e12cb61fSJeenu Viswambharan	lsr	r0, r4, r5
163e12cb61fSJeenu Viswambharan	and	r0, r0, #0xf
164e12cb61fSJeenu Viswambharan	cmp	r0, #0xa
165e12cb61fSJeenu Viswambharan	blo	2f
166e12cb61fSJeenu Viswambharan	/* Add by 0x27 in addition to ASCII_OFFSET_NUM
167e12cb61fSJeenu Viswambharan	 * to get ascii for characters 'a - f'.
168e12cb61fSJeenu Viswambharan	 */
169e12cb61fSJeenu Viswambharan	add	r0, r0, #0x27
170e12cb61fSJeenu Viswambharan2:
171e12cb61fSJeenu Viswambharan	add	r0, r0, #ASCII_OFFSET_NUM
172e12cb61fSJeenu Viswambharan	bl	plat_crash_console_putc
173e12cb61fSJeenu Viswambharan	cmp	r5, #0
174e12cb61fSJeenu Viswambharan	bne	1b
175e12cb61fSJeenu Viswambharan	bx	r3
176e12cb61fSJeenu Viswambharanendfunc asm_print_hex
177