1ebef121cSJerome Forissier // SPDX-License-Identifier: BSD-2-Clause 2ebef121cSJerome Forissier /* 3ebef121cSJerome Forissier * Copyright (c) 2019, Linaro Limited 4ebef121cSJerome Forissier */ 5ebef121cSJerome Forissier #include <ldelf.h> 6ebef121cSJerome Forissier #include <string.h> 7ebef121cSJerome Forissier 8ebef121cSJerome Forissier #include "dl.h" 9ebef121cSJerome Forissier #include "ta_elf.h" 10ebef121cSJerome Forissier dlopen_entry(struct dl_entry_arg * arg)11ebef121cSJerome ForissierTEE_Result dlopen_entry(struct dl_entry_arg *arg) 12ebef121cSJerome Forissier { 13ebef121cSJerome Forissier TEE_UUID zero = { }; 14ebef121cSJerome Forissier 15ebef121cSJerome Forissier if (arg->dlopen.flags != (RTLD_NOW | RTLD_GLOBAL | RTLD_NODELETE)) 16ebef121cSJerome Forissier return TEE_ERROR_BAD_PARAMETERS; 17ebef121cSJerome Forissier 18ebef121cSJerome Forissier if (!memcmp(&arg->dlopen.uuid, &zero, sizeof(zero))) 19ebef121cSJerome Forissier return TEE_SUCCESS; 20ebef121cSJerome Forissier 21ebef121cSJerome Forissier return ta_elf_add_library(&arg->dlopen.uuid); 22ebef121cSJerome Forissier } 23ebef121cSJerome Forissier dlsym_entry(struct dl_entry_arg * arg)24ebef121cSJerome ForissierTEE_Result dlsym_entry(struct dl_entry_arg *arg) 25ebef121cSJerome Forissier { 26ebef121cSJerome Forissier struct ta_elf *elf = NULL; 27ebef121cSJerome Forissier TEE_UUID zero = { }; 28ebef121cSJerome Forissier 29ebef121cSJerome Forissier if (memcmp(&arg->dlsym.uuid, &zero, sizeof(zero))) { 30ebef121cSJerome Forissier elf = ta_elf_find_elf(&arg->dlsym.uuid); 31ebef121cSJerome Forissier if (!elf) 32ebef121cSJerome Forissier return TEE_ERROR_ITEM_NOT_FOUND; 33ebef121cSJerome Forissier } 34ebef121cSJerome Forissier 35*c88ba125SJerome Forissier return ta_elf_resolve_sym(arg->dlsym.symbol, &arg->dlsym.val, NULL, 36*c88ba125SJerome Forissier elf); 37ebef121cSJerome Forissier } 38ebef121cSJerome Forissier 39