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);