diff options
author | Jerome Forissier <jerome.forissier@linaro.org> | 2017-09-29 13:58:27 -0700 |
---|---|---|
committer | Jérôme Forissier <jerome.forissier@linaro.org> | 2017-10-06 10:12:12 -0700 |
commit | 0e1c6e8e35c64fde0c31a34a68ca349240604c86 (patch) | |
tree | f7c49b031015cb4486e8cc258b84e515306dc27a /lib/libutee | |
parent | 821a8785727575b3c98357155a132664082462b6 (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.c | 3 | ||||
-rw-r--r-- | lib/libutee/arch/arm/utee_syscalls_a32.S | 13 | ||||
-rw-r--r-- | lib/libutee/arch/arm/utee_syscalls_a64.S | 7 | ||||
-rw-r--r-- | lib/libutee/arch/arm/utee_syscalls_asm.S | 2 | ||||
-rw-r--r-- | lib/libutee/assert.c | 3 | ||||
-rw-r--r-- | lib/libutee/include/tee_api.h | 9 | ||||
-rw-r--r-- | lib/libutee/include/utee_syscalls.h | 3 | ||||
-rw-r--r-- | lib/libutee/tee_api_panic.c | 10 |
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); -} - |