Commit d5a23af5 authored by Jeenu Viswambharan's avatar Jeenu Viswambharan
Browse files

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: default avatarJeenu Viswambharan <jeenu.viswambharan@arm.com>
parent b56dc2a9
...@@ -5,6 +5,7 @@ ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 @@ ...@@ -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 ...@@ -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
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment