diff options
author | Andre Przywara <andre.przywara@arm.com> | 2022-11-17 17:30:43 +0000 |
---|---|---|
committer | Andre Przywara <andre.przywara@arm.com> | 2023-02-27 18:04:14 +0000 |
commit | fc8d2d3980352f92cf378155c1f4449b4a0ab4c0 (patch) | |
tree | 5e089155937a527962ad8cc71b0a89ec180a2526 /lib | |
parent | ff491036603c34bd80137f5fd43878eae5585197 (diff) | |
download | arm-trusted-firmware-fc8d2d3980352f92cf378155c1f4449b4a0ab4c0.tar.gz |
refactor(trf): enable FEAT_TRF for FEAT_STATE_CHECKED
At the moment we only support FEAT_TRF to be either unconditionally
compiled in, or to be not supported at all.
Add support for runtime detection (ENABLE_TRF_FOR_NS=2), by splitting
is_feat_trf_present() into an ID register reading function and a second
function to report the support status. That function considers both
build time settings and runtime information (if needed), and is used
before we access TRF related registers.
Also move the context saving code from assembly to C, and use the new
is_feat_trf_supported() function to guard its execution.
The FVP platform decided to compile in support unconditionally (=1),
even though FEAT_TRF is an ARMv8.4 feature, so is not available with the
FVP model's default command line.
Change that to the now supported dynamic option (=2), so the right
decision can be made by the code at runtime.
Change-Id: Ia97b01adbe24970a4d837afd463dc5506b7295a3
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/el3_runtime/aarch32/context_mgmt.c | 7 | ||||
-rw-r--r-- | lib/el3_runtime/aarch64/context.S | 24 | ||||
-rw-r--r-- | lib/el3_runtime/aarch64/context_mgmt.c | 18 | ||||
-rw-r--r-- | lib/extensions/trf/aarch32/trf.c | 25 | ||||
-rw-r--r-- | lib/extensions/trf/aarch64/trf.c | 30 |
5 files changed, 29 insertions, 75 deletions
diff --git a/lib/el3_runtime/aarch32/context_mgmt.c b/lib/el3_runtime/aarch32/context_mgmt.c index af8edf598..e494a86cf 100644 --- a/lib/el3_runtime/aarch32/context_mgmt.c +++ b/lib/el3_runtime/aarch32/context_mgmt.c @@ -11,6 +11,7 @@ #include <platform_def.h> #include <arch.h> +#include <arch_features.h> #include <arch_helpers.h> #include <common/bl_common.h> #include <context.h> @@ -143,9 +144,9 @@ static void enable_extensions_nonsecure(bool el2_unused) sys_reg_trace_enable(); #endif /* ENABLE_SYS_REG_TRACE_FOR_NS */ -#if ENABLE_TRF_FOR_NS - trf_enable(); -#endif /* ENABLE_TRF_FOR_NS */ + if (is_feat_trf_supported()) { + trf_enable(); + } #endif } diff --git a/lib/el3_runtime/aarch64/context.S b/lib/el3_runtime/aarch64/context.S index 722b8ae21..d43914848 100644 --- a/lib/el3_runtime/aarch64/context.S +++ b/lib/el3_runtime/aarch64/context.S @@ -41,10 +41,6 @@ .global el2_sysregs_context_save_nv2 .global el2_sysregs_context_restore_nv2 #endif /* CTX_INCLUDE_NEVE_REGS */ -#if ENABLE_TRF_FOR_NS - .global el2_sysregs_context_save_trf - .global el2_sysregs_context_restore_trf -#endif /* ENABLE_TRF_FOR_NS */ #if ENABLE_FEAT_CSV2_2 .global el2_sysregs_context_save_csv2 .global el2_sysregs_context_restore_csv2 @@ -536,26 +532,6 @@ func el2_sysregs_context_restore_nv2 endfunc el2_sysregs_context_restore_nv2 #endif /* CTX_INCLUDE_NEVE_REGS */ -#if ENABLE_TRF_FOR_NS -func el2_sysregs_context_save_trf - /* - * TRFCR_EL2 register is saved only when FEAT_TRF is supported. - */ - mrs x12, TRFCR_EL2 - str x12, [x0, #CTX_TRFCR_EL2] - ret -endfunc el2_sysregs_context_save_trf - -func el2_sysregs_context_restore_trf - /* - * TRFCR_EL2 register is restored only when FEAT_TRF is supported. - */ - ldr x12, [x0, #CTX_TRFCR_EL2] - msr TRFCR_EL2, x12 - ret -endfunc el2_sysregs_context_restore_trf -#endif /* ENABLE_TRF_FOR_NS */ - #if ENABLE_FEAT_CSV2_2 func el2_sysregs_context_save_csv2 /* diff --git a/lib/el3_runtime/aarch64/context_mgmt.c b/lib/el3_runtime/aarch64/context_mgmt.c index 54e257b75..4d2079d23 100644 --- a/lib/el3_runtime/aarch64/context_mgmt.c +++ b/lib/el3_runtime/aarch64/context_mgmt.c @@ -507,9 +507,9 @@ static void manage_extensions_nonsecure(bool el2_unused, cpu_context_t *ctx) sys_reg_trace_enable(ctx); #endif /* ENABLE_SYS_REG_TRACE_FOR_NS */ -#if ENABLE_TRF_FOR_NS - trf_enable(); -#endif /* ENABLE_TRF_FOR_NS */ + if (is_feat_trf_supported()) { + trf_enable(); + } #endif } @@ -875,9 +875,9 @@ void cm_el2_sysregs_context_save(uint32_t security_state) #if CTX_INCLUDE_NEVE_REGS el2_sysregs_context_save_nv2(el2_sysregs_ctx); #endif -#if ENABLE_TRF_FOR_NS - el2_sysregs_context_save_trf(el2_sysregs_ctx); -#endif + if (is_feat_trf_supported()) { + write_ctx_reg(el2_sysregs_ctx, CTX_TRFCR_EL2, read_trfcr_el2()); + } #if ENABLE_FEAT_CSV2_2 el2_sysregs_context_save_csv2(el2_sysregs_ctx); #endif @@ -935,9 +935,9 @@ void cm_el2_sysregs_context_restore(uint32_t security_state) #if CTX_INCLUDE_NEVE_REGS el2_sysregs_context_restore_nv2(el2_sysregs_ctx); #endif -#if ENABLE_TRF_FOR_NS - el2_sysregs_context_restore_trf(el2_sysregs_ctx); -#endif + if (is_feat_trf_supported()) { + write_trfcr_el2(read_ctx_reg(el2_sysregs_ctx, CTX_TRFCR_EL2)); + } #if ENABLE_FEAT_CSV2_2 el2_sysregs_context_restore_csv2(el2_sysregs_ctx); #endif diff --git a/lib/extensions/trf/aarch32/trf.c b/lib/extensions/trf/aarch32/trf.c index 834092d5a..0c63efa70 100644 --- a/lib/extensions/trf/aarch32/trf.c +++ b/lib/extensions/trf/aarch32/trf.c @@ -10,26 +10,15 @@ #include <arch_helpers.h> #include <lib/extensions/trf.h> -static bool trf_supported(void) -{ - uint32_t features; - - features = read_id_dfr0() >> ID_DFR0_TRACEFILT_SHIFT; - return ((features & ID_DFR0_TRACEFILT_MASK) == - ID_DFR0_TRACEFILT_SUPPORTED); -} - void trf_enable(void) { uint32_t val; - if (trf_supported()) { - /* - * Allow access of trace filter control registers from - * non-monitor mode - */ - val = read_sdcr(); - val &= ~SDCR_TTRF_BIT; - write_sdcr(val); - } + /* + * Allow access of trace filter control registers from + * non-monitor mode + */ + val = read_sdcr(); + val &= ~SDCR_TTRF_BIT; + write_sdcr(val); } diff --git a/lib/extensions/trf/aarch64/trf.c b/lib/extensions/trf/aarch64/trf.c index 1da5dcee0..941692bb4 100644 --- a/lib/extensions/trf/aarch64/trf.c +++ b/lib/extensions/trf/aarch64/trf.c @@ -4,33 +4,21 @@ * SPDX-License-Identifier: BSD-3-Clause */ -#include <stdbool.h> - #include <arch.h> +#include <arch_features.h> #include <arch_helpers.h> #include <lib/extensions/trf.h> -static bool trf_supported(void) -{ - uint64_t features; - - features = read_id_aa64dfr0_el1() >> ID_AA64DFR0_TRACEFILT_SHIFT; - return ((features & ID_AA64DFR0_TRACEFILT_MASK) == - ID_AA64DFR0_TRACEFILT_SUPPORTED); -} - void trf_enable(void) { uint64_t val; - if (trf_supported()) { - /* - * MDCR_EL3.TTRF = b0 - * Allow access of trace filter control registers from NS-EL2 - * and NS-EL1 when NS-EL2 is implemented but not used - */ - val = read_mdcr_el3(); - val &= ~MDCR_TTRF_BIT; - write_mdcr_el3(val); - } + /* + * MDCR_EL3.TTRF = b0 + * Allow access of trace filter control registers from NS-EL2 + * and NS-EL1 when NS-EL2 is implemented but not used + */ + val = read_mdcr_el3(); + val &= ~MDCR_TTRF_BIT; + write_mdcr_el3(val); } |