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:
parent
b5cc267faa
commit
1f25ada2a8
|
|
@ -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
|
||||
|
|
@ -39,5 +39,4 @@
|
|||
#define TEE_WAIT_MUTEX_DELETE 2
|
||||
#define TEE_RPC_WAIT 0x30000000
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@
|
|||
|
||||
struct tee_rpc_load_ta_cmd {
|
||||
TEE_UUID uuid;
|
||||
void *va;
|
||||
uint32_t va;
|
||||
};
|
||||
|
||||
struct tee_rpc_rpmb_cmd {
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
Binary file not shown.
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -713,7 +713,7 @@ uint32_t write_to_keymaster(uint8_t *filename,
|
|||
TEEC_NONE);
|
||||
|
||||
TeecResult = TEEC_InvokeCommand(&TeecSession,
|
||||
139,
|
||||
141,
|
||||
&TeecOperation,
|
||||
&ErrorOrigin);
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue