core: ftrace: dump core load address to support ASLR
Additionally dump core address in ftrace buffer to support syscall
tracing in case TEE core ASLR is enabled.
Signed-off-by: Sumit Garg <sumit.garg@linaro.org>
Reviewed-by: Jerome Forissier <jerome@forissier.org>
[jf: s/Load address @/TEE load address @/]
Signed-off-by: Jerome Forissier <jerome@forissier.org>
diff --git a/core/arch/arm/kernel/unwind_arm32.c b/core/arch/arm/kernel/unwind_arm32.c
index bc7116f..d343539 100644
--- a/core/arch/arm/kernel/unwind_arm32.c
+++ b/core/arch/arm/kernel/unwind_arm32.c
@@ -435,7 +435,7 @@
vaddr_t exidx, size_t exidx_sz,
vaddr_t stack, size_t stack_size)
{
- trace_printf_helper_raw(level, true, "Load address @ %#"PRIxVA,
+ trace_printf_helper_raw(level, true, "TEE load address @ %#"PRIxVA,
VCORE_START_VA);
trace_printf_helper_raw(level, true, "Call stack:");
do {
diff --git a/core/arch/arm/kernel/unwind_arm64.c b/core/arch/arm/kernel/unwind_arm64.c
index 731fc71..5b77502 100644
--- a/core/arch/arm/kernel/unwind_arm64.c
+++ b/core/arch/arm/kernel/unwind_arm64.c
@@ -110,7 +110,7 @@
void print_stack_arm64(int level, struct unwind_state_arm64 *state,
vaddr_t stack, size_t stack_size)
{
- trace_printf_helper_raw(level, true, "Load address @ %#"PRIxVA,
+ trace_printf_helper_raw(level, true, "TEE load address @ %#"PRIxVA,
VCORE_START_VA);
trace_printf_helper_raw(level, true, "Call stack:");
diff --git a/core/arch/arm/kernel/user_ta.c b/core/arch/arm/kernel/user_ta.c
index e07bd68..0672b4a 100644
--- a/core/arch/arm/kernel/user_ta.c
+++ b/core/arch/arm/kernel/user_ta.c
@@ -12,6 +12,7 @@
#include <initcall.h>
#include <keep.h>
#include <kernel/panic.h>
+#include <kernel/linker.h>
#include <kernel/tee_misc.h>
#include <kernel/tee_ta_manager.h>
#include <kernel/thread.h>
@@ -510,14 +511,16 @@
uint8_t *ubuf = NULL;
void *buf = NULL;
size_t pl_sz = 0;
- size_t blen = 0;
+ size_t blen = 0, ld_addr_len = 0;
vaddr_t va = 0;
res = dump_ftrace(utc, NULL, &blen);
if (res != TEE_ERROR_SHORT_BUFFER)
return;
- pl_sz = ROUNDUP(blen + sizeof(TEE_UUID), SMALL_PAGE_SIZE);
+#define LOAD_ADDR_DUMP_SIZE 64
+ pl_sz = ROUNDUP(blen + sizeof(TEE_UUID) + LOAD_ADDR_DUMP_SIZE,
+ SMALL_PAGE_SIZE);
mobj = thread_rpc_alloc_payload(pl_sz);
if (!mobj) {
@@ -537,6 +540,11 @@
memcpy(ubuf, &ctx->uuid, sizeof(TEE_UUID));
ubuf += sizeof(TEE_UUID);
+ ld_addr_len = snprintk((char *)ubuf, LOAD_ADDR_DUMP_SIZE,
+ "TEE load address @ %#"PRIxVA"\n",
+ VCORE_START_VA);
+ ubuf += ld_addr_len;
+
res = dump_ftrace(utc, ubuf, &blen);
if (res) {
EMSG("Ftrace dump failed: %#"PRIx32, res);
@@ -545,7 +553,8 @@
params[0] = THREAD_PARAM_VALUE(INOUT, 0, 0, 0);
params[1] = THREAD_PARAM_MEMREF(IN, mobj, 0, sizeof(TEE_UUID));
- params[2] = THREAD_PARAM_MEMREF(IN, mobj, sizeof(TEE_UUID), blen);
+ params[2] = THREAD_PARAM_MEMREF(IN, mobj, sizeof(TEE_UUID),
+ blen + ld_addr_len);
res = thread_rpc_cmd(OPTEE_RPC_CMD_FTRACE, 3, params);
if (res)
diff --git a/scripts/symbolize.py b/scripts/symbolize.py
index bf2f41c..5208edd 100755
--- a/scripts/symbolize.py
+++ b/scripts/symbolize.py
@@ -15,7 +15,7 @@
import termios
CALL_STACK_RE = re.compile('Call stack:')
-TEE_LOAD_ADDR_RE = re.compile(r'Load address @ (?P<load_addr>0x[0-9a-f]+)')
+TEE_LOAD_ADDR_RE = re.compile(r'TEE load address @ (?P<load_addr>0x[0-9a-f]+)')
# This gets the address from lines looking like this:
# E/TC:0 0x001044a8
STACK_ADDR_RE = re.compile(