Commit adb4fcfb authored by Gerald Lejeune's avatar Gerald Lejeune
Browse files

Enable asynchronous abort exceptions during boot



Asynchronous abort exceptions generated by the platform during cold boot are
not taken in EL3 unless SCR_EL3.EA is set.

Therefore EA bit is set along with RES1 bits in early BL1 and BL31 architecture
initialisation. Further write accesses to SCR_EL3 preserve these bits during
cold boot.

A build flag controls SCR_EL3.EA value to keep asynchronous abort exceptions
being trapped by EL3 after cold boot or not.

For further reference SError Interrupts are also known as asynchronous external
aborts.

On Cortex-A53 revisions below r0p2, asynchronous abort exceptions are taken in
EL3 whatever the SCR_EL3.EA value is.

Fixes arm-software/tf-issues#368
Signed-off-by: default avatarGerald Lejeune <gerald.lejeune@st.com>
parent 6b1ca8f3
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
void bl1_arch_setup(void) void bl1_arch_setup(void)
{ {
/* Set the next EL to be AArch64 */ /* Set the next EL to be AArch64 */
write_scr_el3(SCR_RES1_BITS | SCR_RW_BIT); write_scr_el3(read_scr_el3() | SCR_RW_BIT);
} }
/******************************************************************************* /*******************************************************************************
......
...@@ -43,9 +43,6 @@ ...@@ -43,9 +43,6 @@
******************************************************************************/ ******************************************************************************/
void bl31_arch_setup(void) void bl31_arch_setup(void)
{ {
/* Set the RES1 bits in the SCR_EL3 */
write_scr_el3(SCR_RES1_BITS);
/* Program the counter frequency */ /* Program the counter frequency */
write_cntfrq_el0(plat_get_syscnt_freq()); write_cntfrq_el0(plat_get_syscnt_freq());
......
...@@ -111,6 +111,11 @@ static void cm_init_context_common(cpu_context_t *ctx, const entry_point_info_t ...@@ -111,6 +111,11 @@ static void cm_init_context_common(cpu_context_t *ctx, const entry_point_info_t
if (EP_GET_ST(ep->h.attr)) if (EP_GET_ST(ep->h.attr))
scr_el3 |= SCR_ST_BIT; scr_el3 |= SCR_ST_BIT;
#ifndef HANDLE_EA_EL3_FIRST
/* Explicitly stop to trap aborts from lower exception levels. */
scr_el3 &= ~SCR_EA_BIT;
#endif
#if IMAGE_BL31 #if IMAGE_BL31
/* /*
* IRQ/FIQ bits only need setting if interrupt routing * IRQ/FIQ bits only need setting if interrupt routing
......
...@@ -174,8 +174,9 @@ BL1 performs minimal architectural initialization as follows. ...@@ -174,8 +174,9 @@ BL1 performs minimal architectural initialization as follows.
`SCTLR_EL3.A` and `SCTLR_EL3.SA` bits. Exception endianness is set to `SCTLR_EL3.A` and `SCTLR_EL3.SA` bits. Exception endianness is set to
little-endian by clearing the `SCTLR_EL3.EE` bit. little-endian by clearing the `SCTLR_EL3.EE` bit.
- `SCR_EL3`. The register width of the next lower exception level is set to - `SCR_EL3`. The register width of the next lower exception level is set
AArch64 by setting the `SCR.RW` bit. to AArch64 by setting the `SCR.RW` bit. The `SCR.EA` bit is set to trap
both External Aborts and SError Interrupts in EL3.
- `CPTR_EL3`. Accesses to the `CPACR_EL1` register from EL1 or EL2, or the - `CPTR_EL3`. Accesses to the `CPACR_EL1` register from EL1 or EL2, or the
`CPTR_EL2` register from EL2 are configured to not trap to EL3 by `CPTR_EL2` register from EL2 are configured to not trap to EL3 by
......
...@@ -439,6 +439,9 @@ performed. ...@@ -439,6 +439,9 @@ performed.
where applicable). Defaults to a string that contains the time and date of where applicable). Defaults to a string that contains the time and date of
the compilation. the compilation.
* `HANDLE_EA_EL3_FIRST`: When defined External Aborts and SError Interrupts
will be always trapped in EL3 i.e. in BL31 at runtime.
#### ARM development platform specific build options #### ARM development platform specific build options
* `ARM_TSP_RAM_LOCATION`: location of the TSP binary. Options: * `ARM_TSP_RAM_LOCATION`: location of the TSP binary. Options:
......
...@@ -70,8 +70,15 @@ ...@@ -70,8 +70,15 @@
isb isb
/* --------------------------------------------------------------------- /* ---------------------------------------------------------------------
* Enable the SError interrupt now that the exception vectors have been * Early set RES1 bits in SCR_EL3. Set EA bit as well to catch both
* setup. * External Aborts and SError Interrupts in EL3.
* ---------------------------------------------------------------------
*/
mov x0, #(SCR_RES1_BITS | SCR_EA_BIT)
msr scr_el3, x0
/* ---------------------------------------------------------------------
* Enable External Aborts and SError Interrupts now that the exception
* vectors have been setup.
* --------------------------------------------------------------------- * ---------------------------------------------------------------------
*/ */
msr daifclr, #DAIF_ABT_BIT msr daifclr, #DAIF_ABT_BIT
......
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