diff options
-rw-r--r-- | bl31/bl31.mk | 2 | ||||
-rw-r--r-- | common/feat_detect.c | 13 | ||||
-rw-r--r-- | include/arch/aarch64/arch_features.h | 18 | ||||
-rw-r--r-- | lib/el3_runtime/aarch64/context_mgmt.c | 6 | ||||
-rw-r--r-- | lib/extensions/trbe/trbe.c | 22 | ||||
-rw-r--r-- | plat/arm/board/fvp/platform.mk | 2 |
6 files changed, 32 insertions, 31 deletions
diff --git a/bl31/bl31.mk b/bl31/bl31.mk index e6609fe86..4d2fc874d 100644 --- a/bl31/bl31.mk +++ b/bl31/bl31.mk @@ -112,7 +112,7 @@ ifeq (${ENABLE_MPAM_FOR_LOWER_ELS},1) BL31_SOURCES += lib/extensions/mpam/mpam.c endif -ifeq (${ENABLE_TRBE_FOR_NS},1) +ifneq (${ENABLE_TRBE_FOR_NS},0) BL31_SOURCES += lib/extensions/trbe/trbe.c endif diff --git a/common/feat_detect.c b/common/feat_detect.c index cbe78c057..3012c8bbe 100644 --- a/common/feat_detect.c +++ b/common/feat_detect.c @@ -258,16 +258,6 @@ static void read_feat_brbe(void) #endif } -/****************************************************** - * Feature : FEAT_TRBE (Trace Buffer Extension) - *****************************************************/ -static void read_feat_trbe(void) -{ -#if (ENABLE_TRBE_FOR_NS == FEAT_STATE_ALWAYS) - feat_detect_panic(is_feat_trbe_present(), "TRBE"); -#endif -} - /****************************************************************** * Feature : FEAT_RNG_TRAP (Trapping support for RNDR/RNDRRS) *****************************************************************/ @@ -345,7 +335,8 @@ void detect_arch_features(void) /* v9.0 features */ read_feat_brbe(); - read_feat_trbe(); + check_feature(ENABLE_TRBE_FOR_NS, read_feat_trbe_id_field(), + "TRBE", 1, 1); /* v9.2 features */ read_feat_rme(); diff --git a/include/arch/aarch64/arch_features.h b/include/arch/aarch64/arch_features.h index 14f5cc775..ded42d477 100644 --- a/include/arch/aarch64/arch_features.h +++ b/include/arch/aarch64/arch_features.h @@ -297,10 +297,22 @@ static inline bool is_feat_brbe_present(void) /******************************************************************************* * Function to identify the presence of FEAT_TRBE (Trace Buffer Extension) ******************************************************************************/ -static inline bool is_feat_trbe_present(void) +static inline unsigned int read_feat_trbe_id_field(void) { - return (((read_id_aa64dfr0_el1() >> ID_AA64DFR0_TRACEBUFFER_SHIFT) & - ID_AA64DFR0_TRACEBUFFER_MASK) == ID_AA64DFR0_TRACEBUFFER_SUPPORTED); + return ISOLATE_FIELD(read_id_aa64dfr0_el1(), ID_AA64DFR0_TRACEBUFFER); } +static inline bool is_feat_trbe_supported(void) +{ + if (ENABLE_TRBE_FOR_NS == FEAT_STATE_DISABLED) { + return false; + } + + if (ENABLE_TRBE_FOR_NS == FEAT_STATE_ALWAYS) { + return true; + } + + return read_feat_trbe_id_field() != 0U; + +} #endif /* ARCH_FEATURES_H */ diff --git a/lib/el3_runtime/aarch64/context_mgmt.c b/lib/el3_runtime/aarch64/context_mgmt.c index 341c4a5d0..1dfb71f76 100644 --- a/lib/el3_runtime/aarch64/context_mgmt.c +++ b/lib/el3_runtime/aarch64/context_mgmt.c @@ -495,9 +495,9 @@ static void manage_extensions_nonsecure(bool el2_unused, cpu_context_t *ctx) mpam_enable(el2_unused); #endif -#if ENABLE_TRBE_FOR_NS - trbe_enable(); -#endif /* ENABLE_TRBE_FOR_NS */ + if (is_feat_trbe_supported()) { + trbe_enable(); + } #if ENABLE_BRBE_FOR_NS brbe_enable(); diff --git a/lib/extensions/trbe/trbe.c b/lib/extensions/trbe/trbe.c index b3463872b..fa139cad2 100644 --- a/lib/extensions/trbe/trbe.c +++ b/lib/extensions/trbe/trbe.c @@ -23,22 +23,20 @@ void trbe_enable(void) { uint64_t val; - if (is_feat_trbe_present()) { - /* - * MDCR_EL3.NSTB = 0b11 - * Allow access of trace buffer control registers from NS-EL1 - * and NS-EL2, tracing is prohibited in Secure and Realm state - * (if implemented). - */ - val = read_mdcr_el3(); - val |= MDCR_NSTB(MDCR_NSTB_EL1); - write_mdcr_el3(val); - } + /* + * MDCR_EL3.NSTB = 0b11 + * Allow access of trace buffer control registers from NS-EL1 + * and NS-EL2, tracing is prohibited in Secure and Realm state + * (if implemented). + */ + val = read_mdcr_el3(); + val |= MDCR_NSTB(MDCR_NSTB_EL1); + write_mdcr_el3(val); } static void *trbe_drain_trace_buffers_hook(const void *arg __unused) { - if (is_feat_trbe_present()) { + if (is_feat_trbe_supported()) { /* * Before switching from normal world to secure world * the trace buffers need to be drained out to memory. This is diff --git a/plat/arm/board/fvp/platform.mk b/plat/arm/board/fvp/platform.mk index efbf68f00..7991c14f6 100644 --- a/plat/arm/board/fvp/platform.mk +++ b/plat/arm/board/fvp/platform.mk @@ -446,7 +446,7 @@ DYN_DISABLE_AUTH := 1 endif # enable trace buffer control registers access to NS by default -ENABLE_TRBE_FOR_NS := 1 +ENABLE_TRBE_FOR_NS := 2 # enable branch record buffer control registers access in NS by default # only enable for aarch64 |