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(