17509ff7cSJens Wiklander /* SPDX-License-Identifier: BSD-2-Clause */ 27509ff7cSJens Wiklander /* 37509ff7cSJens Wiklander * Copyright (c) 2019, Linaro Limited 4*af78e1b1SImre Kis * Copyright (c) 2020-2023, Arm Limited 574f6dd9bSMarouene Boubakri * Copyright 2022-2023 NXP 67509ff7cSJens Wiklander */ 77509ff7cSJens Wiklander 87509ff7cSJens Wiklander #ifndef __LDELF_H 97509ff7cSJens Wiklander #define __LDELF_H 107509ff7cSJens Wiklander 11baa5161dSBalint Dobszay #ifndef __ASSEMBLER__ 1265137432SJens Wiklander #include <types_ext.h> 137509ff7cSJens Wiklander #include <tee_api_types.h> 14f90488afSSumit Garg #include <user_ta_header.h> 157509ff7cSJens Wiklander 167509ff7cSJens Wiklander /* Size of stack for TEE Core to allocate */ 177509ff7cSJens Wiklander #define LDELF_STACK_SIZE (4096 * 2) 187509ff7cSJens Wiklander 197509ff7cSJens Wiklander /* 207509ff7cSJens Wiklander * struct ldelf_arg - argument for ldelf 217509ff7cSJens Wiklander * @uuid: [in] UUID of TA to load 227509ff7cSJens Wiklander * @is_32bit: [out] 1 if a 32bit TA or 0 if a 64bit TA 237509ff7cSJens Wiklander * @flags: [out] Flags field of TA header 247509ff7cSJens Wiklander * @entry_func: [out] TA entry function 257509ff7cSJens Wiklander * @stack_ptr: [out] TA stack pointer 2665137432SJens Wiklander * @dump_entry: [out] Dump TA mappings and stack trace 27c86f218cSJens Wiklander * @ftrace_entry: [out] Dump TA mappings and ftrace buffer 28f90488afSSumit Garg * @fbuf: [out] ftrace buffer pointer 29ebef121cSJerome Forissier * @dl_entry: [out] Dynamic linking interface (for libdl) 307509ff7cSJens Wiklander */ 317509ff7cSJens Wiklander struct ldelf_arg { 327509ff7cSJens Wiklander TEE_UUID uuid; 337509ff7cSJens Wiklander uint32_t is_32bit; 347509ff7cSJens Wiklander uint32_t flags; 357509ff7cSJens Wiklander uint64_t entry_func; 36*af78e1b1SImre Kis uint64_t load_addr; 377509ff7cSJens Wiklander uint64_t stack_ptr; 3865137432SJens Wiklander uint64_t dump_entry; 39c86f218cSJens Wiklander uint64_t ftrace_entry; 40ebef121cSJerome Forissier uint64_t dl_entry; 41f90488afSSumit Garg struct ftrace_buf *fbuf; 4265137432SJens Wiklander }; 4365137432SJens Wiklander 4465137432SJens Wiklander #define DUMP_MAP_READ BIT(0) 4565137432SJens Wiklander #define DUMP_MAP_WRITE BIT(1) 4665137432SJens Wiklander #define DUMP_MAP_EXEC BIT(2) 4765137432SJens Wiklander #define DUMP_MAP_SECURE BIT(3) 4865137432SJens Wiklander #define DUMP_MAP_EPHEM BIT(4) 4965137432SJens Wiklander #define DUMP_MAP_LDELF BIT(7) 5065137432SJens Wiklander 5165137432SJens Wiklander /* 529aed8c32SJerome Forissier * struct dump_entry_arg - argument for ldelf_arg::dump_entry() 5365137432SJens Wiklander */ 5465137432SJens Wiklander struct dump_entry_arg { 5565137432SJens Wiklander union { 5665137432SJens Wiklander struct { 5765137432SJens Wiklander uint32_t regs[16]; 5865137432SJens Wiklander } arm32; 5965137432SJens Wiklander struct { 6065137432SJens Wiklander uint64_t fp; 6165137432SJens Wiklander uint64_t sp; 6265137432SJens Wiklander uint64_t pc; 6365137432SJens Wiklander } arm64; 6474f6dd9bSMarouene Boubakri struct { 6574f6dd9bSMarouene Boubakri unsigned long fp; 6674f6dd9bSMarouene Boubakri unsigned long sp; 6774f6dd9bSMarouene Boubakri unsigned long pc; 6874f6dd9bSMarouene Boubakri } rv; 6965137432SJens Wiklander }; 70cb5f271cSMarouene Boubakri bool is_32bit; 7165137432SJens Wiklander size_t num_maps; 7265137432SJens Wiklander struct dump_map { 7365137432SJens Wiklander vaddr_t va; 7465137432SJens Wiklander paddr_t pa; 7565137432SJens Wiklander size_t sz; 7665137432SJens Wiklander uint32_t flags; 7765137432SJens Wiklander } maps[]; 787509ff7cSJens Wiklander }; 797509ff7cSJens Wiklander 807509ff7cSJens Wiklander /* 81ebef121cSJerome Forissier * struct dl_entry_arg - argument for ldelf_arg::dl_entry() 82ebef121cSJerome Forissier */ 83ebef121cSJerome Forissier struct dl_entry_arg { 84ebef121cSJerome Forissier uint32_t cmd; 85ebef121cSJerome Forissier TEE_Result ret; 86ebef121cSJerome Forissier union { 87ebef121cSJerome Forissier struct { 88ebef121cSJerome Forissier TEE_UUID uuid; /* in */ 89ebef121cSJerome Forissier uint32_t flags; /* in */ 90ebef121cSJerome Forissier } dlopen; 91ebef121cSJerome Forissier struct { 92ebef121cSJerome Forissier TEE_UUID uuid; /* in */ 93ebef121cSJerome Forissier vaddr_t val; /* out */ 94ebef121cSJerome Forissier char symbol[]; /* in */ 95ebef121cSJerome Forissier } dlsym; 96ebef121cSJerome Forissier }; 97ebef121cSJerome Forissier }; 98ebef121cSJerome Forissier 99ebef121cSJerome Forissier /* 100ebef121cSJerome Forissier * Values for dl_entry_arg::cmd 101ebef121cSJerome Forissier */ 102ebef121cSJerome Forissier #define LDELF_DL_ENTRY_DLOPEN 0 103ebef121cSJerome Forissier #define LDELF_DL_ENTRY_DLSYM 1 104ebef121cSJerome Forissier 105ebef121cSJerome Forissier /* 106ebef121cSJerome Forissier * Values for dl_entry_arg::dlopen::flags 107ebef121cSJerome Forissier */ 108ebef121cSJerome Forissier #define RTLD_NOW 2 109ebef121cSJerome Forissier #define RTLD_GLOBAL 0x100 110ebef121cSJerome Forissier #define RTLD_NODELETE 0x1000 111ebef121cSJerome Forissier 112baa5161dSBalint Dobszay #define LDELF_MAP_FLAG_SHAREABLE BIT32(0) 113baa5161dSBalint Dobszay #define LDELF_MAP_FLAG_WRITEABLE BIT32(1) 114baa5161dSBalint Dobszay #define LDELF_MAP_FLAG_EXECUTABLE BIT32(2) 1150d482f82SRuchika Gupta #define LDELF_MAP_FLAG_BTI BIT32(3) 116baa5161dSBalint Dobszay 117baa5161dSBalint Dobszay #endif /*!__ASSEMBLER__*/ 118baa5161dSBalint Dobszay 119baa5161dSBalint Dobszay #define LDELF_RETURN 0 120baa5161dSBalint Dobszay #define LDELF_LOG 1 121baa5161dSBalint Dobszay #define LDELF_PANIC 2 122baa5161dSBalint Dobszay #define LDELF_MAP_ZI 3 123baa5161dSBalint Dobszay #define LDELF_UNMAP 4 124baa5161dSBalint Dobszay #define LDELF_OPEN_BIN 5 125baa5161dSBalint Dobszay #define LDELF_CLOSE_BIN 6 126baa5161dSBalint Dobszay #define LDELF_MAP_BIN 7 127baa5161dSBalint Dobszay #define LDELF_CP_FROM_BIN 8 128baa5161dSBalint Dobszay #define LDELF_SET_PROT 9 129baa5161dSBalint Dobszay #define LDELF_REMAP 10 130baa5161dSBalint Dobszay #define LDELF_GEN_RND_NUM 11 131baa5161dSBalint Dobszay 132baa5161dSBalint Dobszay #define LDELF_SCN_MAX 11 133baa5161dSBalint Dobszay 134ebef121cSJerome Forissier /* 1357509ff7cSJens Wiklander * ldelf is loaded into memory by TEE Core. BSS is initialized and a 1367509ff7cSJens Wiklander * stack is allocated and supplied in SP register. A struct ldelf_arg 1377509ff7cSJens Wiklander * is placed in the stack and a pointer to the struct is provided in 13874f6dd9bSMarouene Boubakri * r0/x0 on ARM and in a0/x10 on RISC-V. 1397509ff7cSJens Wiklander * 1407509ff7cSJens Wiklander * ldelf relocates itself to the address where it is loaded before the main 1417509ff7cSJens Wiklander * C routine is called. 1427509ff7cSJens Wiklander * 1437509ff7cSJens Wiklander * In the main C routine the TA is loaded using the PTA System interface. 1447509ff7cSJens Wiklander */ 1457509ff7cSJens Wiklander 1467509ff7cSJens Wiklander #endif /*__LDELF_H*/ 147