hc
2023-02-13 e440ec23c5a540cdd3f7464e8779219be6fd3d95
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
// 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;
}