Do not trap access to floating point registers

Traps when accessing architectural features are disabled by clearing bits
in CPTR_EL3 during early boot, including accesses to floating point
registers. The value of this register was previously undetermined, causing
unwanted traps to EL3. Future EL3 code (for example, context save/restore
code) may use floating point registers, although they are not used by current
code.

Also, the '-mgeneral-regs-only' flag is enabled in the GCC settings to
prevent generation of code that uses floating point registers.

Change-Id: I9a03675f6387bbbee81a6f2c9ccf81150db03747
This commit is contained in:
Harry Liebel 2014-01-14 18:11:48 +00:00 committed by Dan Handley
parent e83b0cadc6
commit 4f6036834f
8 changed files with 64 additions and 15 deletions

View File

@ -97,9 +97,10 @@ INCLUDES += -Ilib/include/ -Iinclude/aarch64/ -Iinclude/ \
-Iinclude/stdlib -Iinclude/stdlib/sys -Iinclude/stdlib -Iinclude/stdlib/sys
ASFLAGS += -nostdinc -ffreestanding -Wa,--fatal-warnings \ ASFLAGS += -nostdinc -ffreestanding -Wa,--fatal-warnings \
-D__ASSEMBLY__ ${INCLUDES} -mgeneral-regs-only -D__ASSEMBLY__ ${INCLUDES}
CFLAGS := -nostdinc -pedantic -ffreestanding -Wall -Werror \ CFLAGS := -nostdinc -pedantic -ffreestanding -Wall \
-std=c99 -c -Os -DDEBUG=${DEBUG} ${INCLUDES} ${CFLAGS} -Werror -mgeneral-regs-only -std=c99 -c -Os \
-DDEBUG=${DEBUG} ${INCLUDES} ${CFLAGS}
LDFLAGS += --fatal-warnings -O1 LDFLAGS += --fatal-warnings -O1
BL1_LDFLAGS := -Map=${BL1_MAPFILE} --script ${BL1_LINKERFILE} --entry=${BL1_ENTRY_POINT} BL1_LDFLAGS := -Map=${BL1_MAPFILE} --script ${BL1_LINKERFILE} --entry=${BL1_ENTRY_POINT}

View File

@ -61,9 +61,6 @@ void bl1_arch_setup(void)
enable_serror(); enable_serror();
enable_debug_exceptions(); enable_debug_exceptions();
/* Do not trap coprocessor accesses from lower ELs to EL3 */
write_cptr_el3(0);
/* Read the frequency from Frequency modes table */ /* Read the frequency from Frequency modes table */
counter_base_frequency = mmio_read_32(SYS_CNTCTL_BASE + CNTFID_OFF); counter_base_frequency = mmio_read_32(SYS_CNTCTL_BASE + CNTFID_OFF);
/* The first entry of the frequency modes table must not be 0 */ /* The first entry of the frequency modes table must not be 0 */

View File

@ -57,6 +57,29 @@ reset_handler:; .type reset_handler, %function
adr x0, early_exceptions adr x0, early_exceptions
msr vbar_el3, x0 msr vbar_el3, x0
/* ---------------------------------------------------------------------
* The initial state of the Architectural feature trap register
* (CPTR_EL3) is unknown and it must be set to a known state. All
* feature traps are disabled. Some bits in this register are marked as
* Reserved and should not be modified.
*
* CPTR_EL3.TCPAC: This causes a direct access to the CPACR_EL1 from EL1
* or the CPTR_EL2 from EL2 to trap to EL3 unless it is trapped at EL2.
* CPTR_EL3.TTA: This causes access to the Trace functionality to trap
* to EL3 when executed from EL0, EL1, EL2, or EL3. If system register
* access to trace functionality is not supported, this bit is RES0.
* CPTR_EL3.TFP: This causes instructions that access the registers
* associated with Floating Point and Advanced SIMD execution to trap
* to EL3 when executed from any exception level, unless trapped to EL1
* or EL2.
* ---------------------------------------------------------------------
*/
mrs x0, cptr_el3
bic w0, w0, #TCPAC_BIT
bic w0, w0, #TTA_BIT
bic w0, w0, #TFP_BIT
msr cptr_el3, x0
/* --------------------------------------------- /* ---------------------------------------------
* Enable the instruction cache. * Enable the instruction cache.
* --------------------------------------------- * ---------------------------------------------

View File

@ -62,9 +62,6 @@ void bl31_arch_setup(void)
enable_serror(); enable_serror();
enable_debug_exceptions(); enable_debug_exceptions();
/* Do not trap coprocessor accesses from lower ELs to EL3 */
write_cptr_el3(0);
/* Read the frequency from Frequency modes table */ /* Read the frequency from Frequency modes table */
counter_base_frequency = mmio_read_32(SYS_CNTCTL_BASE + CNTFID_OFF); counter_base_frequency = mmio_read_32(SYS_CNTCTL_BASE + CNTFID_OFF);
/* The first entry of the frequency modes table must not be 0 */ /* The first entry of the frequency modes table must not be 0 */

View File

@ -61,6 +61,29 @@ bl31_entrypoint:; .type bl31_entrypoint, %function
adr x1, runtime_exceptions adr x1, runtime_exceptions
msr vbar_el3, x1 msr vbar_el3, x1
/* ---------------------------------------------------------------------
* The initial state of the Architectural feature trap register
* (CPTR_EL3) is unknown and it must be set to a known state. All
* feature traps are disabled. Some bits in this register are marked as
* Reserved and should not be modified.
*
* CPTR_EL3.TCPAC: This causes a direct access to the CPACR_EL1 from EL1
* or the CPTR_EL2 from EL2 to trap to EL3 unless it is trapped at EL2.
* CPTR_EL3.TTA: This causes access to the Trace functionality to trap
* to EL3 when executed from EL0, EL1, EL2, or EL3. If system register
* access to trace functionality is not supported, this bit is RES0.
* CPTR_EL3.TFP: This causes instructions that access the registers
* associated with Floating Point and Advanced SIMD execution to trap
* to EL3 when executed from any exception level, unless trapped to EL1
* or EL2.
* ---------------------------------------------------------------------
*/
mrs x1, cptr_el3
bic w1, w1, #TCPAC_BIT
bic w1, w1, #TTA_BIT
bic w1, w1, #TFP_BIT
msr cptr_el3, x1
/* --------------------------------------------- /* ---------------------------------------------
* Enable the instruction cache. * Enable the instruction cache.
* --------------------------------------------- * ---------------------------------------------

View File

@ -89,6 +89,11 @@ Detailed changes since last release
separate issue tracking repository separate issue tracking repository
https://github.com/ARM-software/tf-issues. https://github.com/ARM-software/tf-issues.
* Cleared bits in the architectural trap feature register (CPTR_EL3) during
early boot to prevent traps when accessing certain registers, including
floating point registers. Also added `-mgeneral-regs-only` flag to GCC
settings to prevent generation of code using floating point registers.
ARM Trusted Firmware - version 0.2 ARM Trusted Firmware - version 0.2
================================== ==================================

View File

@ -672,11 +672,13 @@ BL1 performs minimal architectural initialization as follows.
Aborts and SError Interrupts are configured to be taken in EL3 by Aborts and SError Interrupts are configured to be taken in EL3 by
setting the `SCR.EA` bit. setting the `SCR.EA` bit.
- `CPTR_EL3`. Accesses to the `CPACR` from EL1 or EL2, or the `CPTR_EL2` - `CPTR_EL3`. Accesses to the `CPACR_EL1` register from EL1 or EL2, or the
from EL2 are configured to not trap to EL3 by clearing the `CPTR_EL2` register from EL2 are configured to not trap to EL3 by
`CPTR_EL3.TCPAC` bit. Instructions that access the registers associated clearing the `CPTR_EL3.TCPAC` bit. Access to the trace functionality is
with Floating Point and Advanced SIMD execution are configured to not configured not to trap to EL3 by clearing the `CPTR_EL3.TTA` bit.
trap to EL3 by clearing the `CPTR_EL3.TFP` bit. Instructions that access the registers associated with Floating Point
and Advanced SIMD execution are configured to not trap to EL3 by
clearing the `CPTR_EL3.TFP` bit.
- `CNTFRQ_EL0`. The `CNTFRQ_EL0` register is programmed with the base - `CNTFRQ_EL0`. The `CNTFRQ_EL0` register is programmed with the base
frequency of the system counter, which is retrieved from the first entry frequency of the system counter, which is retrieved from the first entry

View File

@ -167,7 +167,8 @@
#define EL0VCTEN_BIT (1 << 1) #define EL0VCTEN_BIT (1 << 1)
/* CPTR_EL3 definitions */ /* CPTR_EL3 definitions */
#define TCPAC_BIT (1ull << 31) #define TCPAC_BIT (1 << 31)
#define TTA_BIT (1 << 20)
#define TFP_BIT (1 << 10) #define TFP_BIT (1 << 10)
/* CPSR/SPSR definitions */ /* CPSR/SPSR definitions */