lib: optee_client: support new optee message

Change-Id: I83e8da2252f1fef6dff7d388d12e6fb7972cf79e
Signed-off-by: Hisping Lin <hisping.lin@rock-chips.com>
This commit is contained in:
Hisping Lin 2018-02-23 19:30:03 +08:00 committed by Kever Yang
parent b5cc267faa
commit 1f25ada2a8
13 changed files with 1692 additions and 69 deletions

View File

@ -0,0 +1,38 @@
/*
* Copyright (c) 2016, Fuzhou Rockchip Electronics Co.,Ltd.
* 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.
*/
#ifndef TEE_SUPP_RK_FS_H
#define TEE_SUPP_RK_FS_H
#include <stddef.h>
int tee_supp_rk_fs_init(void);
int tee_supp_rk_fs_process(void *cmd, uint32_t cmd_size);
void OpteeClientRkFsInit(void);
#endif

View File

@ -39,5 +39,4 @@
#define TEE_WAIT_MUTEX_DELETE 2
#define TEE_RPC_WAIT 0x30000000
#endif

View File

@ -12,7 +12,7 @@
struct tee_rpc_load_ta_cmd {
TEE_UUID uuid;
void *va;
uint32_t va;
};
struct tee_rpc_rpmb_cmd {

View File

@ -206,28 +206,6 @@ struct teesmc32_arg {
*/
};
/**
* TEESMC32_GET_PARAMS - return pointer to union teesmc32_param *
*
* @x: Pointer to a struct teesmc32_arg
*
* Returns a pointer to the params[] inside a struct teesmc32_arg.
*/
#define TEESMC32_GET_PARAMS(x) \
(struct teesmc32_param *)(((struct teesmc32_arg *)(x)) + 1)
/**
* TEESMC32_GET_ARG_SIZE - return size of struct teesmc32_arg
*
* @num_params: Number of parameters embedded in the struct teesmc32_arg
*
* Returns the size of the struct teesmc32_arg together with the number
* of embedded paramters.
*/
#define TEESMC32_GET_ARG_SIZE(num_params) \
(sizeof(struct teesmc32_arg) + \
sizeof(struct teesmc32_param) * (num_params))
/**
* struct teesmc64_arg - SMC argument for Trusted OS
* @cmd: OS Command, one of TEESMC_CMD_*
@ -667,10 +645,21 @@ struct teesmc_meta_open_session {
#define TEESMC_RETURN_IS_RPC(ret) \
(((ret) & TEESMC_RETURN_RPC_PREFIX_MASK) == TEESMC_RETURN_RPC_PREFIX)
typedef struct teesmc32_arg t_teesmc32_arg;
typedef struct teesmc32_param t_teesmc32_param;
typedef struct teesmc_meta_open_session t_teesmc_meta_open_session;
#ifdef CONFIG_OPTEE_V1
typedef struct teesmc32_arg t_teesmc32_arg;
typedef struct teesmc32_param t_teesmc32_param;
#define TEESMC32_GET_PARAMS(x) \
(struct teesmc32_param *)(((struct teesmc32_arg *)(x)) + 1)
#define TEESMC32_GET_ARG_SIZE(num_params) \
(sizeof(struct teesmc32_arg) + \
sizeof(struct teesmc32_param) * (num_params))
#endif
void tee_smc_call(ARM_SMC_ARGS *param);
#endif /* TEESMC_H */

View File

@ -0,0 +1,89 @@
/*
* (C) Copyright 2017 Rockchip Electronics Co., Ltd
*
* SPDX-License-Identifier: GPL-2.0+
*/
#ifndef TEESMC_V2_H
#define TEESMC_V2_H
#define OPTEE_SMC_CALL_WITH_ARG_V2 0x32000004
struct optee_msg_param_tmem_v2 {
uint64_t buf_ptr;
uint64_t size;
uint64_t shm_ref;
};
struct optee_msg_param_rmem_v2 {
uint64_t offs;
uint64_t size;
uint64_t shm_ref;
};
struct optee_msg_param_value_v2 {
uint64_t a;
uint64_t b;
uint64_t c;
};
struct optee_msg_param_v2 {
uint64_t attr;
union {
struct optee_msg_param_tmem_v2 memref;
struct optee_msg_param_rmem_v2 rmem;
struct optee_msg_param_value_v2 value;
} u;
};
struct optee_msg_arg_v2 {
uint32_t cmd;
uint32_t ta_func;
uint32_t session;
uint32_t cancel_id;
uint32_t pad;
uint32_t ret;
uint32_t ret_origin;
uint32_t num_params;
/* num_params tells the actual number of element in params */
struct optee_msg_param_v2 params[];
};
#ifdef CONFIG_OPTEE_V2
typedef struct optee_msg_arg_v2 t_teesmc32_arg;
typedef struct optee_msg_param_v2 t_teesmc32_param;
#define TEESMC32_GET_ARG_SIZE(num_params) \
(sizeof(struct optee_msg_arg_v2) + \
sizeof(struct optee_msg_param_v2) * (num_params))
#define TEESMC32_GET_PARAMS(x) \
(struct optee_msg_param_v2 *)(((struct optee_msg_arg_v2 *)(x)) + 1)
#endif
#define OPTEE_MSG_ATTR_TYPE_NONE_V2 0x0
#define OPTEE_MSG_ATTR_TYPE_VALUE_INPUT_V2 0x1
#define OPTEE_MSG_ATTR_TYPE_VALUE_OUTPUT_V2 0x2
#define OPTEE_MSG_ATTR_TYPE_VALUE_INOUT_V2 0x3
#define OPTEE_MSG_ATTR_TYPE_RMEM_INPUT_V2 0x5
#define OPTEE_MSG_ATTR_TYPE_RMEM_OUTPUT_V2 0x6
#define OPTEE_MSG_ATTR_TYPE_RMEM_INOUT_V2 0x7
#define OPTEE_MSG_ATTR_TYPE_TMEM_INPUT_V2 0x9
#define OPTEE_MSG_ATTR_TYPE_TMEM_OUTPUT_V2 0xa
#define OPTEE_MSG_ATTR_TYPE_TMEM_INOUT_V2 0xb
#define OPTEE_MSG_ATTR_META_V2 (1 << (8))
#define OPTEE_MSG_RPC_CMD_SHM_ALLOC_V2 6
#define OPTEE_MSG_RPC_CMD_SHM_FREE_V2 7
#define OPTEE_MSG_RPC_CMD_LOAD_TA_V2 0
#define OPTEE_MSG_RPC_CMD_RPMB_V2 1
#define OPTEE_MSG_RPC_CMD_FS_V2 2
#endif /* TEESMC_V2_H */

View File

@ -9,8 +9,19 @@ obj-y += OpteeClientInterface.o
obj-y += OpteeClientSMC.o
obj-y += OpteeClientRPC.o
obj-y += tee_smc-arm64.o
obj-y += 258be795-f9ca-40e6-a8699ce6886c5d5d.o
obj-y += OpteeClientRkFs.o
ifdef CONFIG_OPTEE_V1
obj-y += 258be795-f9ca-40e6-a8699ce6886c5d5d.o
lib/optee_clientApi/258be795-f9ca-40e6-a8699ce6886c5d5d.o: lib/optee_clientApi/258be795-f9ca-40e6-a8699ce6886c5d5d.c
lib/optee_clientApi/258be795-f9ca-40e6-a8699ce6886c5d5d.c: lib/optee_clientApi/258be795-f9ca-40e6-a8699ce6886c5d5d.ta
$(srctree)/lib/optee_clientApi/tabinary_to_cfile.py --prefix keymaster --TA $< --out $@
endif
ifdef CONFIG_OPTEE_V2
obj-y += 258be795-f9ca-40e6-a8699ce6886c5d5d-for-optee-v2.o
lib/optee_clientApi/258be795-f9ca-40e6-a8699ce6886c5d5d-for-optee-v2.o: lib/optee_clientApi/258be795-f9ca-40e6-a8699ce6886c5d5d-for-optee-v2.c
lib/optee_clientApi/258be795-f9ca-40e6-a8699ce6886c5d5d-for-optee-v2.c: lib/optee_clientApi/258be795-f9ca-40e6-a8699ce6886c5d5d-for-optee-v2.ta
$(srctree)/lib/optee_clientApi/tabinary_to_cfile.py --prefix keymaster --TA $< --out $@
endif

View File

@ -8,6 +8,7 @@
#include <optee_include/OpteeClientApiLib.h>
#include <optee_include/OpteeClientMem.h>
#include <optee_include/OpteeClientSMC.h>
#include <optee_include/OpteeClientRkFs.h>
/*
* Initlialize the library
@ -18,6 +19,8 @@ TEEC_Result OpteeClientApiLibInitialize(void)
OpteeClientMemInit();
OpteeClientRkFsInit();
return status;
}
@ -64,8 +67,8 @@ exit:
*/
TEEC_Result TEEC_FinalizeContext(TEEC_Context *context)
{
debug("TEEC_FinalizeContext Enter-Exit: context=0x%X\n",
(unsigned int)context);
debug("TEEC_FinalizeContext Enter-Exit: context=0x%zu\n",
(size_t)context);
return TEEC_SUCCESS;
}
@ -81,7 +84,7 @@ TEEC_Result TEEC_AllocateSharedMemory(TEEC_Context *context,
{
TEEC_Result TeecResult = TEEC_SUCCESS;
debug("TEEC_AllocateSharedMemory Enter: context=%s 0x%X, shared_memory=0x%X\n",
debug("TEEC_AllocateSharedMemory Enter: context=%s 0x%X, shared_memory=0x%zu\n",
context->devname, context->fd, shared_memory->size);
if ((context == NULL) || (shared_memory == NULL)) {
@ -97,7 +100,7 @@ TEEC_Result TEEC_AllocateSharedMemory(TEEC_Context *context,
shared_memory->buffer = NULL;
shared_memory->alloc_buffer = 0;
debug("TEEC_AllocateSharedMemory: size=0x%X, flags=0x%X\n",
debug("TEEC_AllocateSharedMemory: size=0x%zu, flags=0x%X\n",
shared_memory->size, shared_memory->flags);
shared_memory->buffer = OpteeClientMemAlloc(shared_memory->size);
@ -121,7 +124,7 @@ Exit:
*/
void TEEC_ReleaseSharedMemory(TEEC_SharedMemory *shared_memory)
{
debug("TEEC_ReleaseSharedMemory Enter: shared_memory=0x%X\n",
debug("TEEC_ReleaseSharedMemory Enter: shared_memory=0x%zu\n",
shared_memory->size);
if (shared_memory == NULL)

View File

@ -713,7 +713,7 @@ uint32_t write_to_keymaster(uint8_t *filename,
TEEC_NONE);
TeecResult = TEEC_InvokeCommand(&TeecSession,
139,
141,
&TeecOperation,
&ErrorOrigin);

View File

@ -125,14 +125,17 @@ void my_free(void *ptr)
*/
void OpteeClientMemInit(void)
{
#ifdef CONFIG_ROCKCHIP_RK3328
#ifdef CONFIG_ARM64
debug(" OpteeClientMemInit 64\n");
my_malloc_init(0x09200000, 0x00200000);
#endif
#ifdef CONFIG_ROCKCHIP_RK322X
my_malloc_init((void *)0x09e10000, 0x003e0000);
#else
debug(" OpteeClientMemInit 32\n");
#ifdef CONFIG_ROCKCHIP_RK3288
my_malloc_init((void *)0x0910a000, 0x000e0000);
#else
my_malloc_init((void *)0x6910a000, 0x000e0000);
#endif
#endif
}
/*

View File

@ -11,10 +11,12 @@
#include <optee_include/OpteeClientMem.h>
#include <optee_include/OpteeClientRPC.h>
#include <optee_include/teesmc.h>
#include <optee_include/teesmc_v2.h>
#include <optee_include/teesmc_optee.h>
#include <optee_include/tee_rpc_types.h>
#include <optee_include/tee_rpc.h>
#include <optee_include/258be795-f9ca-40e6-a8699ce6886c5d5d.h>
#include <optee_include/OpteeClientRkFs.h>
/*
* Memory allocation.
@ -23,12 +25,12 @@
TEEC_Result OpteeRpcAlloc(uint32_t Size, uint32_t *Address)
{
TEEC_Result TeecResult = TEEC_SUCCESS;
uint32_t AllocAddress;
size_t AllocAddress;
*Address = 0;
if (Size != 0) {
AllocAddress = (uint32_t) OpteeClientMemAlloc(Size);
AllocAddress = (size_t) OpteeClientMemAlloc(Size);
if (AllocAddress == 0)
TeecResult = TEEC_ERROR_OUT_OF_MEMORY;
@ -44,7 +46,7 @@ TEEC_Result OpteeRpcAlloc(uint32_t Size, uint32_t *Address)
*/
TEEC_Result OpteeRpcFree(uint32_t Address)
{
OpteeClientMemFree((void *)Address);
OpteeClientMemFree((void *)(size_t)Address);
return TEEC_SUCCESS;
}
@ -67,7 +69,7 @@ TEEC_Result OpteeRpcCmdLoadTa(t_teesmc32_arg *TeeSmc32Arg)
TeeSmc32Param = TEESMC32_GET_PARAMS(TeeSmc32Arg);
TeeLoadTaCmd = (struct tee_rpc_load_ta_cmd *)
TeeSmc32Param[0].u.memref.buf_ptr;
(size_t)TeeSmc32Param[0].u.memref.buf_ptr;
TeeLoadTaCmdSize = TeeSmc32Param[0].u.memref.size;
if ((TeeLoadTaCmd == NULL) ||
@ -79,7 +81,7 @@ TEEC_Result OpteeRpcCmdLoadTa(t_teesmc32_arg *TeeSmc32Arg)
TEEC_Result Status = 0;
void *ImageData = NULL;
uint32_t ImageSize = 0;
uint32_t AllocAddress = 0;
size_t AllocAddress = 0;
ImageData = (void *)keymaster_data;
ImageSize = keymaster_size;
@ -89,7 +91,7 @@ TEEC_Result OpteeRpcCmdLoadTa(t_teesmc32_arg *TeeSmc32Arg)
goto Exit;
}
AllocAddress = (uint32_t) OpteeClientMemAlloc(ImageSize);
AllocAddress = (size_t) OpteeClientMemAlloc(ImageSize);
if (AllocAddress == 0) {
TeecResult = TEEC_ERROR_OUT_OF_MEMORY;
@ -98,12 +100,12 @@ TEEC_Result OpteeRpcCmdLoadTa(t_teesmc32_arg *TeeSmc32Arg)
memcpy((void *)AllocAddress, ImageData, ImageSize);
debug("...TA loaded at 0x%X of size 0x%X bytes\n",
debug("...TA loaded at 0x%zu of size 0x%X bytes\n",
AllocAddress, ImageSize);
debug("...AllocAddress[0] 0x%X ; AllocAddress[1] 0x%X bytes\n",
*(char *)AllocAddress, *(char *)(AllocAddress+1));
TeeLoadTaCmd->va = (void *)AllocAddress;
TeeLoadTaCmd->va = AllocAddress;
TeeSmc32Param[1].u.memref.buf_ptr = AllocAddress;
TeeSmc32Param[1].u.memref.size = ImageSize;
@ -117,6 +119,46 @@ Exit:
return TeecResult;
}
#ifdef CONFIG_OPTEE_V2
TEEC_Result OpteeRpcCmdLoadV2Ta(t_teesmc32_arg *TeeSmc32Arg)
{
TEEC_Result TeecResult = TEEC_SUCCESS;
t_teesmc32_param *TeeSmc32Param = NULL;
uint8_t uuid[16];
int i;
if (TeeSmc32Arg->num_params != 2) {
TeecResult = TEEC_ERROR_BAD_PARAMETERS;
goto Exit;
}
TeeSmc32Param = TEESMC32_GET_PARAMS(TeeSmc32Arg);
memcpy(uuid, (void *)&TeeSmc32Param[0].u.value, 16);
for (i = 0; i < 16; i++)
printf("uuid 0x%x", uuid[i]);
if (TeeSmc32Param[1].u.memref.buf_ptr == 0) {
printf("return size of TA, keymaster_size = 0x%x", keymaster_size);
TeeSmc32Param[1].u.memref.size = keymaster_size;
} else {
memcpy((void *)TeeSmc32Param[1].u.memref.buf_ptr,
(void *)keymaster_data, TeeSmc32Param[1].u.memref.size);
printf("memref.buf_ptr = 0x%llx; memref.size = 0x%llx",
TeeSmc32Param[1].u.memref.buf_ptr,
TeeSmc32Param[1].u.memref.size);
}
Exit:
TeeSmc32Arg->ret = TeecResult;
TeeSmc32Arg->ret_origin = TEEC_ORIGIN_API;
debug("OpteeRpcCmdLoadTa Exit : TeecResult=0x%X\n", TeecResult);
return TeecResult;
}
#endif
/*
* Free a previously loaded TA and release the memory
* Param[0] = IN: TA Image to free
@ -130,7 +172,7 @@ TEEC_Result OpteeRpcCmdFreeTa(t_teesmc32_arg *TeeSmc32Arg)
TEEC_Result TeecResult = TEEC_SUCCESS;
t_teesmc32_param *TeeSmc32Param = NULL;
uint32_t ImageSize = 0;
uint32_t AllocAddress = 0;
size_t AllocAddress = 0;
if (TeeSmc32Arg->num_params != 1) {
TeecResult = TEEC_ERROR_BAD_PARAMETERS;
@ -164,6 +206,7 @@ Exit:
/*
* Execute an RPMB storage operation.
*/
uint16_t global_block_count;
TEEC_Result OpteeRpcCmdRpmb(t_teesmc32_arg *TeeSmc32Arg)
{
@ -188,12 +231,12 @@ TEEC_Result OpteeRpcCmdRpmb(t_teesmc32_arg *TeeSmc32Arg)
}
TeeSmc32Param = TEESMC32_GET_PARAMS(TeeSmc32Arg);
RpmbRequest = (struct tee_rpc_rpmb_cmd *)
RpmbRequest = (struct tee_rpc_rpmb_cmd *)(size_t)
TeeSmc32Param[0].u.memref.buf_ptr;
switch (RpmbRequest->cmd) {
case TEE_RPC_RPMB_CMD_DATA_REQ: {
RequestPackets = (EFI_RK_RPMB_DATA_PACKET *)(RpmbRequest + 1);
ResponsePackets = (EFI_RK_RPMB_DATA_PACKET *)
ResponsePackets = (EFI_RK_RPMB_DATA_PACKET *)(size_t)
TeeSmc32Param[1].u.memref.buf_ptr;
global_block_count =
@ -344,7 +387,7 @@ TEEC_Result OpteeRpcCmdRpmb(t_teesmc32_arg *TeeSmc32Arg)
case TEE_RPC_RPMB_CMD_GET_DEV_INFO: {
mmc = do_returnmmc();
DevInfo = (struct tee_rpc_rpmb_dev_info *)
DevInfo = (struct tee_rpc_rpmb_dev_info *)(size_t)
TeeSmc32Param[1].u.memref.buf_ptr;
DevInfo->cid[0] = (mmc->cid[0]) >> 24 & 0xff;
@ -435,9 +478,15 @@ Exit:
*/
TEEC_Result OpteeRpcCmdFs(t_teesmc32_arg *TeeSmc32Arg)
{
return TEEC_ERROR_NOT_IMPLEMENTED;
}
TEEC_Result TeecResult = TEEC_SUCCESS;
t_teesmc32_param *TeeSmc32Param;
TeeSmc32Param = TEESMC32_GET_PARAMS(TeeSmc32Arg);
TeecResult = tee_supp_rk_fs_process((void *)(size_t)TeeSmc32Param[0].u.memref.buf_ptr,
TeeSmc32Param[0].u.memref.size);
return TeecResult;
}
/*
* TBD.
@ -447,7 +496,6 @@ TEEC_Result OpteeRpcCmdGetTime(t_teesmc32_arg *TeeSmc32Arg)
return TEEC_ERROR_NOT_IMPLEMENTED;
}
/*
* TBD.
*/
@ -463,12 +511,21 @@ TEEC_Result OpteeRpcCallback(ARM_SMC_ARGS *ArmSmcArgs)
{
TEEC_Result TeecResult = TEEC_SUCCESS;
debug("OpteeRpcCallback Enter: Arg0=0x%X, Arg1=0x%X, Arg2=0x%X\n",
ArmSmcArgs->Arg0, ArmSmcArgs->Arg1, ArmSmcArgs->Arg2);
//printf("OpteeRpcCallback Enter: Arg0=0x%X, Arg1=0x%X, Arg2=0x%X\n",
//ArmSmcArgs->Arg0, ArmSmcArgs->Arg1, ArmSmcArgs->Arg2);
switch (TEESMC_RETURN_GET_RPC_FUNC(ArmSmcArgs->Arg0)) {
case TEESMC_RPC_FUNC_ALLOC_ARG: {
#ifdef CONFIG_OPTEE_V1
TeecResult = OpteeRpcAlloc(ArmSmcArgs->Arg1, &ArmSmcArgs->Arg1);
#endif
#ifdef CONFIG_OPTEE_V2
printf("ArmSmcArgs->Arg1 = 0x%x", ArmSmcArgs->Arg1);
TeecResult = OpteeRpcAlloc(ArmSmcArgs->Arg1, &ArmSmcArgs->Arg2);
ArmSmcArgs->Arg5 = ArmSmcArgs->Arg2;
ArmSmcArgs->Arg1 = 0;
ArmSmcArgs->Arg4 = 0;
#endif
break;
}
@ -478,7 +535,12 @@ TEEC_Result OpteeRpcCallback(ARM_SMC_ARGS *ArmSmcArgs)
}
case TEESMC_RPC_FUNC_FREE_ARG: {
#ifdef CONFIG_OPTEE_V1
TeecResult = OpteeRpcFree(ArmSmcArgs->Arg1);
#endif
#ifdef CONFIG_OPTEE_V2
TeecResult = OpteeRpcFree(ArmSmcArgs->Arg2);
#endif
break;
}
@ -492,10 +554,17 @@ TEEC_Result OpteeRpcCallback(ARM_SMC_ARGS *ArmSmcArgs)
}
case TEESMC_RPC_FUNC_CMD: {
#ifdef CONFIG_OPTEE_V1
t_teesmc32_arg *TeeSmc32Arg =
(t_teesmc32_arg *)ArmSmcArgs->Arg1;
(t_teesmc32_arg *)(size_t)ArmSmcArgs->Arg1;
#endif
#ifdef CONFIG_OPTEE_V2
t_teesmc32_arg *TeeSmc32Arg =
(t_teesmc32_arg *)((size_t)ArmSmcArgs->Arg1 << 32 | ArmSmcArgs->Arg2);
printf("TeeSmc32Arg->cmd = 0x%x", TeeSmc32Arg->cmd);
#endif
switch (TeeSmc32Arg->cmd) {
#ifdef CONFIG_OPTEE_V1
case TEE_RPC_LOAD_TA: {
TeecResult = OpteeRpcCmdLoadTa(TeeSmc32Arg);
break;
@ -513,6 +582,7 @@ TEEC_Result OpteeRpcCallback(ARM_SMC_ARGS *ArmSmcArgs)
case TEE_RPC_FS: {
TeecResult = OpteeRpcCmdFs(TeeSmc32Arg);
TeeSmc32Arg->ret = TEEC_SUCCESS;
break;
}
@ -525,6 +595,35 @@ TEEC_Result OpteeRpcCallback(ARM_SMC_ARGS *ArmSmcArgs)
TeecResult = OpteeRpcCmdWaitMutex(TeeSmc32Arg);
break;
}
#endif
#ifdef CONFIG_OPTEE_V2
case OPTEE_MSG_RPC_CMD_SHM_ALLOC_V2: {
uint32_t tempaddr;
uint32_t allocsize = TeeSmc32Arg->params[0].u.value.b;
TeecResult = OpteeRpcAlloc(allocsize, &tempaddr);
printf("allocsize = 0x%x tempaddr = 0x%x", allocsize, tempaddr);
TeeSmc32Arg->params[0].attr = OPTEE_MSG_ATTR_TYPE_TMEM_OUTPUT_V2;
TeeSmc32Arg->params[0].u.memref.buf_ptr = tempaddr;
TeeSmc32Arg->params[0].u.memref.size = allocsize;
TeeSmc32Arg->params[0].u.memref.shm_ref = tempaddr;
TeeSmc32Arg->ret = TEE_SUCCESS;
break;
}
case OPTEE_MSG_RPC_CMD_SHM_FREE_V2: {
uint32_t tempaddr = TeeSmc32Arg->params[0].u.value.b;
TeecResult = OpteeRpcFree(tempaddr);
break;
}
case OPTEE_MSG_RPC_CMD_RPMB_V2: {
TeecResult = OpteeRpcCmdRpmb(TeeSmc32Arg);
break;
}
case OPTEE_MSG_RPC_CMD_LOAD_TA_V2: {
TeecResult = OpteeRpcCmdLoadV2Ta(TeeSmc32Arg);
break;
}
#endif
default: {
printf("...unsupported RPC CMD: cmd=0x%X\n",

File diff suppressed because it is too large Load Diff

View File

@ -9,6 +9,8 @@
#include <optee_include/OpteeClientSMC.h>
#include <optee_include/OpteeClientRPC.h>
#include <optee_include/teesmc.h>
#include <optee_include/teesmc_v2.h>
#define TEEC_SMC_DEFAULT_CACHE_ATTRIBUTES \
(TEESMC_ATTR_CACHE_DEFAULT << TEESMC_ATTR_CACHE_SHIFT);
@ -19,6 +21,19 @@ static void GetTeeSmc32Params(t_teesmc32_param *TeeSmc32Param,
TEEC_Operation *operation);
static TEEC_Result OpteeSmcCall(t_teesmc32_arg *TeeSmc32Arg);
void tee_uuid_to_octets(uint8_t *d, const TEEC_UUID *s)
{
d[0] = s->timeLow >> 24;
d[1] = s->timeLow >> 16;
d[2] = s->timeLow >> 8;
d[3] = s->timeLow;
d[4] = s->timeMid >> 8;
d[5] = s->timeMid;
d[6] = s->timeHiAndVersion >> 8;
d[7] = s->timeHiAndVersion;
memcpy(d + 8, s->clockSeqAndNode, sizeof(s->clockSeqAndNode));
}
/*
* This function opens a new Session between the Client application and the
* specified TEE application.
@ -38,8 +53,16 @@ TEEC_Result TEEC_SMC_OpenSession(TEEC_Context *context,
t_teesmc32_arg *TeeSmc32Arg = NULL;
t_teesmc32_param *TeeSmc32Param = NULL;
t_teesmc_meta_open_session *TeeSmcMetaSession = NULL;
static const uint32_t MetaNum = 1;
#ifdef CONFIG_OPTEE_V1
uint32_t MetaNum = 1;
#endif
#ifdef CONFIG_OPTEE_V2
uint32_t MetaNum = 2;
#endif
*error_origin = TEEC_ORIGIN_API;
@ -77,18 +100,34 @@ TEEC_Result TEEC_SMC_OpenSession(TEEC_Context *context,
sizeof(TeeSmcMetaSession->uuid));
TeeSmcMetaSession->clnt_login = TEEC_LOGIN_PUBLIC;
TeeSmc32Param[0].u.memref.buf_ptr = (uint32_t) TeeSmcMetaSession;
TeeSmc32Param[0].u.memref.buf_ptr = (uint32_t) (size_t)TeeSmcMetaSession;
TeeSmc32Param[0].u.memref.size = sizeof(*TeeSmcMetaSession);
#ifdef CONFIG_ROCKCHIP_RK3328
#ifdef CONFIG_OPTEE_V1
#ifdef CONFIG_ARM64
TeeSmc32Param[0].attr = TEESMC_ATTR_TYPE_MEMREF_INPUT |
TEESMC_ATTR_META |
TEEC_SMC_DEFAULT_CACHE_ATTRIBUTES;
#endif
#ifdef CONFIG_ROCKCHIP_RK322X
#else
TeeSmc32Param[0].attr = TEESMC_ATTR_TYPE_MEMREF_INPUT |
TEESMC_ATTR_META;
#endif
#endif
#ifdef CONFIG_OPTEE_V2
#ifdef CONFIG_ARM64
uint8_t * session_uuid = (uint8_t *)&TeeSmcMetaSession->uuid;
tee_uuid_to_octets(session_uuid, destination);
memcpy((void *)&TeeSmc32Param[0].u.value, &TeeSmcMetaSession->uuid, sizeof(TeeSmcMetaSession->uuid));
TeeSmc32Param[1].u.value.c = TeeSmcMetaSession->clnt_login;
TeeSmc32Param[0].attr = OPTEE_MSG_ATTR_TYPE_VALUE_INPUT_V2 |
OPTEE_MSG_ATTR_META_V2;
TeeSmc32Param[1].attr = OPTEE_MSG_ATTR_TYPE_VALUE_INPUT_V2 |
OPTEE_MSG_ATTR_META_V2;
#else
printf("Not support! All rockchips use optee v2.5 are 64 bits! \n");
#endif
#endif
SetTeeSmc32Params(operation, TeeSmc32Param + MetaNum);
@ -128,6 +167,7 @@ TEEC_Result TEEC_SMC_CloseSession(TEEC_Session *session,
{
TEEC_Result TeecResult = TEEC_SUCCESS;
uint32_t TeeSmc32ArgLength;
t_teesmc32_arg *TeeSmc32Arg = NULL;
*error_origin = TEEC_ORIGIN_API;
@ -174,6 +214,7 @@ TEEC_Result TEEC_SMC_InvokeCommand(TEEC_Session *session,
{
TEEC_Result TeecResult = TEEC_SUCCESS;
uint32_t TeeSmc32ArgLength;
t_teesmc32_arg *TeeSmc32Arg = NULL;
t_teesmc32_param *TeeSmc32Param = NULL;
@ -255,16 +296,28 @@ void SetTeeSmc32Params(TEEC_Operation *operation,
if (attr == TEEC_MEMREF_TEMP_INPUT ||
attr == TEEC_MEMREF_TEMP_OUTPUT ||
attr == TEEC_MEMREF_TEMP_INOUT) {
#ifdef CONFIG_ROCKCHIP_RK3328
#ifdef CONFIG_OPTEE_V1
#ifdef CONFIG_ARM64
attr |= TEEC_SMC_DEFAULT_CACHE_ATTRIBUTES;
debug(" 3328 attr %x\n", attr);
debug(" OPTEE_OS_V1 ARCH64 attr %x\n", attr);
#else
debug(" OPTEE_OS_V1 ARCH32 attr %x\n", attr);
#endif
#ifdef CONFIG_ROCKCHIP_RK322X
debug(" 322X attr %x\n", attr);
#endif
#ifdef CONFIG_OPTEE_V2
#ifdef CONFIG_ARM64
attr += (OPTEE_MSG_ATTR_TYPE_TMEM_INPUT_V2 - TEEC_MEMREF_TEMP_INPUT);
debug(" OPTEE_OS_V2 ARCH64 attr %x\n", attr);
#else
printf("Not support! All rockchips use optee v2 are 64 bits! \n");
#endif
#endif
TeeSmc32Param[ParamCount].attr = attr;
TeeSmc32Param[ParamCount].u.memref.buf_ptr =
(uint32_t)operation->params[ParamCount].tmpref.buffer;
(uint32_t)(size_t)operation->params[ParamCount].tmpref.buffer;
TeeSmc32Param[ParamCount].u.memref.size =
operation->params[ParamCount].tmpref.size;
} else {
@ -310,12 +363,21 @@ TEEC_Result OpteeSmcCall(t_teesmc32_arg *TeeSmc32Arg)
TEEC_Result TeecResult = TEEC_SUCCESS;
ARM_SMC_ARGS ArmSmcArgs = {0};
#ifdef CONFIG_OPTEE_V1
ArmSmcArgs.Arg0 = TEESMC32_CALL_WITH_ARG;
ArmSmcArgs.Arg1 = (uint32_t) TeeSmc32Arg;
ArmSmcArgs.Arg1 = (uint32_t) (size_t)TeeSmc32Arg;
#endif
#ifdef CONFIG_OPTEE_V2
ArmSmcArgs.Arg0 = OPTEE_SMC_CALL_WITH_ARG_V2;
ArmSmcArgs.Arg1 = 0;
ArmSmcArgs.Arg2 = (uint32_t) (size_t)TeeSmc32Arg;
#endif
while (1) {
tee_smc_call(&ArmSmcArgs);
debug("arg0=0x%x arg1=0x%x arg2=0x%x arg3=0x%x",
ArmSmcArgs.Arg0, ArmSmcArgs.Arg1, ArmSmcArgs.Arg2, ArmSmcArgs.Arg3);
if (TEESMC_RETURN_IS_RPC(ArmSmcArgs.Arg0)) {
(void) OpteeRpcCallback(&ArmSmcArgs);
} else if (ArmSmcArgs.Arg0 == TEESMC_RETURN_UNKNOWN_FUNCTION) {