mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-19 02:54:24 +00:00
Merge changes from topic "jc/mte_enable" into integration
* changes: Add documentation for CTX_INCLUDE_MTE_REGS Enable MTE support in both secure and non-secure worlds
This commit is contained in:
commit
91624b7fed
10 changed files with 110 additions and 10 deletions
10
Makefile
10
Makefile
|
@ -522,6 +522,14 @@ ifeq ($(ENABLE_BTI),1)
|
||||||
$(info Branch Protection is an experimental feature)
|
$(info Branch Protection is an experimental feature)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(CTX_INCLUDE_MTE_REGS),1)
|
||||||
|
ifneq (${ARCH},aarch64)
|
||||||
|
$(error CTX_INCLUDE_MTE_REGS requires AArch64)
|
||||||
|
else
|
||||||
|
$(info CTX_INCLUDE_MTE_REGS is an experimental feature)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# Process platform overrideable behaviour
|
# Process platform overrideable behaviour
|
||||||
################################################################################
|
################################################################################
|
||||||
|
@ -643,6 +651,7 @@ $(eval $(call assert_boolean,CREATE_KEYS))
|
||||||
$(eval $(call assert_boolean,CTX_INCLUDE_AARCH32_REGS))
|
$(eval $(call assert_boolean,CTX_INCLUDE_AARCH32_REGS))
|
||||||
$(eval $(call assert_boolean,CTX_INCLUDE_FPREGS))
|
$(eval $(call assert_boolean,CTX_INCLUDE_FPREGS))
|
||||||
$(eval $(call assert_boolean,CTX_INCLUDE_PAUTH_REGS))
|
$(eval $(call assert_boolean,CTX_INCLUDE_PAUTH_REGS))
|
||||||
|
$(eval $(call assert_boolean,CTX_INCLUDE_MTE_REGS))
|
||||||
$(eval $(call assert_boolean,DEBUG))
|
$(eval $(call assert_boolean,DEBUG))
|
||||||
$(eval $(call assert_boolean,DYN_DISABLE_AUTH))
|
$(eval $(call assert_boolean,DYN_DISABLE_AUTH))
|
||||||
$(eval $(call assert_boolean,EL3_EXCEPTION_HANDLING))
|
$(eval $(call assert_boolean,EL3_EXCEPTION_HANDLING))
|
||||||
|
@ -702,6 +711,7 @@ $(eval $(call add_define,CTX_INCLUDE_AARCH32_REGS))
|
||||||
$(eval $(call add_define,CTX_INCLUDE_FPREGS))
|
$(eval $(call add_define,CTX_INCLUDE_FPREGS))
|
||||||
$(eval $(call add_define,CTX_INCLUDE_PAUTH_REGS))
|
$(eval $(call add_define,CTX_INCLUDE_PAUTH_REGS))
|
||||||
$(eval $(call add_define,EL3_EXCEPTION_HANDLING))
|
$(eval $(call add_define,EL3_EXCEPTION_HANDLING))
|
||||||
|
$(eval $(call add_define,CTX_INCLUDE_MTE_REGS))
|
||||||
$(eval $(call add_define,ENABLE_AMU))
|
$(eval $(call add_define,ENABLE_AMU))
|
||||||
$(eval $(call add_define,ENABLE_ASSERTIONS))
|
$(eval $(call add_define,ENABLE_ASSERTIONS))
|
||||||
$(eval $(call add_define,ENABLE_BTI))
|
$(eval $(call add_define,ENABLE_BTI))
|
||||||
|
|
|
@ -386,6 +386,14 @@ tsp_args_t *tsp_smc_handler(uint64_t func,
|
||||||
*/
|
*/
|
||||||
tsp_get_magic(service_args);
|
tsp_get_magic(service_args);
|
||||||
|
|
||||||
|
#if CTX_INCLUDE_MTE_REGS
|
||||||
|
/*
|
||||||
|
* Write a dummy value to an MTE register, to simulate usage in the
|
||||||
|
* secure world
|
||||||
|
*/
|
||||||
|
write_gcr_el1(0x99);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Determine the function to perform based on the function ID */
|
/* Determine the function to perform based on the function ID */
|
||||||
switch (TSP_BARE_FID(func)) {
|
switch (TSP_BARE_FID(func)) {
|
||||||
case TSP_ADD:
|
case TSP_ADD:
|
||||||
|
|
|
@ -2581,7 +2581,16 @@ Armv8.5-A
|
||||||
~~~~~~~~~
|
~~~~~~~~~
|
||||||
|
|
||||||
- Branch Target Identification feature is selected by ``BRANCH_PROTECTION``
|
- Branch Target Identification feature is selected by ``BRANCH_PROTECTION``
|
||||||
option set to 1. This option defaults to 0 and this is an experimental feature.
|
option set to 1. This option defaults to 0 and this is an experimental
|
||||||
|
feature.
|
||||||
|
|
||||||
|
- Memory Tagging Extension feature is unconditionally enabled for both worlds
|
||||||
|
(at EL0 and S-EL0) if it is only supported at EL0. If instead it is
|
||||||
|
implemented at all ELs, it is unconditionally enabled for only the normal
|
||||||
|
world. To enable it for the secure world as well, the build option
|
||||||
|
``CTX_INCLUDE_MTE_REGS`` is required. If the hardware does not implement
|
||||||
|
MTE support at all, it is always disabled, no matter what build options
|
||||||
|
are used.
|
||||||
|
|
||||||
Armv7-A
|
Armv7-A
|
||||||
~~~~~~~
|
~~~~~~~
|
||||||
|
|
|
@ -383,6 +383,13 @@ Common build options
|
||||||
registers to be included when saving and restoring the CPU context. Default
|
registers to be included when saving and restoring the CPU context. Default
|
||||||
is 0.
|
is 0.
|
||||||
|
|
||||||
|
- ``CTX_INCLUDE_MTE_REGS``: Enables register saving/reloading support for
|
||||||
|
ARMv8.5 Memory Tagging Extension. A value of 0 will disable
|
||||||
|
saving/reloading and restrict the use of MTE to the normal world if the
|
||||||
|
CPU has support, while a value of 1 enables the saving/reloading, allowing
|
||||||
|
the use of MTE in both the secure and non-secure worlds. Default is 0
|
||||||
|
(disabled) and this feature is experimental.
|
||||||
|
|
||||||
- ``CTX_INCLUDE_PAUTH_REGS``: Boolean option that, when set to 1, enables
|
- ``CTX_INCLUDE_PAUTH_REGS``: Boolean option that, when set to 1, enables
|
||||||
Pointer Authentication for Secure world. This will cause the ARMv8.3-PAuth
|
Pointer Authentication for Secure world. This will cause the ARMv8.3-PAuth
|
||||||
registers to be included when saving and restoring the CPU context as
|
registers to be included when saving and restoring the CPU context as
|
||||||
|
@ -813,6 +820,7 @@ Common build options
|
||||||
cluster platforms). If this option is enabled, then warm boot path
|
cluster platforms). If this option is enabled, then warm boot path
|
||||||
enables D-caches immediately after enabling MMU. This option defaults to 0.
|
enables D-caches immediately after enabling MMU. This option defaults to 0.
|
||||||
|
|
||||||
|
|
||||||
Arm development platform specific build options
|
Arm development platform specific build options
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
|
|
@ -901,4 +901,12 @@
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
#define SSBS S3_3_C4_C2_6
|
#define SSBS S3_3_C4_C2_6
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Armv8.5 - Memory Tagging Extension Registers
|
||||||
|
******************************************************************************/
|
||||||
|
#define TFSRE0_EL1 S3_0_C5_C6_1
|
||||||
|
#define TFSR_EL1 S3_0_C5_C6_0
|
||||||
|
#define RGSR_EL1 S3_0_C1_C0_5
|
||||||
|
#define GCR_EL1 S3_0_C1_C0_6
|
||||||
|
|
||||||
#endif /* ARCH_H */
|
#endif /* ARCH_H */
|
||||||
|
|
|
@ -501,6 +501,12 @@ DEFINE_RENAME_SYSREG_READ_FUNC(id_aa64mmfr2_el1, ID_AA64MMFR2_EL1)
|
||||||
DEFINE_RENAME_SYSREG_RW_FUNCS(apiakeyhi_el1, APIAKeyHi_EL1)
|
DEFINE_RENAME_SYSREG_RW_FUNCS(apiakeyhi_el1, APIAKeyHi_EL1)
|
||||||
DEFINE_RENAME_SYSREG_RW_FUNCS(apiakeylo_el1, APIAKeyLo_EL1)
|
DEFINE_RENAME_SYSREG_RW_FUNCS(apiakeylo_el1, APIAKeyLo_EL1)
|
||||||
|
|
||||||
|
/* Armv8.5 MTE Registers */
|
||||||
|
DEFINE_RENAME_SYSREG_RW_FUNCS(tfsre0_el1, TFSRE0_EL1)
|
||||||
|
DEFINE_RENAME_SYSREG_RW_FUNCS(tfsr_el1, TFSR_EL1)
|
||||||
|
DEFINE_RENAME_SYSREG_RW_FUNCS(rgsr_el1, RGSR_EL1)
|
||||||
|
DEFINE_RENAME_SYSREG_RW_FUNCS(gcr_el1, GCR_EL1)
|
||||||
|
|
||||||
#define IS_IN_EL(x) \
|
#define IS_IN_EL(x) \
|
||||||
(GET_EL(read_CurrentEl()) == MODE_EL##x)
|
(GET_EL(read_CurrentEl()) == MODE_EL##x)
|
||||||
|
|
||||||
|
|
|
@ -123,10 +123,22 @@
|
||||||
#define CTX_TIMER_SYSREGS_END CTX_AARCH32_END
|
#define CTX_TIMER_SYSREGS_END CTX_AARCH32_END
|
||||||
#endif /* NS_TIMER_SWITCH */
|
#endif /* NS_TIMER_SWITCH */
|
||||||
|
|
||||||
|
#if CTX_INCLUDE_MTE_REGS
|
||||||
|
#define CTX_TFSRE0_EL1 (CTX_TIMER_SYSREGS_END + U(0x0))
|
||||||
|
#define CTX_TFSR_EL1 (CTX_TIMER_SYSREGS_END + U(0x8))
|
||||||
|
#define CTX_RGSR_EL1 (CTX_TIMER_SYSREGS_END + U(0x10))
|
||||||
|
#define CTX_GCR_EL1 (CTX_TIMER_SYSREGS_END + U(0x18))
|
||||||
|
|
||||||
|
/* Align to the next 16 byte boundary */
|
||||||
|
#define CTX_MTE_REGS_END (CTX_TIMER_SYSREGS_END + U(0x20))
|
||||||
|
#else
|
||||||
|
#define CTX_MTE_REGS_END CTX_TIMER_SYSREGS_END
|
||||||
|
#endif /* CTX_INCLUDE_MTE_REGS */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* End of system registers.
|
* End of system registers.
|
||||||
*/
|
*/
|
||||||
#define CTX_SYSREGS_END CTX_TIMER_SYSREGS_END
|
#define CTX_SYSREGS_END CTX_MTE_REGS_END
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Constants that allow assembler code to access members of and the 'fp_regs'
|
* Constants that allow assembler code to access members of and the 'fp_regs'
|
||||||
|
|
|
@ -145,6 +145,17 @@ func el1_sysregs_context_save
|
||||||
str x14, [x0, #CTX_CNTKCTL_EL1]
|
str x14, [x0, #CTX_CNTKCTL_EL1]
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Save MTE system registers if the build has instructed so */
|
||||||
|
#if CTX_INCLUDE_MTE_REGS
|
||||||
|
mrs x15, TFSRE0_EL1
|
||||||
|
mrs x16, TFSR_EL1
|
||||||
|
stp x15, x16, [x0, #CTX_TFSRE0_EL1]
|
||||||
|
|
||||||
|
mrs x9, RGSR_EL1
|
||||||
|
mrs x10, GCR_EL1
|
||||||
|
stp x9, x10, [x0, #CTX_RGSR_EL1]
|
||||||
|
#endif
|
||||||
|
|
||||||
ret
|
ret
|
||||||
endfunc el1_sysregs_context_save
|
endfunc el1_sysregs_context_save
|
||||||
|
|
||||||
|
@ -229,6 +240,16 @@ func el1_sysregs_context_restore
|
||||||
ldr x14, [x0, #CTX_CNTKCTL_EL1]
|
ldr x14, [x0, #CTX_CNTKCTL_EL1]
|
||||||
msr cntkctl_el1, x14
|
msr cntkctl_el1, x14
|
||||||
#endif
|
#endif
|
||||||
|
/* Restore MTE system registers if the build has instructed so */
|
||||||
|
#if CTX_INCLUDE_MTE_REGS
|
||||||
|
ldp x11, x12, [x0, #CTX_TFSRE0_EL1]
|
||||||
|
msr TFSRE0_EL1, x11
|
||||||
|
msr TFSR_EL1, x12
|
||||||
|
|
||||||
|
ldp x13, x14, [x0, #CTX_RGSR_EL1]
|
||||||
|
msr RGSR_EL1, x13
|
||||||
|
msr GCR_EL1, x14
|
||||||
|
#endif
|
||||||
|
|
||||||
/* No explict ISB required here as ERET covers it */
|
/* No explict ISB required here as ERET covers it */
|
||||||
ret
|
ret
|
||||||
|
|
|
@ -137,17 +137,30 @@ void cm_setup_context(cpu_context_t *ctx, const entry_point_info_t *ep)
|
||||||
scr_el3 |= SCR_API_BIT | SCR_APK_BIT;
|
scr_el3 |= SCR_API_BIT | SCR_APK_BIT;
|
||||||
#endif /* !CTX_INCLUDE_PAUTH_REGS */
|
#endif /* !CTX_INCLUDE_PAUTH_REGS */
|
||||||
|
|
||||||
unsigned int mte = get_armv8_5_mte_support();
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Enable MTE support unilaterally for normal world if the CPU supports
|
* Enable MTE support. Support is enabled unilaterally for the normal
|
||||||
* it.
|
* world, and only for the secure world when CTX_INCLUDE_MTE_REGS is
|
||||||
|
* set.
|
||||||
*/
|
*/
|
||||||
if (mte != MTE_UNIMPLEMENTED) {
|
unsigned int mte = get_armv8_5_mte_support();
|
||||||
if (security_state == NON_SECURE) {
|
#if CTX_INCLUDE_MTE_REGS
|
||||||
scr_el3 |= SCR_ATA_BIT;
|
assert(mte == MTE_IMPLEMENTED_ELX);
|
||||||
}
|
scr_el3 |= SCR_ATA_BIT;
|
||||||
|
#else
|
||||||
|
if (mte == MTE_IMPLEMENTED_EL0) {
|
||||||
|
/*
|
||||||
|
* Can enable MTE across both worlds as no MTE registers are
|
||||||
|
* used
|
||||||
|
*/
|
||||||
|
scr_el3 |= SCR_ATA_BIT;
|
||||||
|
} else if (mte == MTE_IMPLEMENTED_ELX && security_state == NON_SECURE) {
|
||||||
|
/*
|
||||||
|
* Can only enable MTE in Non-Secure world without register
|
||||||
|
* saving
|
||||||
|
*/
|
||||||
|
scr_el3 |= SCR_ATA_BIT;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef IMAGE_BL31
|
#ifdef IMAGE_BL31
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -214,6 +214,11 @@ ifeq (${ARCH},aarch32)
|
||||||
override ENABLE_SPE_FOR_LOWER_ELS := 0
|
override ENABLE_SPE_FOR_LOWER_ELS := 0
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# Include Memory Tagging Extension registers in cpu context. This must be set
|
||||||
|
# to 1 if the platform wants to use this feature in the Secure world and MTE is
|
||||||
|
# enabled at ELX.
|
||||||
|
CTX_INCLUDE_MTE_REGS := 0
|
||||||
|
|
||||||
ENABLE_AMU := 0
|
ENABLE_AMU := 0
|
||||||
|
|
||||||
# By default, enable Scalable Vector Extension if implemented for Non-secure
|
# By default, enable Scalable Vector Extension if implemented for Non-secure
|
||||||
|
|
Loading…
Add table
Reference in a new issue