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