1 // SPDX-License-Identifier: BSD-2-Clause 2 /* 3 * Copyright (c) 2019, Linaro Limited 4 */ 5 6 #include <pta_system.h> 7 #include <string.h> 8 #include <tee_internal_api_extensions.h> 9 #include <tee_internal_api.h> 10 #include <types_ext.h> 11 #include <util.h> 12 13 static TEE_Result invoke_system_pta(uint32_t cmd_id, uint32_t param_types, 14 TEE_Param params[TEE_NUM_PARAMS]) 15 { 16 static TEE_TASessionHandle sess = TEE_HANDLE_NULL; 17 static const TEE_UUID uuid = PTA_SYSTEM_UUID; 18 19 if (sess == TEE_HANDLE_NULL) { 20 TEE_Result res = TEE_OpenTASession(&uuid, TEE_TIMEOUT_INFINITE, 21 0, NULL, &sess, NULL); 22 23 if (res) 24 return res; 25 } 26 27 return TEE_InvokeTACommand(sess, TEE_TIMEOUT_INFINITE, cmd_id, 28 param_types, params, NULL); 29 } 30 31 void *tee_map_zi(size_t len, uint32_t flags) 32 { 33 uint32_t param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT, 34 TEE_PARAM_TYPE_VALUE_INOUT, 35 TEE_PARAM_TYPE_VALUE_INPUT, 36 TEE_PARAM_TYPE_NONE); 37 TEE_Param params[TEE_NUM_PARAMS] = { }; 38 TEE_Result res = TEE_SUCCESS; 39 40 params[0].value.a = len; 41 if (params[0].value.a != len) 42 return NULL; 43 switch (flags) { 44 case 0: 45 break; 46 case TEE_MEMORY_ACCESS_ANY_OWNER: 47 params[0].value.b = PTA_SYSTEM_MAP_FLAG_SHAREABLE; 48 break; 49 default: 50 return NULL; 51 } 52 53 res = invoke_system_pta(PTA_SYSTEM_MAP_ZI, param_types, params); 54 if (res) 55 return NULL; 56 57 return (void *)(vaddr_t)reg_pair_to_64(params[1].value.a, 58 params[1].value.b); 59 } 60 61 TEE_Result tee_unmap(void *buf, size_t len) 62 { 63 TEE_Result res = TEE_SUCCESS; 64 uint32_t param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT, 65 TEE_PARAM_TYPE_VALUE_INPUT, 66 TEE_PARAM_TYPE_NONE, 67 TEE_PARAM_TYPE_NONE); 68 TEE_Param params[TEE_NUM_PARAMS] = { }; 69 70 params[0].value.a = len; 71 reg_pair_from_64((vaddr_t)buf, ¶ms[1].value.a, ¶ms[1].value.b); 72 73 res = invoke_system_pta(PTA_SYSTEM_UNMAP, param_types, params); 74 if (res) 75 EMSG("Invoke PTA_SYSTEM_UNMAP: buf %p, len %#zx", buf, len); 76 77 return res; 78 } 79