arm-trusted-firmware/include/lib
Dimitris Papastamos a1781a211a Workaround for CVE-2017-5715 on Cortex A73 and A75
Invalidate the Branch Target Buffer (BTB) on entry to EL3 by
temporarily dropping into AArch32 Secure-EL1 and executing the
`BPIALL` instruction.

This is achieved by using 3 vector tables.  There is the runtime
vector table which is used to handle exceptions and 2 additional
tables which are required to implement this workaround.  The
additional tables are `vbar0` and `vbar1`.

The sequence of events for handling a single exception is
as follows:

1) Install vector table `vbar0` which saves the CPU context on entry
   to EL3 and sets up the Secure-EL1 context to execute in AArch32 mode
   with the MMU disabled and I$ enabled.  This is the default vector table.

2) Before doing an ERET into Secure-EL1, switch vbar to point to
   another vector table `vbar1`.  This is required to restore EL3 state
   when returning from the workaround, before proceeding with normal EL3
   exception handling.

3) While in Secure-EL1, the `BPIALL` instruction is executed and an
   SMC call back to EL3 is performed.

4) On entry to EL3 from Secure-EL1, the saved context from step 1) is
   restored.  The vbar is switched to point to `vbar0` in preparation to
   handle further exceptions.  Finally a branch to the runtime vector
   table entry is taken to complete the handling of the original
   exception.

This workaround is enabled by default on the affected CPUs.

NOTE
====

There are 4 different stubs in Secure-EL1.  Each stub corresponds to
an exception type such as Sync/IRQ/FIQ/SError.  Each stub will move a
different value in `R0` before doing an SMC call back into EL3.
Without this piece of information it would not be possible to know
what the original exception type was as we cannot use `ESR_EL3` to
distinguish between IRQs and FIQs.

Change-Id: I90b32d14a3735290b48685d43c70c99daaa4b434
Signed-off-by: Dimitris Papastamos <dimitris.papastamos@arm.com>
2018-01-11 10:26:15 +00:00
..
aarch32 AMU: Implement support for aarch32 2017-11-29 09:36:35 +00:00
aarch64 Workaround for CVE-2017-5715 on Cortex A73 and A75 2018-01-11 10:26:15 +00:00
cpus Implement support for the Activity Monitor Unit on Cortex A75 2017-11-29 09:36:05 +00:00
el3_runtime Workaround for CVE-2017-5715 on Cortex A73 and A75 2018-01-11 10:26:15 +00:00
extensions Enable SVE for Non-secure world 2017-11-30 17:45:09 +00:00
libfdt libfdt: Replace v1.4.1 by v1.4.2 2017-01-16 17:26:04 +00:00
pmf Fix order of #includes 2017-07-12 14:45:31 +01:00
psci Update PSCI version to 1.1 2017-10-13 12:39:08 +01:00
stdlib Fix stdlib defines for AArch32 2017-06-09 14:47:52 +01:00
xlat_tables SPM: Move S-EL1/S-EL0 xlat tables to TZC DRAM 2017-12-06 14:12:41 +00:00
bakery_lock.h Use SPDX license identifiers 2017-05-03 09:39:28 +01:00
cassert.h Use SPDX license identifiers 2017-05-03 09:39:28 +01:00
mmio.h Use SPDX license identifiers 2017-05-03 09:39:28 +01:00
optee_utils.h Add Trusted OS extra image parsing support for ARM standard platforms 2017-08-09 18:06:05 +08:00
runtime_instr.h Use SPDX license identifiers 2017-05-03 09:39:28 +01:00
semihosting.h Use SPDX license identifiers 2017-05-03 09:39:28 +01:00
smcc.h include: add U()/ULL() macros for constants 2017-06-14 17:00:30 -07:00
spinlock.h Use SPDX license identifiers 2017-05-03 09:39:28 +01:00
utils.h Add mem_region utility functions 2017-09-25 13:32:20 +01:00
utils_def.h GICv3: add functions for save and restore 2017-10-05 16:47:53 +01:00