summaryrefslogtreecommitdiff
path: root/bl31
diff options
context:
space:
mode:
authorJeenu Viswambharan <jeenu.viswambharan@arm.com>2016-11-30 15:21:11 +0000
committerJeenu Viswambharan <jeenu.viswambharan@arm.com>2016-12-05 14:55:35 +0000
commita806dad58c4cf752238d7bbffbc9a1ce17f63cea (patch)
tree9981b72bc40a9169972103ca315549d8a35bb052 /bl31
parentc59428b1502f37c9b2f551613da1b491c4226d10 (diff)
Define and use no_ret macro where no return is expected
There are many instances in ARM Trusted Firmware where control is transferred to functions from which return isn't expected. Such jumps are made using 'bl' instruction to provide the callee with the location from which it was jumped to. Additionally, debuggers infer the caller by examining where 'lr' register points to. If a 'bl' of the nature described above falls at the end of an assembly function, 'lr' will be left pointing to a location outside of the function range. This misleads the debugger back trace. This patch defines a 'no_ret' macro to be used when jumping to functions from which return isn't expected. The macro ensures to use 'bl' instruction for the jump, and also, for debug builds, places a 'nop' instruction immediately thereafter (unless instructed otherwise) so as to leave 'lr' pointing within the function range. Change-Id: Ib34c69fc09197cfd57bc06e147cc8252910e01b0 Co-authored-by: Douglas Raillard <douglas.raillard@arm.com> Signed-off-by: Jeenu Viswambharan <jeenu.viswambharan@arm.com>
Diffstat (limited to 'bl31')
-rw-r--r--bl31/aarch64/crash_reporting.S6
-rw-r--r--bl31/aarch64/runtime_exceptions.S24
2 files changed, 15 insertions, 15 deletions
diff --git a/bl31/aarch64/crash_reporting.S b/bl31/aarch64/crash_reporting.S
index 7f5a86b0..8e603862 100644
--- a/bl31/aarch64/crash_reporting.S
+++ b/bl31/aarch64/crash_reporting.S
@@ -350,17 +350,17 @@ func do_crash_reporting
plat_crash_print_regs
/* Done reporting */
- bl plat_panic_handler
+ no_ret plat_panic_handler
endfunc do_crash_reporting
#else /* CRASH_REPORTING */
func report_unhandled_exception
report_unhandled_interrupt:
- bl plat_panic_handler
+ no_ret plat_panic_handler
endfunc report_unhandled_exception
#endif /* CRASH_REPORTING */
func crash_panic
- bl plat_panic_handler
+ no_ret plat_panic_handler
endfunc crash_panic
diff --git a/bl31/aarch64/runtime_exceptions.S b/bl31/aarch64/runtime_exceptions.S
index 220d1cc1..6909d08c 100644
--- a/bl31/aarch64/runtime_exceptions.S
+++ b/bl31/aarch64/runtime_exceptions.S
@@ -73,7 +73,7 @@
b.eq smc_handler64
/* Other kinds of synchronous exceptions are not handled */
- bl report_unhandled_exception
+ no_ret report_unhandled_exception
.endm
@@ -176,7 +176,7 @@ vector_base runtime_exceptions
*/
vector_entry sync_exception_sp_el0
/* We don't expect any synchronous exceptions from EL3 */
- bl report_unhandled_exception
+ no_ret report_unhandled_exception
check_vector_size sync_exception_sp_el0
vector_entry irq_sp_el0
@@ -184,17 +184,17 @@ vector_entry irq_sp_el0
* EL3 code is non-reentrant. Any asynchronous exception is a serious
* error. Loop infinitely.
*/
- bl report_unhandled_interrupt
+ no_ret report_unhandled_interrupt
check_vector_size irq_sp_el0
vector_entry fiq_sp_el0
- bl report_unhandled_interrupt
+ no_ret report_unhandled_interrupt
check_vector_size fiq_sp_el0
vector_entry serror_sp_el0
- bl report_unhandled_exception
+ no_ret report_unhandled_exception
check_vector_size serror_sp_el0
/* ---------------------------------------------------------------------
@@ -208,19 +208,19 @@ vector_entry sync_exception_sp_elx
* synchronous exception. There is a high probability that SP_EL3 is
* corrupted.
*/
- bl report_unhandled_exception
+ no_ret report_unhandled_exception
check_vector_size sync_exception_sp_elx
vector_entry irq_sp_elx
- bl report_unhandled_interrupt
+ no_ret report_unhandled_interrupt
check_vector_size irq_sp_elx
vector_entry fiq_sp_elx
- bl report_unhandled_interrupt
+ no_ret report_unhandled_interrupt
check_vector_size fiq_sp_elx
vector_entry serror_sp_elx
- bl report_unhandled_exception
+ no_ret report_unhandled_exception
check_vector_size serror_sp_elx
/* ---------------------------------------------------------------------
@@ -250,7 +250,7 @@ vector_entry serror_aarch64
* SError exceptions from lower ELs are not currently supported.
* Report their occurrence.
*/
- bl report_unhandled_exception
+ no_ret report_unhandled_exception
check_vector_size serror_aarch64
/* ---------------------------------------------------------------------
@@ -280,7 +280,7 @@ vector_entry serror_aarch32
* SError exceptions from lower ELs are not currently supported.
* Report their occurrence.
*/
- bl report_unhandled_exception
+ no_ret report_unhandled_exception
check_vector_size serror_aarch32
@@ -415,5 +415,5 @@ smc_prohibited:
rt_svc_fw_critical_error:
/* Switch to SP_ELx */
msr spsel, #1
- bl report_unhandled_exception
+ no_ret report_unhandled_exception
endfunc smc_handler