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