187065172SJens Wiklander // SPDX-License-Identifier: BSD-2-Clause 287065172SJens Wiklander /* 387065172SJens Wiklander * Copyright (c) 2019, Linaro Limited 487065172SJens Wiklander */ 587065172SJens Wiklander 687065172SJens Wiklander #include <pta_system.h> 787065172SJens Wiklander #include <string.h> 887065172SJens Wiklander #include <tee_internal_api_extensions.h> 987065172SJens Wiklander #include <tee_internal_api.h> 1087065172SJens Wiklander #include <types_ext.h> 1187065172SJens Wiklander #include <util.h> 1287065172SJens Wiklander 1387065172SJens Wiklander static TEE_Result invoke_system_pta(uint32_t cmd_id, uint32_t param_types, 1487065172SJens Wiklander TEE_Param params[TEE_NUM_PARAMS]) 1587065172SJens Wiklander { 1687065172SJens Wiklander static TEE_TASessionHandle sess = TEE_HANDLE_NULL; 1787065172SJens Wiklander static const TEE_UUID uuid = PTA_SYSTEM_UUID; 1887065172SJens Wiklander 1987065172SJens Wiklander if (sess == TEE_HANDLE_NULL) { 20*542ae207SCedric Auger TEE_Result res = TEE_OpenTASession(&uuid, TEE_TIMEOUT_INFINITE, 21*542ae207SCedric Auger 0, NULL, &sess, NULL); 2287065172SJens Wiklander 2387065172SJens Wiklander if (res) 2487065172SJens Wiklander return res; 2587065172SJens Wiklander } 2687065172SJens Wiklander 27*542ae207SCedric Auger return TEE_InvokeTACommand(sess, TEE_TIMEOUT_INFINITE, cmd_id, 28*542ae207SCedric Auger param_types, params, NULL); 2987065172SJens Wiklander } 3087065172SJens Wiklander 3187065172SJens Wiklander void *tee_map_zi(size_t len, uint32_t flags) 3287065172SJens Wiklander { 3387065172SJens Wiklander uint32_t param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT, 3487065172SJens Wiklander TEE_PARAM_TYPE_VALUE_INOUT, 3587065172SJens Wiklander TEE_PARAM_TYPE_VALUE_INPUT, 3687065172SJens Wiklander TEE_PARAM_TYPE_NONE); 3787065172SJens Wiklander TEE_Param params[TEE_NUM_PARAMS] = { }; 3887065172SJens Wiklander TEE_Result res = TEE_SUCCESS; 3987065172SJens Wiklander 4087065172SJens Wiklander params[0].value.a = len; 4187065172SJens Wiklander if (params[0].value.a != len) 4287065172SJens Wiklander return NULL; 4387065172SJens Wiklander switch (flags) { 4487065172SJens Wiklander case 0: 4587065172SJens Wiklander break; 4687065172SJens Wiklander case TEE_MEMORY_ACCESS_ANY_OWNER: 4787065172SJens Wiklander params[0].value.b = PTA_SYSTEM_MAP_FLAG_SHAREABLE; 4887065172SJens Wiklander break; 4987065172SJens Wiklander default: 5087065172SJens Wiklander return NULL; 5187065172SJens Wiklander } 5287065172SJens Wiklander 5387065172SJens Wiklander res = invoke_system_pta(PTA_SYSTEM_MAP_ZI, param_types, params); 5487065172SJens Wiklander if (res) 5587065172SJens Wiklander return NULL; 5687065172SJens Wiklander 5787065172SJens Wiklander return (void *)(vaddr_t)reg_pair_to_64(params[1].value.a, 5887065172SJens Wiklander params[1].value.b); 5987065172SJens Wiklander } 6087065172SJens Wiklander 6187065172SJens Wiklander TEE_Result tee_unmap(void *buf, size_t len) 6287065172SJens Wiklander { 6387065172SJens Wiklander TEE_Result res = TEE_SUCCESS; 6487065172SJens Wiklander uint32_t param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT, 6587065172SJens Wiklander TEE_PARAM_TYPE_VALUE_INPUT, 6687065172SJens Wiklander TEE_PARAM_TYPE_NONE, 6787065172SJens Wiklander TEE_PARAM_TYPE_NONE); 6887065172SJens Wiklander TEE_Param params[TEE_NUM_PARAMS] = { }; 6987065172SJens Wiklander 7087065172SJens Wiklander params[0].value.a = len; 7187065172SJens Wiklander reg_pair_from_64((vaddr_t)buf, ¶ms[1].value.a, ¶ms[1].value.b); 7287065172SJens Wiklander 7387065172SJens Wiklander res = invoke_system_pta(PTA_SYSTEM_UNMAP, param_types, params); 7487065172SJens Wiklander if (res) 7587065172SJens Wiklander EMSG("Invoke PTA_SYSTEM_UNMAP: buf %p, len %#zx", buf, len); 7687065172SJens Wiklander 7787065172SJens Wiklander return res; 7887065172SJens Wiklander } 79