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