blob: ad73b464ebe074ed5a38a687b7981e2b234158af [file] [log] [blame]
// SPDX-License-Identifier: BSD-2-Clause
/*
* Copyright (c) 2014, STMicroelectronics International N.V.
*/
#include <compiler.h>
#include <tee_ta_api.h>
#include <tee_internal_api_extensions.h>
#include <trace.h>
#include <user_ta_header.h>
#include <user_ta_header_defines.h>
#include <utee_syscalls.h>
int trace_level = TRACE_LEVEL;
const char trace_ext_prefix[] = "TA";
#ifndef TA_VERSION
#define TA_VERSION "Undefined version"
#endif
#ifndef TA_DESCRIPTION
#define TA_DESCRIPTION "Undefined description"
#endif
/* exprted to user_ta_header.c, built within TA */
struct utee_params;
#ifdef ARM32
#define _C_FUNCTION(name) name##_c
#else
#define _C_FUNCTION(name) name
#endif /* ARM32 */
/* From libutee */
TEE_Result __utee_entry(unsigned long func, unsigned long session_id,
struct utee_params *up, unsigned long cmd_id);
void __noreturn _C_FUNCTION(__ta_entry)(unsigned long func,
unsigned long session_id,
struct utee_params *up,
unsigned long cmd_id);
void __noreturn _C_FUNCTION(__ta_entry)(unsigned long func,
unsigned long session_id,
struct utee_params *up,
unsigned long cmd_id)
{
TEE_Result res = __utee_entry(func, session_id, up, cmd_id);
#if defined(CFG_FTRACE_SUPPORT)
/*
* __ta_entry is the first TA API called from TEE core. As it being
* __noreturn API, we need to call ftrace_return in this API just
* before utee_return syscall to get proper ftrace call graph.
*/
ftrace_return();
#endif
utee_return(res);
}
/*
* According to GP Internal API, TA_STACK_SIZE corresponds to the stack
* size used by the TA code itself and does not include stack space
* possibly used by the Trusted Core Framework.
* Hence, stack_size which is the size of the stack to use,
* must be enlarged
* It has been set to 2048 to include trace framework and invoke commands
*/
#define TA_FRAMEWORK_STACK_SIZE 2048
const struct ta_head ta_head __section(".ta_head") = {
/* UUID, unique to each TA */
.uuid = TA_UUID,
/*
* According to GP Internal API, TA_FRAMEWORK_STACK_SIZE corresponds to
* the stack size used by the TA code itself and does not include stack
* space possibly used by the Trusted Core Framework.
* Hence, stack_size which is the size of the stack to use,
* must be enlarged
*/
.stack_size = TA_STACK_SIZE + TA_FRAMEWORK_STACK_SIZE,
.flags = TA_FLAGS,
/*
* The TA entry doesn't go via this field any longer, to be able to
* reliably check that an old TA isn't loaded set this field to a
* fixed value.
*/
.depr_entry = UINT64_MAX,
};
/* Keeping the heap in bss */
uint8_t ta_heap[TA_DATA_SIZE];
const size_t ta_heap_size = sizeof(ta_heap);
const struct user_ta_property ta_props[] = {
{TA_PROP_STR_SINGLE_INSTANCE, USER_TA_PROP_TYPE_BOOL,
&(const bool){(TA_FLAGS & TA_FLAG_SINGLE_INSTANCE) != 0}},
{TA_PROP_STR_MULTI_SESSION, USER_TA_PROP_TYPE_BOOL,
&(const bool){(TA_FLAGS & TA_FLAG_MULTI_SESSION) != 0}},
{TA_PROP_STR_KEEP_ALIVE, USER_TA_PROP_TYPE_BOOL,
&(const bool){(TA_FLAGS & TA_FLAG_INSTANCE_KEEP_ALIVE) != 0}},
{TA_PROP_STR_DATA_SIZE, USER_TA_PROP_TYPE_U32,
&(const uint32_t){TA_DATA_SIZE}},
{TA_PROP_STR_STACK_SIZE, USER_TA_PROP_TYPE_U32,
&(const uint32_t){TA_STACK_SIZE}},
{TA_PROP_STR_VERSION, USER_TA_PROP_TYPE_STRING,
TA_VERSION},
{TA_PROP_STR_DESCRIPTION, USER_TA_PROP_TYPE_STRING,
TA_DESCRIPTION},
/*
* Extended propietary properties, name of properties must not begin with
* "gpd."
*/
#ifdef TA_CURRENT_TA_EXT_PROPERTIES
TA_CURRENT_TA_EXT_PROPERTIES
#endif
};
const size_t ta_num_props = sizeof(ta_props) / sizeof(ta_props[0]);
#ifdef CFG_FTRACE_SUPPORT
struct __ftrace_info __ftrace_info = {
#ifdef __ILP32__
.buf_start.ptr32 = { .lo = (uint32_t)&__ftrace_buf_start },
.buf_end.ptr32 = { .lo = (uint32_t)__ftrace_buf_end },
.ret_ptr.ptr32 = { .lo = (uint32_t)&__ftrace_return },
#else
.buf_start.ptr64 = (uint64_t)&__ftrace_buf_start,
.buf_end.ptr64 = (uint64_t)__ftrace_buf_end,
.ret_ptr.ptr64 = (uint64_t)&__ftrace_return,
#endif
};
#endif
int tahead_get_trace_level(void)
{
/*
* Store trace level in TA head structure, as ta_head.prop_tracelevel
*/
return TRACE_LEVEL;
}