17509ff7cSJens Wiklander /* SPDX-License-Identifier: BSD-2-Clause */ 27509ff7cSJens Wiklander /* 37509ff7cSJens Wiklander * Copyright (c) 2019, Linaro Limited 47509ff7cSJens Wiklander */ 57509ff7cSJens Wiklander 67509ff7cSJens Wiklander #ifndef __LDELF_H 77509ff7cSJens Wiklander #define __LDELF_H 87509ff7cSJens Wiklander 965137432SJens Wiklander #include <types_ext.h> 107509ff7cSJens Wiklander #include <tee_api_types.h> 11f90488afSSumit Garg #include <user_ta_header.h> 127509ff7cSJens Wiklander 137509ff7cSJens Wiklander /* Size of stack for TEE Core to allocate */ 147509ff7cSJens Wiklander #define LDELF_STACK_SIZE (4096 * 2) 157509ff7cSJens Wiklander 167509ff7cSJens Wiklander /* 177509ff7cSJens Wiklander * struct ldelf_arg - argument for ldelf 187509ff7cSJens Wiklander * @uuid: [in] UUID of TA to load 197509ff7cSJens Wiklander * @is_32bit: [out] 1 if a 32bit TA or 0 if a 64bit TA 207509ff7cSJens Wiklander * @flags: [out] Flags field of TA header 217509ff7cSJens Wiklander * @entry_func: [out] TA entry function 227509ff7cSJens Wiklander * @stack_ptr: [out] TA stack pointer 2365137432SJens Wiklander * @dump_entry: [out] Dump TA mappings and stack trace 24c86f218cSJens Wiklander * @ftrace_entry: [out] Dump TA mappings and ftrace buffer 25f90488afSSumit Garg * @fbuf: [out] ftrace buffer pointer 26*ebef121cSJerome Forissier * @dl_entry: [out] Dynamic linking interface (for libdl) 277509ff7cSJens Wiklander */ 287509ff7cSJens Wiklander struct ldelf_arg { 297509ff7cSJens Wiklander TEE_UUID uuid; 307509ff7cSJens Wiklander uint32_t is_32bit; 317509ff7cSJens Wiklander uint32_t flags; 327509ff7cSJens Wiklander uint64_t entry_func; 337509ff7cSJens Wiklander uint64_t stack_ptr; 3465137432SJens Wiklander uint64_t dump_entry; 35c86f218cSJens Wiklander uint64_t ftrace_entry; 36*ebef121cSJerome Forissier uint64_t dl_entry; 37f90488afSSumit Garg struct ftrace_buf *fbuf; 3865137432SJens Wiklander }; 3965137432SJens Wiklander 4065137432SJens Wiklander #define DUMP_MAP_READ BIT(0) 4165137432SJens Wiklander #define DUMP_MAP_WRITE BIT(1) 4265137432SJens Wiklander #define DUMP_MAP_EXEC BIT(2) 4365137432SJens Wiklander #define DUMP_MAP_SECURE BIT(3) 4465137432SJens Wiklander #define DUMP_MAP_EPHEM BIT(4) 4565137432SJens Wiklander #define DUMP_MAP_LDELF BIT(7) 4665137432SJens Wiklander 4765137432SJens Wiklander /* 489aed8c32SJerome Forissier * struct dump_entry_arg - argument for ldelf_arg::dump_entry() 4965137432SJens Wiklander */ 5065137432SJens Wiklander struct dump_entry_arg { 5165137432SJens Wiklander union { 5265137432SJens Wiklander struct { 5365137432SJens Wiklander uint32_t regs[16]; 5465137432SJens Wiklander } arm32; 5565137432SJens Wiklander struct { 5665137432SJens Wiklander uint64_t fp; 5765137432SJens Wiklander uint64_t sp; 5865137432SJens Wiklander uint64_t pc; 5965137432SJens Wiklander } arm64; 6065137432SJens Wiklander }; 6165137432SJens Wiklander bool is_arm32; 6265137432SJens Wiklander size_t num_maps; 6365137432SJens Wiklander struct dump_map { 6465137432SJens Wiklander vaddr_t va; 6565137432SJens Wiklander paddr_t pa; 6665137432SJens Wiklander size_t sz; 6765137432SJens Wiklander uint32_t flags; 6865137432SJens Wiklander } maps[]; 697509ff7cSJens Wiklander }; 707509ff7cSJens Wiklander 717509ff7cSJens Wiklander /* 72*ebef121cSJerome Forissier * struct dl_entry_arg - argument for ldelf_arg::dl_entry() 73*ebef121cSJerome Forissier */ 74*ebef121cSJerome Forissier struct dl_entry_arg { 75*ebef121cSJerome Forissier uint32_t cmd; 76*ebef121cSJerome Forissier TEE_Result ret; 77*ebef121cSJerome Forissier union { 78*ebef121cSJerome Forissier struct { 79*ebef121cSJerome Forissier TEE_UUID uuid; /* in */ 80*ebef121cSJerome Forissier uint32_t flags; /* in */ 81*ebef121cSJerome Forissier } dlopen; 82*ebef121cSJerome Forissier struct { 83*ebef121cSJerome Forissier TEE_UUID uuid; /* in */ 84*ebef121cSJerome Forissier vaddr_t val; /* out */ 85*ebef121cSJerome Forissier char symbol[]; /* in */ 86*ebef121cSJerome Forissier } dlsym; 87*ebef121cSJerome Forissier }; 88*ebef121cSJerome Forissier }; 89*ebef121cSJerome Forissier 90*ebef121cSJerome Forissier /* 91*ebef121cSJerome Forissier * Values for dl_entry_arg::cmd 92*ebef121cSJerome Forissier */ 93*ebef121cSJerome Forissier #define LDELF_DL_ENTRY_DLOPEN 0 94*ebef121cSJerome Forissier #define LDELF_DL_ENTRY_DLSYM 1 95*ebef121cSJerome Forissier 96*ebef121cSJerome Forissier /* 97*ebef121cSJerome Forissier * Values for dl_entry_arg::dlopen::flags 98*ebef121cSJerome Forissier */ 99*ebef121cSJerome Forissier #define RTLD_NOW 2 100*ebef121cSJerome Forissier #define RTLD_GLOBAL 0x100 101*ebef121cSJerome Forissier #define RTLD_NODELETE 0x1000 102*ebef121cSJerome Forissier 103*ebef121cSJerome Forissier /* 1047509ff7cSJens Wiklander * ldelf is loaded into memory by TEE Core. BSS is initialized and a 1057509ff7cSJens Wiklander * stack is allocated and supplied in SP register. A struct ldelf_arg 1067509ff7cSJens Wiklander * is placed in the stack and a pointer to the struct is provided in 1077509ff7cSJens Wiklander * r0/x0. 1087509ff7cSJens Wiklander * 1097509ff7cSJens Wiklander * ldelf relocates itself to the address where it is loaded before the main 1107509ff7cSJens Wiklander * C routine is called. 1117509ff7cSJens Wiklander * 1127509ff7cSJens Wiklander * In the main C routine the TA is loaded using the PTA System interface. 1137509ff7cSJens Wiklander */ 1147509ff7cSJens Wiklander 1157509ff7cSJens Wiklander #endif /*__LDELF_H*/ 116