/* * Copyright (c) 2014, STMicroelectronics International N.V. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include int trace_level = TRACE_LEVEL; #ifdef TA_LOG_PREFIX const char trace_ext_prefix[] = TA_LOG_PREFIX; #else const char trace_ext_prefix[] = "USER-TA"; #endif #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; void __utee_entry(unsigned long func, unsigned long session_id, struct utee_params *up, unsigned long cmd_id) __noreturn; const struct ta_head ta_head __section(".ta_head") = { /* UUID, unique to each TA */ .uuid = TA_UUID, .stack_size = TA_STACK_SIZE, .flags = TA_FLAG_USER_MODE | TA_FLAGS, #ifdef __ILP32__ /* * This workaround is neded on 32-bit because it seems we can't * initialize a 64-bit integer from the address of a function. */ .entry.ptr32 = { .lo = (uint32_t)__utee_entry }, #else .entry.ptr64 = (uint64_t)__utee_entry, #endif }; /* 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]); int tahead_get_trace_level(void) { /* * Store trace level in TA head structure, as ta_head.prop_tracelevel */ return TRACE_LEVEL; }