summaryrefslogtreecommitdiff
path: root/core/arch/arm/kernel/trace_ext.c
diff options
context:
space:
mode:
Diffstat (limited to 'core/arch/arm/kernel/trace_ext.c')
-rw-r--r--core/arch/arm/kernel/trace_ext.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/core/arch/arm/kernel/trace_ext.c b/core/arch/arm/kernel/trace_ext.c
index 8b8454c..6cedba3 100644
--- a/core/arch/arm/kernel/trace_ext.c
+++ b/core/arch/arm/kernel/trace_ext.c
@@ -27,21 +27,40 @@
#include <stdbool.h>
#include <trace.h>
#include <console.h>
+#include <kernel/spinlock.h>
#include <kernel/thread.h>
+#include <mm/core_mmu.h>
const char trace_ext_prefix[] = "TEE-CORE";
int trace_level = TRACE_LEVEL;
+static unsigned int puts_lock = SPINLOCK_UNLOCK;
void trace_ext_puts(const char *str)
{
+ uint32_t itr_status = thread_mask_exceptions(THREAD_EXCP_ALL);
+ bool mmu_enabled = cpu_mmu_enabled();
+ bool was_contended = false;
const char *p;
+ if (mmu_enabled && !cpu_spin_trylock(&puts_lock)) {
+ was_contended = true;
+ cpu_spin_lock(&puts_lock);
+ }
+
console_flush();
+ if (was_contended)
+ console_putc('*');
+
for (p = str; *p; p++)
console_putc(*p);
console_flush();
+
+ if (mmu_enabled)
+ cpu_spin_unlock(&puts_lock);
+
+ thread_unmask_exceptions(itr_status);
}
int trace_ext_get_thread_id(void)