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 9*65137432SJens Wiklander #include <types_ext.h> 107509ff7cSJens Wiklander #include <tee_api_types.h> 117509ff7cSJens Wiklander 127509ff7cSJens Wiklander /* Size of stack for TEE Core to allocate */ 137509ff7cSJens Wiklander #define LDELF_STACK_SIZE (4096 * 2) 147509ff7cSJens Wiklander 157509ff7cSJens Wiklander /* 167509ff7cSJens Wiklander * struct ldelf_arg - argument for ldelf 177509ff7cSJens Wiklander * @uuid: [in] UUID of TA to load 187509ff7cSJens Wiklander * @is_32bit: [out] 1 if a 32bit TA or 0 if a 64bit TA 197509ff7cSJens Wiklander * @flags: [out] Flags field of TA header 207509ff7cSJens Wiklander * @entry_func: [out] TA entry function 217509ff7cSJens Wiklander * @stack_ptr: [out] TA stack pointer 22*65137432SJens Wiklander * @dump_entry: [out] Dump TA mappings and stack trace 237509ff7cSJens Wiklander */ 247509ff7cSJens Wiklander struct ldelf_arg { 257509ff7cSJens Wiklander TEE_UUID uuid; 267509ff7cSJens Wiklander uint32_t is_32bit; 277509ff7cSJens Wiklander uint32_t flags; 287509ff7cSJens Wiklander uint64_t entry_func; 297509ff7cSJens Wiklander uint64_t stack_ptr; 30*65137432SJens Wiklander uint64_t dump_entry; 31*65137432SJens Wiklander }; 32*65137432SJens Wiklander 33*65137432SJens Wiklander #define DUMP_MAP_READ BIT(0) 34*65137432SJens Wiklander #define DUMP_MAP_WRITE BIT(1) 35*65137432SJens Wiklander #define DUMP_MAP_EXEC BIT(2) 36*65137432SJens Wiklander #define DUMP_MAP_SECURE BIT(3) 37*65137432SJens Wiklander #define DUMP_MAP_EPHEM BIT(4) 38*65137432SJens Wiklander #define DUMP_MAP_LDELF BIT(7) 39*65137432SJens Wiklander 40*65137432SJens Wiklander /* 41*65137432SJens Wiklander * struct dump_entry_arg - argument for ldelf_dump() 42*65137432SJens Wiklander */ 43*65137432SJens Wiklander struct dump_entry_arg { 44*65137432SJens Wiklander union { 45*65137432SJens Wiklander struct { 46*65137432SJens Wiklander uint32_t regs[16]; 47*65137432SJens Wiklander } arm32; 48*65137432SJens Wiklander struct { 49*65137432SJens Wiklander uint64_t fp; 50*65137432SJens Wiklander uint64_t sp; 51*65137432SJens Wiklander uint64_t pc; 52*65137432SJens Wiklander } arm64; 53*65137432SJens Wiklander }; 54*65137432SJens Wiklander bool is_arm32; 55*65137432SJens Wiklander size_t num_maps; 56*65137432SJens Wiklander struct dump_map { 57*65137432SJens Wiklander vaddr_t va; 58*65137432SJens Wiklander paddr_t pa; 59*65137432SJens Wiklander size_t sz; 60*65137432SJens Wiklander uint32_t flags; 61*65137432SJens Wiklander } maps[]; 627509ff7cSJens Wiklander }; 637509ff7cSJens Wiklander 647509ff7cSJens Wiklander /* 657509ff7cSJens Wiklander * ldelf is loaded into memory by TEE Core. BSS is initialized and a 667509ff7cSJens Wiklander * stack is allocated and supplied in SP register. A struct ldelf_arg 677509ff7cSJens Wiklander * is placed in the stack and a pointer to the struct is provided in 687509ff7cSJens Wiklander * r0/x0. 697509ff7cSJens Wiklander * 707509ff7cSJens Wiklander * ldelf relocates itself to the address where it is loaded before the main 717509ff7cSJens Wiklander * C routine is called. 727509ff7cSJens Wiklander * 737509ff7cSJens Wiklander * In the main C routine the TA is loaded using the PTA System interface. 747509ff7cSJens Wiklander */ 757509ff7cSJens Wiklander 767509ff7cSJens Wiklander #endif /*__LDELF_H*/ 77