ldelf: Provide access to TS load address

Propagate ELF load address from ldelf to user mode context as a
preparation for load address relative memory regions.

Signed-off-by: Imre Kis <imre.kis@arm.com>
Acked-by: Jens Wiklander <jens.wiklander@linaro.org>
diff --git a/core/include/kernel/user_mode_ctx_struct.h b/core/include/kernel/user_mode_ctx_struct.h
index 2fc85e8..e2c7ca0 100644
--- a/core/include/kernel/user_mode_ctx_struct.h
+++ b/core/include/kernel/user_mode_ctx_struct.h
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-2-Clause */
 /*
  * Copyright (c) 2019-2021, Linaro Limited
- * Copyright (c) 2020, Arm Limited
+ * Copyright (c) 2020-2023, Arm Limited
  */
 
 #ifndef __KERNEL_USER_MODE_CTX_STRUCT_H
@@ -41,6 +41,7 @@
 #endif
 	struct ts_ctx *ts_ctx;
 	uaddr_t entry_func;
+	uaddr_t load_addr;
 	uaddr_t dump_entry_func;
 #ifdef CFG_FTRACE_SUPPORT
 	uaddr_t ftrace_entry_func;
diff --git a/core/kernel/ldelf_loader.c b/core/kernel/ldelf_loader.c
index fc4c3c2..cb82e2c 100644
--- a/core/kernel/ldelf_loader.c
+++ b/core/kernel/ldelf_loader.c
@@ -2,7 +2,7 @@
 /*
  * Copyright (c) 2014, STMicroelectronics International N.V.
  * Copyright (c) 2015-2020, 2022 Linaro Limited
- * Copyright (c) 2020-2021, Arm Limited
+ * Copyright (c) 2020-2023, Arm Limited
  */
 
 #include <assert.h>
@@ -152,6 +152,7 @@
 
 	uctx->is_32bit = arg->is_32bit;
 	uctx->entry_func = arg->entry_func;
+	uctx->load_addr = arg->load_addr;
 	uctx->stack_ptr = arg->stack_ptr;
 	uctx->dump_entry_func = arg->dump_entry;
 #ifdef CFG_FTRACE_SUPPORT
diff --git a/ldelf/include/ldelf.h b/ldelf/include/ldelf.h
index 25f1db1..f638400 100644
--- a/ldelf/include/ldelf.h
+++ b/ldelf/include/ldelf.h
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-2-Clause */
 /*
  * Copyright (c) 2019, Linaro Limited
- * Copyright (c) 2020, Arm Limited
+ * Copyright (c) 2020-2023, Arm Limited
  * Copyright 2022-2023 NXP
  */
 
@@ -33,6 +33,7 @@
 	uint32_t is_32bit;
 	uint32_t flags;
 	uint64_t entry_func;
+	uint64_t load_addr;
 	uint64_t stack_ptr;
 	uint64_t dump_entry;
 	uint64_t ftrace_entry;
diff --git a/ldelf/main.c b/ldelf/main.c
index 0a0cff4..1aa9d8c 100644
--- a/ldelf/main.c
+++ b/ldelf/main.c
@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: BSD-2-Clause
 /*
  * Copyright (c) 2019, Linaro Limited
+ * Copyright (c) 2022-2023, Arm Limited
  */
 
 #include <assert.h>
@@ -156,7 +157,7 @@
 		ta_elf_finalize_mappings(elf);
 	}
 
-	ta_elf_finalize_load_main(&arg->entry_func);
+	ta_elf_finalize_load_main(&arg->entry_func, &arg->load_addr);
 
 	arg->ftrace_entry = 0;
 #ifdef CFG_FTRACE_SUPPORT
diff --git a/ldelf/ta_elf.c b/ldelf/ta_elf.c
index 2c81979..3c09569 100644
--- a/ldelf/ta_elf.c
+++ b/ldelf/ta_elf.c
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-2-Clause
 /*
  * Copyright (c) 2019, Linaro Limited
- * Copyright (c) 2020, Arm Limited
+ * Copyright (c) 2020-2023, Arm Limited
  */
 
 #include <assert.h>
@@ -1274,7 +1274,7 @@
 	ta_stack_size = elf->head->stack_size;
 }
 
-void ta_elf_finalize_load_main(uint64_t *entry)
+void ta_elf_finalize_load_main(uint64_t *entry, uint64_t *load_addr)
 {
 	struct ta_elf *elf = TAILQ_FIRST(&main_elf_queue);
 	TEE_Result res = TEE_SUCCESS;
@@ -1292,6 +1292,8 @@
 		*entry = elf->head->depr_entry;
 	else
 		*entry = elf->e_entry + elf->load_addr;
+
+	*load_addr = elf->load_addr;
 }
 
 
diff --git a/ldelf/ta_elf.h b/ldelf/ta_elf.h
index f095c1e..079026b 100644
--- a/ldelf/ta_elf.h
+++ b/ldelf/ta_elf.h
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: BSD-2-Clause */
 /*
  * Copyright (c) 2019, Linaro Limited
+ * Copyright (c) 2022-2023, Arm Limited
  */
 
 #ifndef TA_ELF_H
@@ -121,7 +122,7 @@
 
 void ta_elf_load_main(const TEE_UUID *uuid, uint32_t *is_32bit, uint64_t *sp,
 		      uint32_t *ta_flags);
-void ta_elf_finalize_load_main(uint64_t *entry);
+void ta_elf_finalize_load_main(uint64_t *entry, uint64_t *load_addr);
 void ta_elf_load_dependency(struct ta_elf *elf, bool is_32bit);
 void ta_elf_relocate(struct ta_elf *elf);
 void ta_elf_finalize_mappings(struct ta_elf *elf);