aboutsummaryrefslogtreecommitdiff
path: root/lib/libutee/arch/arm/user_ta_entry.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libutee/arch/arm/user_ta_entry.c')
-rw-r--r--lib/libutee/arch/arm/user_ta_entry.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/lib/libutee/arch/arm/user_ta_entry.c b/lib/libutee/arch/arm/user_ta_entry.c
index 41ff4d8e..b317bb30 100644
--- a/lib/libutee/arch/arm/user_ta_entry.c
+++ b/lib/libutee/arch/arm/user_ta_entry.c
@@ -33,6 +33,42 @@ extern struct ta_head ta_head;
uint32_t ta_param_types;
TEE_Param ta_params[TEE_NUM_PARAMS];
+struct __init_fini_info __init_fini_info;
+
+void __utee_call_elf_init_fn(void)
+{
+ size_t n = __init_fini_info.size;
+ size_t i = 0;
+ size_t j = 0;
+
+ for (i = 1; i <= n; i++) {
+ /* Reverse order: dependencies first */
+ struct __init_fini *ifs = &__init_fini_info.ifs[n - i];
+
+ if (!(ifs->flags & __IFS_INIT_HAS_RUN))
+ for (j = 0; j < ifs->init_size; j++)
+ ifs->init[j]();
+
+ ifs->flags |= __IFS_INIT_HAS_RUN;
+ }
+}
+
+void __utee_call_elf_fini_fn(void)
+{
+ size_t n = __init_fini_info.size;
+ size_t i = 0;
+ size_t j = 0;
+
+ for (i = 0; i < n; i++) {
+ struct __init_fini *ifs = &__init_fini_info.ifs[i];
+
+ if (!(ifs->flags & __IFS_FINI_HAS_RUN))
+ for (j = 1; j <= ifs->fini_size; j++)
+ ifs->fini[ifs->fini_size - j]();
+
+ ifs->flags |= __IFS_FINI_HAS_RUN;
+ }
+}
static TEE_Result init_instance(void)
{
@@ -40,6 +76,7 @@ static TEE_Result init_instance(void)
__utee_gprof_init();
malloc_add_pool(ta_heap, ta_heap_size);
_TEE_MathAPI_Init();
+ __utee_call_elf_init_fn();
return TA_CreateEntryPoint();
}
@@ -47,6 +84,7 @@ static void uninit_instance(void)
{
__utee_gprof_fini();
TA_DestroyEntryPoint();
+ __utee_call_elf_fini_fn();
}
static void ta_header_save_params(uint32_t param_types,