feat(trbe): introduce trbe_disable() function
This patch adds trbe_disable() which disables Trace buffer access
from lower ELs in all security state. This function makes Secure
state the owner of Trace buffer and access from EL2/EL1 generate
trap exceptions to EL3.
Signed-off-by: Arvind Ram Prakash <arvind.ramprakash@arm.com>
Change-Id: If3e3bd621684b3c28f44c3ed2fe3df30b143f8cd
(cherry picked from commit b36e975ea374589270fc4010aa247e1e56432bda)
diff --git a/include/lib/extensions/trbe.h b/include/lib/extensions/trbe.h
index 0bed433..ae977a6 100644
--- a/include/lib/extensions/trbe.h
+++ b/include/lib/extensions/trbe.h
@@ -7,10 +7,16 @@
#ifndef TRBE_H
#define TRBE_H
+#include <context.h>
+
#if ENABLE_TRBE_FOR_NS
void trbe_init_el3(void);
void trbe_init_el2_unused(void);
+void trbe_disable(void);
#else
+static inline void trbe_disable(void)
+{
+}
static inline void trbe_init_el3(void)
{
}
diff --git a/lib/el3_runtime/aarch64/context_mgmt.c b/lib/el3_runtime/aarch64/context_mgmt.c
index 0a92606..7472d61 100644
--- a/lib/el3_runtime/aarch64/context_mgmt.c
+++ b/lib/el3_runtime/aarch64/context_mgmt.c
@@ -1425,12 +1425,9 @@
{
#ifdef IMAGE_BL31
#if ERRATA_A520_2938996 || ERRATA_X4_2726228
- cpu_context_t *trbe_ctx = cm_get_context(NON_SECURE);
-
- assert(trbe_ctx != NULL);
if (check_if_affected_core() == ERRATA_APPLIES) {
if (is_feat_trbe_supported()) {
- trbe_disable(ctx);
+ trbe_disable();
}
}
#endif
diff --git a/lib/extensions/trbe/trbe.c b/lib/extensions/trbe/trbe.c
index d4fbdfb..1647a39 100644
--- a/lib/extensions/trbe/trbe.c
+++ b/lib/extensions/trbe/trbe.c
@@ -39,6 +39,24 @@
write_mdcr_el3(val);
}
+void trbe_disable(void)
+{
+ u_register_t mdcr_el3_val = read_mdcr_el3();
+
+ /*
+ * MDCR_EL3.NSTBE = 0b0
+ * Trace Buffer owning Security state is secure state. If FEAT_RME
+ * is not implemented, this field is RES0.
+ *
+ * MDCR_EL3.NSTB = 0b00
+ * Clear these bits to disable access of trace buffer control registers
+ * from lower ELs in any security state.
+ */
+ mdcr_el3_val &= ~(MDCR_NSTB(MDCR_NSTB_EL1));
+ mdcr_el3_val &= ~(MDCR_NSTBE_BIT);
+ write_mdcr_el3(mdcr_el3_val);
+}
+
void trbe_init_el2_unused(void)
{
/*