diff options
author | Julius Werner <jwerner@chromium.org> | 2017-07-27 14:59:34 -0700 |
---|---|---|
committer | Julius Werner <jwerner@chromium.org> | 2017-08-21 13:50:54 -0700 |
commit | 4d91838b8d01a9e99c44fd0ed72f5d81b4595f17 (patch) | |
tree | 710929f9ed09fc109d0e998f65839c713dc671a2 /bl31/aarch64 | |
parent | 5ae4dab2b86351579d85d5f5a8f85252336381b8 (diff) |
Fix x30 reporting for unhandled exceptions
Some error paths that lead to a crash dump will overwrite the value in
the x30 register by calling functions with the no_ret macro, which
resolves to a BL instruction. This is not very useful and not what the
reader would expect, since a crash dump should usually show all
registers in the state they were in when the exception happened. This
patch replaces the offending function calls with a B instruction to
preserve the value in x30.
Change-Id: I2a3636f2943f79bab0cd911f89d070012e697c2a
Signed-off-by: Julius Werner <jwerner@chromium.org>
Diffstat (limited to 'bl31/aarch64')
-rw-r--r-- | bl31/aarch64/runtime_exceptions.S | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/bl31/aarch64/runtime_exceptions.S b/bl31/aarch64/runtime_exceptions.S index 45b0213d..d8fbb9b2 100644 --- a/bl31/aarch64/runtime_exceptions.S +++ b/bl31/aarch64/runtime_exceptions.S @@ -49,7 +49,8 @@ b.eq smc_handler64 /* Other kinds of synchronous exceptions are not handled */ - no_ret report_unhandled_exception + ldr x30, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR] + b report_unhandled_exception .endm @@ -152,7 +153,7 @@ vector_base runtime_exceptions */ vector_entry sync_exception_sp_el0 /* We don't expect any synchronous exceptions from EL3 */ - no_ret report_unhandled_exception + b report_unhandled_exception check_vector_size sync_exception_sp_el0 vector_entry irq_sp_el0 @@ -160,17 +161,17 @@ vector_entry irq_sp_el0 * EL3 code is non-reentrant. Any asynchronous exception is a serious * error. Loop infinitely. */ - no_ret report_unhandled_interrupt + b report_unhandled_interrupt check_vector_size irq_sp_el0 vector_entry fiq_sp_el0 - no_ret report_unhandled_interrupt + b report_unhandled_interrupt check_vector_size fiq_sp_el0 vector_entry serror_sp_el0 - no_ret report_unhandled_exception + b report_unhandled_exception check_vector_size serror_sp_el0 /* --------------------------------------------------------------------- @@ -184,19 +185,19 @@ vector_entry sync_exception_sp_elx * synchronous exception. There is a high probability that SP_EL3 is * corrupted. */ - no_ret report_unhandled_exception + b report_unhandled_exception check_vector_size sync_exception_sp_elx vector_entry irq_sp_elx - no_ret report_unhandled_interrupt + b report_unhandled_interrupt check_vector_size irq_sp_elx vector_entry fiq_sp_elx - no_ret report_unhandled_interrupt + b report_unhandled_interrupt check_vector_size fiq_sp_elx vector_entry serror_sp_elx - no_ret report_unhandled_exception + b report_unhandled_exception check_vector_size serror_sp_elx /* --------------------------------------------------------------------- @@ -226,7 +227,7 @@ vector_entry serror_aarch64 * SError exceptions from lower ELs are not currently supported. * Report their occurrence. */ - no_ret report_unhandled_exception + b report_unhandled_exception check_vector_size serror_aarch64 /* --------------------------------------------------------------------- @@ -256,7 +257,7 @@ vector_entry serror_aarch32 * SError exceptions from lower ELs are not currently supported. * Report their occurrence. */ - no_ret report_unhandled_exception + b report_unhandled_exception check_vector_size serror_aarch32 |