mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-23 21:44:15 +00:00
RAS: Introduce handler for Double Faults
Double fault is when the PE receives another error whilst one is being handled. To detect double fault condition, a per-CPU flag is introduced to track the status of error handling. The flag is checked/modified while temporarily masking external aborts on the PE. This patch routes double faults to a separate platform-defined handler. Change-Id: I70e9b7ba4c817273c55a0af978d9755ff32cc702 Signed-off-by: Jeenu Viswambharan <jeenu.viswambharan@arm.com>
This commit is contained in:
parent
b56dc2a98c
commit
d5a23af50f
2 changed files with 32 additions and 3 deletions
|
@ -5,6 +5,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <assert_macros.S>
|
||||||
#include <asm_macros.S>
|
#include <asm_macros.S>
|
||||||
#include <assert_macros.S>
|
#include <assert_macros.S>
|
||||||
#include <context.h>
|
#include <context.h>
|
||||||
|
@ -179,6 +180,15 @@ endfunc delegate_async_ea
|
||||||
* x1: EA syndrome
|
* x1: EA syndrome
|
||||||
*/
|
*/
|
||||||
func ea_proceed
|
func ea_proceed
|
||||||
|
/*
|
||||||
|
* If the ESR loaded earlier is not zero, we were processing an EA
|
||||||
|
* already, and this is a double fault.
|
||||||
|
*/
|
||||||
|
ldr x5, [sp, #CTX_EL3STATE_OFFSET + CTX_ESR_EL3]
|
||||||
|
cbz x5, 1f
|
||||||
|
no_ret plat_handle_double_fault
|
||||||
|
|
||||||
|
1:
|
||||||
/* Save EL3 state */
|
/* Save EL3 state */
|
||||||
mrs x2, spsr_el3
|
mrs x2, spsr_el3
|
||||||
mrs x3, elr_el3
|
mrs x3, elr_el3
|
||||||
|
@ -216,7 +226,6 @@ func ea_proceed
|
||||||
mov x28, sp
|
mov x28, sp
|
||||||
#endif
|
#endif
|
||||||
bl plat_ea_handler
|
bl plat_ea_handler
|
||||||
mov x30, x29
|
|
||||||
|
|
||||||
#if ENABLE_ASSERTIONS
|
#if ENABLE_ASSERTIONS
|
||||||
/*
|
/*
|
||||||
|
@ -232,7 +241,7 @@ func ea_proceed
|
||||||
/* Make SP point to context */
|
/* Make SP point to context */
|
||||||
msr spsel, #1
|
msr spsel, #1
|
||||||
|
|
||||||
/* Restore EL3 state */
|
/* Restore EL3 state and ESR */
|
||||||
ldp x1, x2, [sp, #CTX_EL3STATE_OFFSET + CTX_SPSR_EL3]
|
ldp x1, x2, [sp, #CTX_EL3STATE_OFFSET + CTX_SPSR_EL3]
|
||||||
msr spsr_el3, x1
|
msr spsr_el3, x1
|
||||||
msr elr_el3, x2
|
msr elr_el3, x2
|
||||||
|
@ -242,5 +251,13 @@ func ea_proceed
|
||||||
msr scr_el3, x3
|
msr scr_el3, x3
|
||||||
msr esr_el3, x4
|
msr esr_el3, x4
|
||||||
|
|
||||||
ret
|
#if ENABLE_ASSERTIONS
|
||||||
|
cmp x4, xzr
|
||||||
|
ASM_ASSERT(ne)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Clear ESR storage */
|
||||||
|
str xzr, [sp, #CTX_EL3STATE_OFFSET + CTX_ESR_EL3]
|
||||||
|
|
||||||
|
ret x29
|
||||||
endfunc ea_proceed
|
endfunc ea_proceed
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
.weak bl32_plat_enable_mmu
|
.weak bl32_plat_enable_mmu
|
||||||
|
|
||||||
.weak plat_handle_uncontainable_ea
|
.weak plat_handle_uncontainable_ea
|
||||||
|
.weak plat_handle_double_fault
|
||||||
|
|
||||||
#if !ENABLE_PLAT_COMPAT
|
#if !ENABLE_PLAT_COMPAT
|
||||||
.globl platform_get_core_pos
|
.globl platform_get_core_pos
|
||||||
|
@ -200,3 +201,14 @@ endfunc bl32_plat_enable_mmu
|
||||||
func plat_handle_uncontainable_ea
|
func plat_handle_uncontainable_ea
|
||||||
b report_unhandled_exception
|
b report_unhandled_exception
|
||||||
endfunc plat_handle_uncontainable_ea
|
endfunc plat_handle_uncontainable_ea
|
||||||
|
|
||||||
|
/* -----------------------------------------------------
|
||||||
|
* Platform handler for Double Fault.
|
||||||
|
*
|
||||||
|
* x0: EA reason
|
||||||
|
* x1: EA syndrome
|
||||||
|
* -----------------------------------------------------
|
||||||
|
*/
|
||||||
|
func plat_handle_double_fault
|
||||||
|
b report_unhandled_exception
|
||||||
|
endfunc plat_handle_double_fault
|
||||||
|
|
Loading…
Add table
Reference in a new issue