diff options
author | Jeenu Viswambharan <jeenu.viswambharan@arm.com> | 2017-11-30 12:54:15 +0000 |
---|---|---|
committer | Jeenu Viswambharan <jeenu.viswambharan@arm.com> | 2018-05-04 08:32:42 +0100 |
commit | 76454abf4a2a5df482a753fc435b2de0219659bf (patch) | |
tree | 8195331234b5517463c1b60eafc6d56a7a134449 /include | |
parent | ef653d93ccd6ba1888c61706469021fc623c3318 (diff) |
AArch64: Introduce External Abort handling
At present, any External Abort routed to EL3 is reported as an unhandled
exception and cause a panic. This patch enables ARM Trusted Firmware to
handle External Aborts routed to EL3.
With this patch, when an External Abort is received at EL3, its handling
is delegated to plat_ea_handler() function. Platforms can provide their
own implementation of this function. This patch adds a weak definition
of the said function that prints out a message and just panics.
In order to support handling External Aborts at EL3, the build option
HANDLE_EA_EL3_FIRST must be set to 1.
Before this patch, HANDLE_EA_EL3_FIRST wasn't passed down to
compilation; this patch fixes that too.
Change-Id: I4d07b7e65eb191ff72d63b909ae9512478cd01a1
Signed-off-by: Jeenu Viswambharan <jeenu.viswambharan@arm.com>
Diffstat (limited to 'include')
-rw-r--r-- | include/bl31/ea_handle.h | 18 | ||||
-rw-r--r-- | include/lib/aarch64/arch.h | 8 | ||||
-rw-r--r-- | include/lib/el3_runtime/aarch64/context.h | 12 | ||||
-rw-r--r-- | include/plat/common/platform.h | 3 |
4 files changed, 36 insertions, 5 deletions
diff --git a/include/bl31/ea_handle.h b/include/bl31/ea_handle.h new file mode 100644 index 00000000..285132b7 --- /dev/null +++ b/include/bl31/ea_handle.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef __EA_HANDLE_H__ +#define __EA_HANDLE_H__ + +/* Constants indicating the reason for an External Abort */ + +/* External Abort received at SError vector */ +#define ERROR_EA_ASYNC 0 + +/* Synchronous External Abort received at Synchronous exception vector */ +#define ERROR_EA_SYNC 1 + +#endif /* __EA_HANDLE_H__ */ diff --git a/include/lib/aarch64/arch.h b/include/lib/aarch64/arch.h index ff3881e6..a4469412 100644 --- a/include/lib/aarch64/arch.h +++ b/include/lib/aarch64/arch.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2017, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -528,6 +528,12 @@ #define EC_AARCH64_FP U(0x2c) #define EC_SERROR U(0x2f) +/* + * External Abort bit in Instruction and Data Aborts synchronous exception + * syndromes. + */ +#define ESR_ISS_EABORT_EA_BIT U(9) + #define EC_BITS(x) (((x) >> ESR_EC_SHIFT) & ESR_EC_MASK) /* Reset bit inside the Reset management register for EL3 (RMR_EL3) */ diff --git a/include/lib/el3_runtime/aarch64/context.h b/include/lib/el3_runtime/aarch64/context.h index 5f6bdc97..cdd74a34 100644 --- a/include/lib/el3_runtime/aarch64/context.h +++ b/include/lib/el3_runtime/aarch64/context.h @@ -7,6 +7,8 @@ #ifndef __CONTEXT_H__ #define __CONTEXT_H__ +#include <utils_def.h> + /******************************************************************************* * Constants that allow assembler code to access members of and the 'gp_regs' * structure at their correct offsets. @@ -53,10 +55,12 @@ ******************************************************************************/ #define CTX_EL3STATE_OFFSET (CTX_GPREGS_OFFSET + CTX_GPREGS_END) #define CTX_SCR_EL3 U(0x0) -#define CTX_RUNTIME_SP U(0x8) -#define CTX_SPSR_EL3 U(0x10) -#define CTX_ELR_EL3 U(0x18) -#define CTX_EL3STATE_END U(0x20) +#define CTX_ESR_EL3 U(0x8) +#define CTX_RUNTIME_SP U(0x10) +#define CTX_SPSR_EL3 U(0x18) +#define CTX_ELR_EL3 U(0x20) +#define CTX_UNUSED U(0x28) +#define CTX_EL3STATE_END U(0x30) /******************************************************************************* * Constants that allow assembler code to access members of and the diff --git a/include/plat/common/platform.h b/include/plat/common/platform.h index aa181c82..cd17a00f 100644 --- a/include/plat/common/platform.h +++ b/include/plat/common/platform.h @@ -124,6 +124,9 @@ int plat_sdei_validate_entry_point(uintptr_t ep, unsigned int client_mode); void plat_sdei_handle_masked_trigger(uint64_t mpidr, unsigned int intr); #endif +void plat_ea_handler(unsigned int ea_reason, uint64_t syndrome, void *cookie, + void *handle, uint64_t flags); + /* * The following function is mandatory when the * firmware update feature is used. |