1*7509ff7cSJens Wiklander // SPDX-License-Identifier: BSD-2-Clause 2*7509ff7cSJens Wiklander /* 3*7509ff7cSJens Wiklander * Copyright (c) 2019, Linaro Limited 4*7509ff7cSJens Wiklander */ 5*7509ff7cSJens Wiklander 6*7509ff7cSJens Wiklander #include <ldelf.h> 7*7509ff7cSJens Wiklander #include <malloc.h> 8*7509ff7cSJens Wiklander #include <sys/queue.h> 9*7509ff7cSJens Wiklander #include <tee_api_types.h> 10*7509ff7cSJens Wiklander #include <trace.h> 11*7509ff7cSJens Wiklander #include <types_ext.h> 12*7509ff7cSJens Wiklander 13*7509ff7cSJens Wiklander #include "ta_elf.h" 14*7509ff7cSJens Wiklander #include "sys.h" 15*7509ff7cSJens Wiklander 16*7509ff7cSJens Wiklander static size_t mpool_size = 2 * SMALL_PAGE_SIZE; 17*7509ff7cSJens Wiklander static vaddr_t mpool_base; 18*7509ff7cSJens Wiklander 19*7509ff7cSJens Wiklander /* 20*7509ff7cSJens Wiklander * ldelf()- Loads ELF into memory 21*7509ff7cSJens Wiklander * @arg: Argument passing to/from TEE Core 22*7509ff7cSJens Wiklander * 23*7509ff7cSJens Wiklander * Only called from assembly 24*7509ff7cSJens Wiklander */ 25*7509ff7cSJens Wiklander void __noreturn ldelf(struct ldelf_arg *arg); 26*7509ff7cSJens Wiklander void ldelf(struct ldelf_arg *arg) 27*7509ff7cSJens Wiklander { 28*7509ff7cSJens Wiklander TEE_Result res = TEE_SUCCESS; 29*7509ff7cSJens Wiklander struct ta_elf *elf = NULL; 30*7509ff7cSJens Wiklander 31*7509ff7cSJens Wiklander DMSG("Loading TA %pUl", (void *)&arg->uuid); 32*7509ff7cSJens Wiklander res = sys_map_zi(mpool_size, 0, &mpool_base, 0, 0); 33*7509ff7cSJens Wiklander if (res) { 34*7509ff7cSJens Wiklander EMSG("sys_map_zi(%zu): result %"PRIx32, mpool_size, res); 35*7509ff7cSJens Wiklander panic(); 36*7509ff7cSJens Wiklander } 37*7509ff7cSJens Wiklander malloc_add_pool((void *)mpool_base, mpool_size); 38*7509ff7cSJens Wiklander 39*7509ff7cSJens Wiklander /* Load the main binary and get a list of dependencies, if any. */ 40*7509ff7cSJens Wiklander ta_elf_load_main(&arg->uuid, &arg->is_32bit, &arg->entry_func, 41*7509ff7cSJens Wiklander &arg->stack_ptr, &arg->flags); 42*7509ff7cSJens Wiklander 43*7509ff7cSJens Wiklander /* 44*7509ff7cSJens Wiklander * Load binaries, ta_elf_load() may add external libraries to the 45*7509ff7cSJens Wiklander * list, so the loop will end when all the dependencies are 46*7509ff7cSJens Wiklander * satisfied. 47*7509ff7cSJens Wiklander */ 48*7509ff7cSJens Wiklander TAILQ_FOREACH(elf, &main_elf_queue, link) 49*7509ff7cSJens Wiklander ta_elf_load_dependency(elf, arg->is_32bit); 50*7509ff7cSJens Wiklander 51*7509ff7cSJens Wiklander TAILQ_FOREACH(elf, &main_elf_queue, link) { 52*7509ff7cSJens Wiklander ta_elf_relocate(elf); 53*7509ff7cSJens Wiklander ta_elf_finalize_mappings(elf); 54*7509ff7cSJens Wiklander } 55*7509ff7cSJens Wiklander 56*7509ff7cSJens Wiklander TAILQ_FOREACH(elf, &main_elf_queue, link) 57*7509ff7cSJens Wiklander DMSG("ELF (%pUl) at %#"PRIxVA, 58*7509ff7cSJens Wiklander (void *)&elf->uuid, elf->load_addr); 59*7509ff7cSJens Wiklander 60*7509ff7cSJens Wiklander res = sys_unmap(mpool_base, mpool_size); 61*7509ff7cSJens Wiklander if (res) { 62*7509ff7cSJens Wiklander EMSG("sys_unmap(%p, %zu): result %"PRIx32, 63*7509ff7cSJens Wiklander (void *)mpool_base, mpool_size, res); 64*7509ff7cSJens Wiklander panic(); 65*7509ff7cSJens Wiklander } 66*7509ff7cSJens Wiklander sys_return_cleanup(); 67*7509ff7cSJens Wiklander } 68