Remove all non-configurable dead loops

Added a new platform porting function plat_panic_handler, to allow
platforms to handle unexpected error situations. It must be
implemented in assembly as it may be called before the C environment
is initialized. A default implementation is provided, which simply
spins.

Corrected all dead loops in generic code to call this function
instead. This includes the dead loop that occurs at the end of the
call to panic().

All unnecesary wfis from bl32/tsp/aarch64/tsp_exceptions.S have
been removed.

Change-Id: I67cb85f6112fa8e77bd62f5718efcef4173d8134
This commit is contained in:
Antonio Nino Diaz 2016-02-01 13:57:25 +00:00
parent 195d29f399
commit 1c3ea103d2
12 changed files with 92 additions and 59 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2013-2016, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
@ -43,8 +43,8 @@ func bl2_entrypoint
* available to BL2 for future use. * available to BL2 for future use.
* x0 is not currently used. * x0 is not currently used.
* --------------------------------------------- * ---------------------------------------------
*/ */
mov x20, x1 mov x20, x1
/* --------------------------------------------- /* ---------------------------------------------
* Set the exception vector to something sane. * Set the exception vector to something sane.
@ -126,6 +126,11 @@ func bl2_entrypoint
* --------------------------------------------- * ---------------------------------------------
*/ */
bl bl2_main bl bl2_main
_panic:
b _panic /* ---------------------------------------------
* Should never reach this point.
* ---------------------------------------------
*/
bl plat_panic_handler
endfunc bl2_entrypoint endfunc bl2_entrypoint

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2015, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2015-2016, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
@ -122,6 +122,10 @@ func bl2u_entrypoint
*/ */
bl bl2u_main bl bl2u_main
_panic: /* ---------------------------------------------
b _panic * Should never reach this point.
* ---------------------------------------------
*/
bl plat_panic_handler
endfunc bl2u_entrypoint endfunc bl2u_entrypoint

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2014, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2014-2016, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
@ -351,17 +351,17 @@ func do_crash_reporting
plat_print_interconnect_regs plat_print_interconnect_regs
/* Done reporting */ /* Done reporting */
b crash_panic bl plat_panic_handler
endfunc do_crash_reporting endfunc do_crash_reporting
#else /* CRASH_REPORTING */ #else /* CRASH_REPORTING */
func report_unhandled_exception func report_unhandled_exception
report_unhandled_interrupt: report_unhandled_interrupt:
b crash_panic bl plat_panic_handler
endfunc report_unhandled_exception endfunc report_unhandled_exception
#endif /* CRASH_REPORTING */ #endif /* CRASH_REPORTING */
func crash_panic func crash_panic
b crash_panic bl plat_panic_handler
endfunc crash_panic endfunc crash_panic

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2013-2016, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
@ -391,7 +391,7 @@ tsp_sel1_intr_return:
/* Should never reach here */ /* Should never reach here */
tsp_sel1_int_entry_panic: tsp_sel1_int_entry_panic:
b tsp_sel1_int_entry_panic bl plat_panic_handler
endfunc tsp_sel1_intr_entry endfunc tsp_sel1_intr_entry
/*--------------------------------------------- /*---------------------------------------------
@ -407,8 +407,9 @@ endfunc tsp_sel1_intr_entry
func tsp_cpu_resume_entry func tsp_cpu_resume_entry
bl tsp_cpu_resume_main bl tsp_cpu_resume_main
restore_args_call_smc restore_args_call_smc
tsp_cpu_resume_panic:
b tsp_cpu_resume_panic /* Should never reach here */
bl plat_panic_handler
endfunc tsp_cpu_resume_entry endfunc tsp_cpu_resume_entry
/*--------------------------------------------- /*---------------------------------------------
@ -419,8 +420,9 @@ endfunc tsp_cpu_resume_entry
func tsp_fast_smc_entry func tsp_fast_smc_entry
bl tsp_smc_handler bl tsp_smc_handler
restore_args_call_smc restore_args_call_smc
tsp_fast_smc_entry_panic:
b tsp_fast_smc_entry_panic /* Should never reach here */
bl plat_panic_handler
endfunc tsp_fast_smc_entry endfunc tsp_fast_smc_entry
/*--------------------------------------------- /*---------------------------------------------
@ -435,6 +437,7 @@ func tsp_std_smc_entry
bl tsp_smc_handler bl tsp_smc_handler
msr daifset, #DAIF_FIQ_BIT | DAIF_IRQ_BIT msr daifset, #DAIF_FIQ_BIT | DAIF_IRQ_BIT
restore_args_call_smc restore_args_call_smc
tsp_std_smc_entry_panic:
b tsp_std_smc_entry_panic /* Should never reach here */
bl plat_panic_handler
endfunc tsp_std_smc_entry endfunc tsp_std_smc_entry

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2013-2016, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
@ -108,24 +108,23 @@ tsp_exceptions:
* ----------------------------------------------------- * -----------------------------------------------------
*/ */
sync_exception_sp_el0: sync_exception_sp_el0:
wfi bl plat_panic_handler
b sync_exception_sp_el0
check_vector_size sync_exception_sp_el0 check_vector_size sync_exception_sp_el0
.align 7 .align 7
irq_sp_el0: irq_sp_el0:
b irq_sp_el0 bl plat_panic_handler
check_vector_size irq_sp_el0 check_vector_size irq_sp_el0
.align 7 .align 7
fiq_sp_el0: fiq_sp_el0:
b fiq_sp_el0 bl plat_panic_handler
check_vector_size fiq_sp_el0 check_vector_size fiq_sp_el0
.align 7 .align 7
serror_sp_el0: serror_sp_el0:
b serror_sp_el0 bl plat_panic_handler
check_vector_size serror_sp_el0 check_vector_size serror_sp_el0
@ -136,8 +135,7 @@ serror_sp_el0:
*/ */
.align 7 .align 7
sync_exception_sp_elx: sync_exception_sp_elx:
wfi bl plat_panic_handler
b sync_exception_sp_elx
check_vector_size sync_exception_sp_elx check_vector_size sync_exception_sp_elx
.align 7 .align 7
@ -152,7 +150,7 @@ fiq_sp_elx:
.align 7 .align 7
serror_sp_elx: serror_sp_elx:
b serror_sp_elx bl plat_panic_handler
check_vector_size serror_sp_elx check_vector_size serror_sp_elx
@ -163,23 +161,22 @@ serror_sp_elx:
*/ */
.align 7 .align 7
sync_exception_aarch64: sync_exception_aarch64:
wfi bl plat_panic_handler
b sync_exception_aarch64
check_vector_size sync_exception_aarch64 check_vector_size sync_exception_aarch64
.align 7 .align 7
irq_aarch64: irq_aarch64:
b irq_aarch64 bl plat_panic_handler
check_vector_size irq_aarch64 check_vector_size irq_aarch64
.align 7 .align 7
fiq_aarch64: fiq_aarch64:
b fiq_aarch64 bl plat_panic_handler
check_vector_size fiq_aarch64 check_vector_size fiq_aarch64
.align 7 .align 7
serror_aarch64: serror_aarch64:
b serror_aarch64 bl plat_panic_handler
check_vector_size serror_aarch64 check_vector_size serror_aarch64
@ -190,22 +187,21 @@ serror_aarch64:
*/ */
.align 7 .align 7
sync_exception_aarch32: sync_exception_aarch32:
wfi bl plat_panic_handler
b sync_exception_aarch32
check_vector_size sync_exception_aarch32 check_vector_size sync_exception_aarch32
.align 7 .align 7
irq_aarch32: irq_aarch32:
b irq_aarch32 bl plat_panic_handler
check_vector_size irq_aarch32 check_vector_size irq_aarch32
.align 7 .align 7
fiq_aarch32: fiq_aarch32:
b fiq_aarch32 bl plat_panic_handler
check_vector_size fiq_aarch32 check_vector_size fiq_aarch32
.align 7 .align 7
serror_aarch32: serror_aarch32:
b serror_aarch32 bl plat_panic_handler
check_vector_size serror_aarch32 check_vector_size serror_aarch32
.align 7 .align 7

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2014, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2014-2016, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
@ -120,7 +120,7 @@ endfunc asm_print_str
/* /*
* This function prints a hexadecimal number in x4. * This function prints a hexadecimal number in x4.
* In: x4 = the hexadecimal to print. * In: x4 = the hexadecimal to print.
* Clobber: x30, x0, x5, x1, x2, x3 * Clobber: x30, x0 - x3, x5
*/ */
func asm_print_hex func asm_print_hex
mov x3, x30 mov x3, x30
@ -178,7 +178,7 @@ el3_panic:
mov x6, x30 mov x6, x30
bl plat_crash_console_init bl plat_crash_console_init
/* Check if the console is initialized */ /* Check if the console is initialized */
cbz x0, _panic_loop cbz x0, _panic_handler
/* The console is initialized */ /* The console is initialized */
adr x4, panic_msg adr x4, panic_msg
bl asm_print_str bl asm_print_str
@ -186,7 +186,10 @@ el3_panic:
/* The panic location is lr -4 */ /* The panic location is lr -4 */
sub x4, x4, #4 sub x4, x4, #4
bl asm_print_hex bl asm_print_hex
_panic_loop:
b _panic_loop
endfunc do_panic
_panic_handler:
/* Pass to plat_panic_handler the address from where el3_panic was
* called, not the address of the call from el3_panic. */
mov x30,x6
b plat_panic_handler
endfunc do_panic

View File

@ -783,6 +783,20 @@ Possible errors reported by the generic code are:
The default implementation simply spins. The default implementation simply spins.
### Function : plat_panic_handler()
Argument : void
Return : void
This API is called when the generic code encounters an unexpected error
situation from which it cannot recover. This function must not return,
and must be implemented in assembly because it may be called before the C
environment is initialized.
Note: The address from where it was called is stored in x30 (Link Register).
The default implementation simply spins.
3. Modifications specific to a Boot Loader stage 3. Modifications specific to a Boot Loader stage
------------------------------------------------- -------------------------------------------------

View File

@ -196,8 +196,7 @@
/* This is a cold boot on a secondary CPU */ /* This is a cold boot on a secondary CPU */
bl plat_secondary_cold_boot_setup bl plat_secondary_cold_boot_setup
/* plat_secondary_cold_boot_setup() is not supposed to return */ /* plat_secondary_cold_boot_setup() is not supposed to return */
secondary_panic: bl el3_panic
b secondary_panic
do_primary_cold_boot: do_primary_cold_boot:
.endif /* _secondary_cold_boot */ .endif /* _secondary_cold_boot */

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2013-2016, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
@ -83,6 +83,7 @@ void plat_report_exception(unsigned long);
int plat_crash_console_init(void); int plat_crash_console_init(void);
int plat_crash_console_putc(int c); int plat_crash_console_putc(int c);
void plat_error_handler(int err) __dead2; void plat_error_handler(int err) __dead2;
void plat_panic_handler(void) __dead2;
/******************************************************************************* /*******************************************************************************
* Mandatory BL1 functions * Mandatory BL1 functions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2013-2016, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
@ -111,8 +111,7 @@ secondary_cold_boot_wait:
*/ */
dsb sy dsb sy
wfi wfi
cb_panic: bl plat_panic_handler
b cb_panic
#else #else
mov_imm x0, PLAT_ARM_TRUSTED_MAILBOX_BASE mov_imm x0, PLAT_ARM_TRUSTED_MAILBOX_BASE
@ -174,7 +173,7 @@ warm_reset:
*/ */
mov_imm x0, PLAT_ARM_TRUSTED_MAILBOX_BASE mov_imm x0, PLAT_ARM_TRUSTED_MAILBOX_BASE
ldr x0, [x0] ldr x0, [x0]
cbz x0, _panic cbz x0, _panic_handler
ret ret
/* --------------------------------------------------------------------- /* ---------------------------------------------------------------------
@ -182,8 +181,8 @@ warm_reset:
* is empty. This should never happen! * is empty. This should never happen!
* --------------------------------------------------------------------- * ---------------------------------------------------------------------
*/ */
_panic: _panic_handler:
b _panic bl plat_panic_handler
endfunc plat_get_my_entrypoint endfunc plat_get_my_entrypoint
/* ----------------------------------------------------- /* -----------------------------------------------------

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2013-2016, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
@ -201,8 +201,7 @@ func plat_reset_handler
JUMP_TO_HANDLER_IF_JUNO_R(2) JUMP_TO_HANDLER_IF_JUNO_R(2)
/* Board revision is not supported */ /* Board revision is not supported */
not_supported: bl plat_panic_handler
b not_supported
endfunc plat_reset_handler endfunc plat_reset_handler

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2013-2016, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
@ -39,6 +39,7 @@
.weak plat_disable_acp .weak plat_disable_acp
.weak bl1_plat_prepare_exit .weak bl1_plat_prepare_exit
.weak plat_error_handler .weak plat_error_handler
.weak plat_panic_handler
#if !ENABLE_PLAT_COMPAT #if !ENABLE_PLAT_COMPAT
.globl platform_get_core_pos .globl platform_get_core_pos
@ -131,3 +132,12 @@ endfunc bl1_plat_prepare_exit
func plat_error_handler func plat_error_handler
b plat_error_handler b plat_error_handler
endfunc plat_error_handler endfunc plat_error_handler
/* -----------------------------------------------------
* void plat_panic_handler(void) __dead2;
* Endless loop by default.
* -----------------------------------------------------
*/
func plat_panic_handler
b plat_panic_handler
endfunc plat_panic_handler