aboutsummaryrefslogtreecommitdiff
path: root/lib/libutee
diff options
context:
space:
mode:
authorJerome Forissier <jerome.forissier@linaro.org>2017-09-29 13:58:27 -0700
committerJérôme Forissier <jerome.forissier@linaro.org>2017-10-06 10:12:12 -0700
commit0e1c6e8e35c64fde0c31a34a68ca349240604c86 (patch)
treef7c49b031015cb4486e8cc258b84e515306dc27a /lib/libutee
parent821a8785727575b3c98357155a132664082462b6 (diff)
Dump call stack on TA panic
Adds support for dumping the call stack of a user-mode TA when it panics. Stack unwinding happens in kernel mode by re-using abort_print_error() in core/arch/arm/kernel/abort.c. Like for abort dumps, the helper script scripts/symbolize.py may be used to obtain source-level information. This feature is enabled by default. Set CFG_UNWIND=n to disable it (or CFG_TEE_CORE_DEBUG=n). In libutee, the utee_panic() syscall wrapper is renamed __utee_panic() and now takes an additional parameters: a stack pointer, in addition to the panic code. utee_panic() is written in assembly and pushes some registers onto the stack before calling __utee_panic(). When it is time to return from syscall_panic(), tee_svc_sys_return_helper() uses the stack pointer to get the information needed to unwind the TA stack. A struct abort_info is created and abort_print_error() is called. Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org> Reviewed-by: Jens Wiklander <jens.wiklander@linaro.org> Tested-by: Jerome Forissier <jerome.forissier@linaro.org> (QEMU) Tested-by: Jerome Forissier <jerome.forissier@linaro.org> (HiKey 32/64) Tested-by: Jerome Forissier <jerome.forissier@linaro.org> (QEMUv8)
Diffstat (limited to 'lib/libutee')
-rw-r--r--lib/libutee/abort.c3
-rw-r--r--lib/libutee/arch/arm/utee_syscalls_a32.S13
-rw-r--r--lib/libutee/arch/arm/utee_syscalls_a64.S7
-rw-r--r--lib/libutee/arch/arm/utee_syscalls_asm.S2
-rw-r--r--lib/libutee/assert.c3
-rw-r--r--lib/libutee/include/tee_api.h9
-rw-r--r--lib/libutee/include/utee_syscalls.h3
-rw-r--r--lib/libutee/tee_api_panic.c10
8 files changed, 30 insertions, 20 deletions
diff --git a/lib/libutee/abort.c b/lib/libutee/abort.c
index 1de88f28..79c071fc 100644
--- a/lib/libutee/abort.c
+++ b/lib/libutee/abort.c
@@ -34,4 +34,7 @@ void abort(void)
{
printf("Abort!\n");
utee_panic(0);
+ /* Not reached */
+ while (1)
+ ;
}
diff --git a/lib/libutee/arch/arm/utee_syscalls_a32.S b/lib/libutee/arch/arm/utee_syscalls_a32.S
index dbc661f4..7f375b68 100644
--- a/lib/libutee/arch/arm/utee_syscalls_a32.S
+++ b/lib/libutee/arch/arm/utee_syscalls_a32.S
@@ -64,4 +64,17 @@ UNWIND( .fnend)
END_FUNC \name
.endm
+ FUNC utee_panic, :
+UNWIND( .fnstart)
+ push {r0-r11, lr}
+UNWIND( .save {r0-r11, lr})
+ mov lr, pc
+ push {lr}
+UNWIND( .save {lr})
+ mov r1, sp
+ bl __utee_panic
+ /* Not reached */
+UNWIND( .fnend)
+ END_FUNC utee_panic
+
#include "utee_syscalls_asm.S"
diff --git a/lib/libutee/arch/arm/utee_syscalls_a64.S b/lib/libutee/arch/arm/utee_syscalls_a64.S
index 44bfa4b7..115a619d 100644
--- a/lib/libutee/arch/arm/utee_syscalls_a64.S
+++ b/lib/libutee/arch/arm/utee_syscalls_a64.S
@@ -42,5 +42,12 @@
END_FUNC \name
.endm
+ FUNC utee_panic, :
+ stp x29, x30, [sp, #-16]!
+ mov x1, sp
+ bl __utee_panic
+ /* Not reached */
+ END_FUNC utee_panic
+
#include "utee_syscalls_asm.S"
diff --git a/lib/libutee/arch/arm/utee_syscalls_asm.S b/lib/libutee/arch/arm/utee_syscalls_asm.S
index 7148daa9..8d525dcb 100644
--- a/lib/libutee/arch/arm/utee_syscalls_asm.S
+++ b/lib/libutee/arch/arm/utee_syscalls_asm.S
@@ -31,7 +31,7 @@
UTEE_SYSCALL utee_log, TEE_SCN_LOG, 2
- UTEE_SYSCALL utee_panic, TEE_SCN_PANIC, 1
+ UTEE_SYSCALL __utee_panic, TEE_SCN_PANIC, 2
UTEE_SYSCALL utee_get_property, TEE_SCN_GET_PROPERTY, 7
diff --git a/lib/libutee/assert.c b/lib/libutee/assert.c
index f0144e37..2cb10726 100644
--- a/lib/libutee/assert.c
+++ b/lib/libutee/assert.c
@@ -44,4 +44,7 @@ void _assert_log(const char *expr __maybe_unused,
void __noreturn _assert_break(void)
{
utee_panic(TEE_ERROR_GENERIC);
+ /* Not reached */
+ while (1)
+ ;
}
diff --git a/lib/libutee/include/tee_api.h b/lib/libutee/include/tee_api.h
index f6423678..28cdf429 100644
--- a/lib/libutee/include/tee_api.h
+++ b/lib/libutee/include/tee_api.h
@@ -33,9 +33,7 @@
#include <compiler.h>
#include <tee_api_defines.h>
#include <tee_api_types.h>
-#if defined(CFG_TEE_PANIC_DEBUG)
#include <trace.h>
-#endif
/* Property access functions */
@@ -75,14 +73,7 @@ TEE_Result TEE_GetNextProperty(TEE_PropSetHandle enumerator);
/* System API - Misc */
-void __TEE_Panic(TEE_Result panicCode);
void TEE_Panic(TEE_Result panicCode);
-#if defined(CFG_TEE_PANIC_DEBUG)
-#define TEE_Panic(c) do { \
- EMSG("Panic 0x%x", (c)); \
- __TEE_Panic(c); \
- } while (0)
-#endif
/* System API - Internal Client API */
diff --git a/lib/libutee/include/utee_syscalls.h b/lib/libutee/include/utee_syscalls.h
index 42f7a62f..ed518a04 100644
--- a/lib/libutee/include/utee_syscalls.h
+++ b/lib/libutee/include/utee_syscalls.h
@@ -55,7 +55,8 @@ void utee_return(unsigned long ret) __noreturn;
void utee_log(const void *buf, size_t len);
-void utee_panic(unsigned long code) __noreturn;
+/* This is not __noreturn because AArch32 stack unwinding fails otherwise */
+void utee_panic(unsigned long code);
/* prop_set is TEE_PROPSET_xxx*/
TEE_Result utee_get_property(unsigned long prop_set, unsigned long index,
diff --git a/lib/libutee/tee_api_panic.c b/lib/libutee/tee_api_panic.c
index f3845db0..85366714 100644
--- a/lib/libutee/tee_api_panic.c
+++ b/lib/libutee/tee_api_panic.c
@@ -27,17 +27,9 @@
#include <tee_api.h>
#include <utee_syscalls.h>
-#undef TEE_Panic
-
/* System API - Misc */
-void __noreturn __TEE_Panic(TEE_Result panicCode)
+void TEE_Panic(TEE_Result panicCode)
{
utee_panic(panicCode);
}
-
-void __noreturn TEE_Panic(TEE_Result panicCode)
-{
- __TEE_Panic(panicCode);
-}
-