1 /* 2 * Copyright (c) 2014, STMicroelectronics International N.V. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, 9 * this list of conditions and the following disclaimer. 10 * 11 * 2. Redistributions in binary form must reproduce the above copyright notice, 12 * this list of conditions and the following disclaimer in the documentation 13 * and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25 * POSSIBILITY OF SUCH DAMAGE. 26 */ 27 28 #ifndef TEE_TA_MANAGER_H 29 #define TEE_TA_MANAGER_H 30 31 #include <kernel/tee_common.h> 32 33 #include "tee_api_types.h" 34 #include "tee_api_types.h" 35 #include "tee_ta.h" 36 #include <kernel/kta_types.h> 37 #include "tee_ta_manager_unpg.h" 38 #include "tee_trace.h" 39 40 /*----------------------------------------------------------------------------- 41 * Initializes virtual memory management by reserving virtual memory for 42 * memory areas not available TA virtual memroy allocation. 43 * 44 * Spare physical pages are passed in the memory range between ta_start and 45 * ta_spare_end. Spare physical pages are supposed to be mapped with "no 46 * access" attribute. 47 * 48 * All addresses will be rounded up the the next page. 49 * 50 * Parameters: 51 * ro_start - start of read only section for paging, 52 * ro_end - end of read only section for paging, 53 * ta_start - start of section used for TA virtual memory 54 * ta_spare_end - end of spare pages used for paging 55 * 56 * Returns: 57 * void 58 *---------------------------------------------------------------------------*/ 59 void tee_ta_vmem_init(tee_vaddr_t ro_start, tee_vaddr_t ro_end, 60 tee_vaddr_t ta_start, tee_vaddr_t ta_spare_end); 61 62 TEE_Result tee_ta_open_session(TEE_ErrorOrigin *err, 63 struct tee_ta_session **sess, 64 struct tee_ta_session_head *open_sessions, 65 const TEE_UUID *uuid, 66 const TEE_Identity *clnt_id, 67 uint32_t cancel_req_to, 68 struct tee_ta_param *param); 69 70 TEE_Result tee_ta_invoke_command(TEE_ErrorOrigin *err, 71 struct tee_ta_session *sess, 72 const TEE_Identity *clnt_id, 73 uint32_t cancel_req_to, uint32_t cmd, 74 struct tee_ta_param *param); 75 76 TEE_Result tee_ta_cancel_command(TEE_ErrorOrigin *err, 77 struct tee_ta_session *sess, 78 const TEE_Identity *clnt_id); 79 80 /*----------------------------------------------------------------------------- 81 * Function called to close a TA. 82 * Parameters: 83 * id - The session id (in) 84 * Returns: 85 * TEE_Result 86 *---------------------------------------------------------------------------*/ 87 TEE_Result tee_ta_close_session(uint32_t id, 88 struct tee_ta_session_head *open_sessions); 89 90 TEE_Result tee_ta_get_current_session(struct tee_ta_session **sess); 91 92 void tee_ta_set_current_session(struct tee_ta_session *sess); 93 94 TEE_Result tee_ta_get_client_id(TEE_Identity *id); 95 96 /* 97 * Get pointer of executable part of the TA located in virtual kernel memory 98 */ 99 uintptr_t tee_ta_get_exec(const struct tee_ta_ctx *const ctx); 100 101 /* Returns OK is sess is a valid session pointer or static TA */ 102 TEE_Result tee_ta_verify_session_pointer(struct tee_ta_session *sess, 103 struct tee_ta_session_head 104 *open_sessions); 105 106 int tee_ta_set_trace_level(int level); 107 108 #endif 109