| /******************************************************************************** |
| * Marvell GPL License Option |
| * |
| * If you received this File from Marvell, you may opt to use, redistribute and/or |
| * modify this File in accordance with the terms and conditions of the General |
| * Public License Version 2, June 1991 (the "GPL License"), a copy of which is |
| * available along with the File in the license.txt file or by writing to the Free |
| * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or |
| * on the worldwide web at http://www.gnu.org/licenses/gpl.txt. |
| * |
| * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED |
| * WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY |
| * DISCLAIMED. The GPL License provides additional details about this warranty |
| * disclaimer. |
| ******************************************************************************/ |
| |
| #ifndef _TEE_INTERNAL_PRIVATE_API_H_ |
| #define _TEE_INTERNAL_PRIVATE_API_H_ |
| |
| #include "tee_internal_core_common.h" |
| #include "tee_internal_storage_generic_api.h" |
| #include "mem_region.h" |
| #include "otp_prop.h" |
| |
| typedef struct mem_region TEE_MemRegion; |
| typedef struct reg_region TEE_RegRegion; |
| |
| #define TEE_MR_ATTR(perm, reg, zone, mattr, ctrl) \ |
| MR_ATTR(perm, reg, zone, mattr, ctrl) |
| |
| #define TEE_MR_M_PERM MR_M_PERM |
| #define TEE_MR_M_ZONE MR_M_ZONE |
| #define TEE_MR_M_TYPE MR_M_TYPE |
| #define TEE_MR_M_MEM_ATTR MR_M_MEM_ATTR |
| #define TEE_MR_M_CACHEABLE MR_M_CACHEABLE |
| #define TEE_MR_M_DATA_ATTR MR_M_DATA_ATTR |
| #define TEE_MR_M_PREMAPPED MR_M_PREMAPPED |
| |
| #define TEE_MR_PERM(mr) MR_PERM(mr) |
| #define TEE_MR_ZONE(mr) MR_ZONE(mr) |
| #define TEE_MR_WINDOW(mr) MR_WINDOW(mr) |
| #define TEE_MR_MEM_ATTR(mr) MR_MEM_ATTR(mr) |
| #define TEE_MR_IS_RESTRICTED(mr) MR_IS_RESTRICTED(mr) |
| #define TEE_MR_IS_SECURE(mr) MR_IS_SECURE(mr) |
| #define TEE_MR_IS_NONSECURE(mr) MR_IS_NONSECURE(mr) |
| #define TEE_MR_IS_PREMAPPED(mr) MR_IS_PREMAPPED(mr) |
| #define TEE_MR_IS_CACHEABLE(mr) MR_IS_CACHEABLE(mr) |
| #define TEE_MR_IS_DATA_ATTR(mr) MR_IS_DATA_ATTR(mr) |
| #define TEE_MR_IS_REGISTER(mr) MR_IS_REGISTER(mr) |
| #define TEE_MR_IS_MEMORY(mr) MR_IS_MEMORY(mr) |
| |
| /** Get the memory region count |
| * |
| * @param attrMask attribute mask to filter memory regions. |
| * can be the flags in TEE_MR_M_*. 0 to get all. |
| * only (region.attr & attrMask == attrVal) is filtered. |
| * @param attrVal attribute value to filter memory regions. |
| * use TEE_MR_ATTR() to generate it. ignored if attrMask=0. |
| * |
| * @return region number. |
| */ |
| uint32_t TEE_GetMemRegionCount(uint32_t attrMask, uint32_t attrVal); |
| |
| /** Retrieve the memory region list. |
| * |
| * @param region buffer to store the retrieved regions. |
| * NULL to return region number, same as |
| * TEE_GetMemRegionCount(). |
| * @param maxNum max count can be retrieved (count region). |
| * @param attrMask attribute mask to filter memory regions. |
| * can be the flags in TEE_MR_M_*. 0 to get all. |
| * only (region.attr & attrMask == attrVal) is filtered. |
| * @param attrVal attribute value to filter memory regions. |
| * use TEE_MR_ATTR() to generate it. ignored if attrMask=0. |
| * |
| * @return retrieved region number. if maxNum < total matched region |
| * number, then only maxNum would be copied, and return total |
| * matched region_number. |
| */ |
| uint32_t TEE_GetMemRegionList(TEE_MemRegion *region, uint32_t maxNum, |
| uint32_t attrMask, uint32_t attrVal); |
| |
| /** Find memory region based on the input address. |
| * |
| * @param region buffer to store the retrieved region. |
| * @param buffer buffer address to check. |
| * @param size size of the buffer, must not cross 2 regions. |
| * |
| * @retval TEE_SUCCESS Pass the check. |
| * @retval TEE_ERROR_BAD_PARAMETERS Parameter error. |
| */ |
| TEE_Result TEE_FindMemRegion(TEE_MemRegion *region, |
| void *buffer, uint32_t size); |
| |
| /** Find Read register region based on the input address. |
| * |
| * @param region buffer to store the register region. |
| * @param addr address to check. |
| * |
| * @retval TEE_SUCCESS Pass the check. |
| * @retval TEE_ERROR_BAD_PARAMETERS Parameter error. |
| * @retval TEE_ERROR_ACCESS_DENIED address is not in the register region |
| */ |
| TEE_Result TEE_FindRegRegion(TEE_RegRegion *region, |
| void *addr); |
| |
| /* |
| * Data attributes support to save memory in TrustZone. |
| * |
| * Data attributes are used to identify the content in secure memory is secure |
| * or not. |
| * With data attributes, we can store all the secure & non-secure content in |
| * secure memory, so the memory size can be saved. |
| * |
| * In order to use it, the user must set the data buffer to be secure or |
| * non-secure before use them. |
| * |
| * And in order to improve the access performance, read/write lock is used to |
| * synchornize the data attributes list. |
| */ |
| |
| /** Set data attributes. |
| * @note must set before write data to the buffer. |
| * |
| * @param buffer start address of the data. |
| * @param size size of the data. |
| * @param attr attributes of the data. |
| * |
| * @retval TEE_SUCCESS Pass the check. |
| * @retval TEE_ERROR_BAD_PARAMETERS Parameter error. |
| * @retval TEE_ERROR_ACCESS_CONFLICT The buffer is in use. |
| */ |
| TEE_Result TEE_SetDataAttribute(const void *buffer, size_t size, uint32_t attr); |
| |
| /** Retrieve back data attributes. |
| * |
| * @param buffer start address of the data. |
| * @param size size of the data. |
| * @param attr buffer to return attributes of the data. |
| * |
| * @retval TEE_SUCCESS Pass the check. |
| * @retval TEE_ERROR_BAD_PARAMETERS Parameter error. |
| * @retval TEE_ERROR_BAD_STATE Data attributes is not set. |
| */ |
| TEE_Result TEE_GetDataAttribute(const void *buffer, size_t size, uint32_t *attr); |
| |
| /** Clear data attributes. |
| * |
| * @param buffer start address of the data. |
| * |
| * @retval TEE_SUCCESS Pass the check. |
| * @retval TEE_ERROR_BAD_PARAMETERS Parameter error. |
| * @retval TEE_ERROR_BAD_STATE Data attributes is not set. |
| */ |
| TEE_Result TEE_ClearDataAttribute(const void *buffer); |
| |
| /* Memory Transfer Operation */ |
| typedef enum { |
| TEE_MT_COPY, |
| TEE_MT_ENCRYPT, |
| TEE_MT_DECRYPT |
| } TEE_MemoryOperation; |
| |
| /** check memory transfer rights. |
| * |
| * @param dst destination address. |
| * @param dstLen destination data length |
| * @param src source address. |
| * @param srcLen source data length |
| * @param op Operation, see TEE_MemoryOperation. |
| * |
| * @retval TEE_SUCCESS Pass the check. |
| * @retval TEE_ERROR_ACCESS_CONFLICT Can't pass the check, master must not |
| * issue the transfer. |
| * |
| * Examples: |
| * - memory to memory copy: |
| * res = TEE_CheckMemoryTransferRights(dst, dstLen, src, srcLen, |
| * TEE_MT_COPY); |
| * - memory to memory decrypt: |
| * res = TEE_CheckMemoryTransferRights(dst, dstLen, src, srcLen, |
| * TEE_MT_DECRYPT); |
| */ |
| TEE_Result TEE_CheckMemoryTransferRights( |
| const void* dst, |
| uint32_t dstLen, |
| const void* src, |
| uint32_t srcLen, |
| TEE_MemoryOperation op); |
| |
| /* memory access permision, see TZ_Sxx_Nxx in tz_perm.h */ |
| #define TEE_NONSECURE TZ_SRW_NRW |
| #define TEE_SECURE TZ_SRW_NNA |
| #define TEE_RESTRICTED TZ_SNA_NNA |
| |
| /** check memory input rights. |
| * |
| * @param src source address. |
| * @param srcLen source data length |
| * @param dstPerm desitination memory access permission, can be |
| * TEE_NONSECURE, TEE_SECURE. |
| * @param op Operation, see TEE_MemoryOperation. |
| * |
| * @retval TEE_SUCCESS Pass the check. |
| * @retval TEE_ERROR_ACCESS_CONFLICT Can't pass the check, master must not |
| * issue the transfer. |
| * |
| * Examples: |
| * - memory to memory copy: |
| * res = TEE_CheckMemoryInputRights(src, srcLen, |
| * TEE_NONSECURE, TEE_MT_COPY); |
| * - memory to memory decrypt: |
| * res = TEE_CheckMemoryTransferRights(src, srcLen, |
| * TEE_SECURE, TEE_MT_DECRYPT); |
| */ |
| TEE_Result TEE_CheckMemoryInputRights( |
| const void* src, |
| uint32_t srcLen, |
| uint32_t dstPerm, |
| TEE_MemoryOperation op); |
| |
| /** check memory output rights. |
| * |
| * @param dst destination address. |
| * @param dstLen destination data length |
| * @param srcPerm source memory access permission, can be |
| * TEE_NONSECURE, TEE_SECURE. |
| * @param op Operation, see TEE_MemoryOperation. |
| * |
| * @retval TEE_SUCCESS Pass the check. |
| * @retval TEE_ERROR_ACCESS_CONFLICT Can't pass the check, master must not |
| * issue the transfer. |
| * |
| * Examples: |
| * - memory to memory copy: |
| * res = TEE_CheckMemoryOutputRights(dst, dstLen, |
| * TEE_NONSECURE, TEE_MT_COPY); |
| * - memory to memory decrypt: |
| * res = TEE_CheckMemoryTransferRights(dst, dstLen, |
| * TEE_SECURE, TEE_MT_DECRYPT); |
| */ |
| TEE_Result TEE_CheckMemoryOutputRights( |
| const void* dst, |
| uint32_t dstLen, |
| uint32_t srcPerm, |
| TEE_MemoryOperation op); |
| |
| /** User level callback to client. |
| * Callback to client and execute user registered callback |
| * |
| * @param commandID command ID. |
| * @param paramTypes parameter types, see TEE_PARAM_TYPE. |
| * @param params the 4 parameters. here, for memref, it won't |
| * be converted to client virtual address. |
| * @param cancellationRequestTimeout timeout in ms. |
| * @param returnOrigin return origin of the result. |
| * |
| * @retval TEE_SUCCESS Succeed. |
| * @retval TEE_ERROR_* Error code, need check returnOrigin too. |
| */ |
| TEE_Result TEE_Callback( |
| uint32_t commandID, |
| uint32_t paramTypes, |
| TEE_Param params[4], |
| uint32_t cancellationRequestTimeout, |
| uint32_t* returnOrigin); |
| |
| /**System level callback to client. |
| * Callback to client and execute system registered callback |
| * |
| * @param commandID command ID. |
| * @param paramTypes parameter types, see TEE_PARAM_TYPE. |
| * @param params the 4 parameters. here, for memref, it won't |
| * be converted to client virtual address. |
| * @param param_ext extent param. |
| * @param param_ext_size extent param size. |
| * @param returnOrigin return origin of the result. |
| * |
| * @retval TEE_SUCCESS Succeed. |
| * @retval TEE_ERROR_* Error code, need check returnOrigin too. |
| */ |
| TEE_Result TEE_SysCallback( |
| uint32_t commandID, |
| uint32_t paramTypes, |
| TEE_Param params[4], |
| void *param_ext, |
| uint32_t param_ext_size, |
| uint32_t* returnOrigin); |
| |
| /* |
| * Physical/Virtual Address Conversion API |
| */ |
| #define TEE_PhysToVirt(phys) (phys) |
| #define TEE_VirtToPhys(virt) (virt) |
| |
| |
| /* |
| * Cache Operation |
| */ |
| |
| /** invalidate dcache by range. |
| * |
| * @param start virtual start address of region |
| * @param size size of the region |
| */ |
| TEE_Result TEE_InvalidateCache(void *start, size_t size); |
| |
| /** clean dcache by range. |
| * |
| * @param start virtual start address of region |
| * @param size size of region |
| */ |
| TEE_Result TEE_CleanCache(void *start, size_t size); |
| |
| /** clean & invalidate dcache by range. |
| * |
| * Ensure that the data held in the page addr is written back |
| * to the page in question. |
| * @param start virtual start address of region |
| * @param size size of region |
| */ |
| TEE_Result TEE_FlushCache(void *start, size_t size); |
| |
| /** create mutex. |
| * |
| * @param lock return the lock handle. |
| * @param name name of the mutex. |
| * if different modules use same mutex name, |
| * they will share same mutex handle. |
| * if name==NULL, then it would create a new |
| * anonymous mutex. to avoid duplicate name, |
| * it is suggested to use UUID. |
| * |
| * @retval TEE_SUCCESS Success to create the mutex. |
| * @retval TEE_ERROR_* Error code if fail to create the mutex. |
| */ |
| TEE_Result TEE_MutexCreate(void **lock, const char *name); |
| |
| /** destroy mutex. |
| * |
| * @param lock mutex handle. |
| * |
| * @retval TEE_SUCCESS success to destroy the lock. |
| * @retval TEE_ERROR_* Error code if fail to destroy the mutex. |
| */ |
| TEE_Result TEE_MutexDestroy(void *lock); |
| |
| /** lock mutex. |
| * |
| * @param lock mutex handle. |
| * |
| * @retval TEE_SUCCESS success to lock the mutex. |
| * @retval TEE_ERROR_* Error code if fail to lock the mutex. |
| */ |
| TEE_Result TEE_MutexLock(void *lock); |
| |
| /** try to lock mutex. |
| * |
| * @param lock mutex handle. |
| * |
| * @retval TEE_SUCCESS success to trylock the mutex. |
| * @retval TEE_ERROR_BAD_STATE lock is owned by others. |
| * @retval TEE_ERROR_* Error code if fail to trylock the mutex. |
| */ |
| TEE_Result TEE_MutexTryLock(void *lock); |
| |
| /** unlock mutex. |
| * |
| * @param lock mutex handle. |
| * |
| * @retval TEE_SUCCESS success to unlock the mutex. |
| * @retval TEE_ERROR_* Error code if fail to unlock the mutex. |
| */ |
| TEE_Result TEE_MutexUnlock(void *lock); |
| |
| |
| /** create semaphore. |
| * |
| * @param sem return the sem handle. |
| * @param value initial value of the semaphore. |
| * @param name name of the semaphore. |
| * if different modules use same semaphore name, |
| * they will share same semaphore handle. and the initial |
| * value is ignored. to avoid duplicate name, it is suggested |
| * to use UUID. |
| * if name==NULL, then it would create a new |
| * anonymous semaphore. |
| * |
| * @retval TEE_SUCCESS Success to create the semaphore. |
| * @retval TEE_ERROR_* Error code if fail to create the semaphore. |
| */ |
| TEE_Result TEE_SemaphoreCreate(void **sem, int value, const char *name); |
| |
| /** destroy semaphore. |
| * |
| * @param sem semaphore handle. |
| * |
| * @retval TEE_SUCCESS success to destroy the sem. |
| * @retval TEE_ERROR_* Error code if fail to destroy the semaphore. |
| */ |
| TEE_Result TEE_SemaphoreDestroy(void *sem); |
| |
| /** wait semaphore, and decrease the count |
| * |
| * @param sem semaphore handle. |
| * |
| * @retval TEE_SUCCESS success to wait the semaphore. |
| * @retval TEE_ERROR_* Error code if fail to wait the semaphore. |
| */ |
| TEE_Result TEE_SemaphoreWait(void *sem); |
| |
| /** wait semaphore until timeout. |
| * |
| * @param sem semaphore handle. |
| * @param timeout timeout in milliseconds. |
| * |
| * @retval TEE_SUCCESS success to wait the semaphore. |
| * @retval TEE_ERROR_TIMEOUT timeout reached. |
| * @retval TEE_ERROR_* Error code if fail to wait the semaphore. |
| */ |
| TEE_Result TEE_SemaphoreTimedWait(void *sem, uint32_t timeout); |
| |
| /** try to wait semaphore. |
| * |
| * it's similar as TEE_SemaphoreTimedWait(sem, 0). |
| * |
| * @param sem semaphore handle. |
| * |
| * @retval TEE_SUCCESS success to trywait the semaphore. |
| * @retval TEE_ERROR_BAD_STATE sem is owned by others. |
| * @retval TEE_ERROR_* Error code if fail to trywait the semaphore. |
| */ |
| TEE_Result TEE_SemaphoreTryWait(void *sem); |
| |
| /** post semaphore, and increase the count. |
| * |
| * @param sem semaphore handle. |
| * |
| * @retval TEE_SUCCESS success to post the semaphore. |
| * @retval TEE_ERROR_* Error code if fail to post the semaphore. |
| */ |
| TEE_Result TEE_SemaphorePost(void *sem); |
| |
| typedef enum { |
| TEE_BOOT_MODE_NORMAL = 0, /* Normal Boot */ |
| TEE_BOOT_MODE_RECOVERY = 1, /* Recovery Boot */ |
| TEE_BOOT_MODE_MAX |
| } TEE_BootMode; |
| |
| /** Get boot mode. |
| * |
| * @param mode buffer to return boot mode, see TEE_BootMode. |
| * |
| * @retval TEE_SUCCESS success to get the info. |
| */ |
| TEE_Result TEE_GetBootMode(TEE_BootMode *mode); |
| |
| typedef struct { |
| uint32_t commVer; /* Common Version */ |
| uint32_t custVer; /* Customer Version */ |
| } TEE_AntiRollbackInfo; |
| |
| /** Get anti-rollback info. |
| * |
| * @param info buffer to return anti-rollback versions. |
| * |
| * @retval TEE_SUCCESS success to get the info. |
| */ |
| TEE_Result TEE_GetAntiRollbackInfo(TEE_AntiRollbackInfo *info); |
| |
| /** Verify BCM image. |
| * |
| * @param in buffer to keep the enced image. |
| * @param inLen length of the enced image |
| * @param out buffer to keep the decrypted image |
| * @param outLen buffer to keep the return length |
| * |
| * @retval TEE_SUCCESS success to get the info. |
| * @retval TZ_ERROR_BAD_PARAMETERS invalid parameters. |
| */ |
| TEE_Result TEE_VerifyImage(const void *in, uint32_t inLen, void *out, |
| uint32_t *outLen, uint32_t codeType); |
| |
| /** send command to secure processor and wait until its completion |
| * |
| * @param cmd_id command ID |
| * @param param buffer of the input param |
| * @param param_len parameter length |
| * @param result buffer to keep the result |
| * @param result_len result length |
| * |
| * @retval TEE_SUCCESS success to get the info. |
| */ |
| TEE_Result TEE_ExecCmd(size_t cmd_id, const void *param, size_t param_len, |
| const void *result, size_t result_len); |
| |
| /** allocate shared memory. |
| * |
| * @param name shared memory name. NULL for anonymous. |
| * if it's not NULL, it tries to find the named shared |
| * memory first. |
| * @param len shared memory size in bytes. |
| * @param align alignment size. |
| * @param shmFlags reserved for permissions. |
| * @param shm buffer to return the shm handle. |
| * |
| * @retval TEE_SUCCESS success. |
| * @retval TEE_ERROR_BAD_PARAMETERS invalid parameters. |
| * @retval TEE_ERROR_OUT_OF_MEMORY out of memory. |
| */ |
| TEE_Result TEE_AllocateSharedMemory(const char *name, size_t len, |
| size_t align, uint32_t shmFlags, TEE_ObjectHandle *shm); |
| |
| /** release shared memory. |
| * |
| * @param shm shm handle to release. |
| * |
| * @retval TEE_SUCCESS success. |
| * @retval TEE_ERROR_BAD_PARAMETERS shm == NULL. |
| * @retval TEE_ERROR_ITEM_NOT_FOUND the shared memory handle is invalid. |
| */ |
| TEE_Result TEE_ReleaseSharedMemory(TEE_ObjectHandle shm); |
| |
| /** retrieve shared memory ID with shared memory handle. |
| * |
| * @param shm shm handle. |
| * @param shmID buffer to return shared memory ID, which can be shared |
| * cross TA instances. |
| * |
| * @retval TEE_SUCCESS success. |
| * @retval TEE_ERROR_BAD_PARAMETERS shm == NULL or shmID == NULL. |
| * @retval TEE_ERROR_ITEM_NOT_FOUND the shared memory handle is invalid. |
| */ |
| TEE_Result TEE_RetrieveSharedMemoryID(TEE_ObjectHandle shm, uint32_t *shmID); |
| |
| /** register shared memory with shared memory ID. |
| * must call TEE_RegisterSharedMemory() to release it after use it. |
| * |
| * @param shmID Shared memory ID shared from other TA instance. |
| * @param shm buffer to return the shm handle. |
| * |
| * @retval TEE_SUCCESS success. |
| * @retval TEE_ERROR_BAD_PARAMETERS shm == NULL |
| * @retval TEE_ERROR_ITEM_NOT_FOUND the shared memory ID is invalid. |
| */ |
| TEE_Result TEE_RegisterSharedMemory(uint32_t shmID, TEE_ObjectHandle *shm); |
| |
| /** map shared memory to current TA virtual memory space. |
| * |
| * @param shm shm handle. |
| * @param offset start offset of the shared memory to map. |
| * @param len length to map. 0 to map whole shm. |
| * @param va buffer to return the mapped virtual address. |
| * |
| * @retval TEE_SUCCESS success. |
| * @retval TEE_ERROR_BAD_PARAMETERS shm == NULL or va == NULL. |
| * @retval TEE_ERROR_ITEM_NOT_FOUND the shared memory handle is invalid. |
| */ |
| TEE_Result TEE_MapSharedMemory(TEE_ObjectHandle shm, size_t offset, |
| size_t len, void **va); |
| |
| /** unmap shared memory from current TA virtual memory space. |
| * |
| * @param shm shm handle. |
| * @param va virtual address to unmap. |
| * @param len length to unmap. |
| * |
| * @retval TEE_SUCCESS success. |
| * @retval TEE_ERROR_BAD_PARAMETERS shm == NULL or va == NULL. |
| * @retval TEE_ERROR_ITEM_NOT_FOUND the shared memory handle is invalid. |
| */ |
| TEE_Result TEE_UnmapSharedMemory(TEE_ObjectHandle shm, void *va, size_t len); |
| |
| /** RPMB set key |
| * |
| * @param key the rpmb key |
| * @retval TEE_SUCCESS return TEE_SUCCESS |
| */ |
| TEE_Result TEE_RPMB_SetKey(uint8_t *key); |
| |
| /** RPMB read block |
| * |
| * @param devName name of rpmb device, eg: /dev/block/rpmb |
| * @param addr the address of rpmb write,unit is 256B |
| * @param data the data read from rpmb |
| * @param len size of data in bytes |
| * @retval TEE_SUCCESS return TEE_SUCCESS |
| */ |
| TEE_Result TEE_RPMB_Read(const char *devName, |
| uint16_t addr, |
| uint8_t *data, |
| uint32_t len); |
| /** RPMB write block |
| * |
| * @param addr the address of rpmb write,unit is 256B |
| * @param data the data write to rpmb |
| * @parm len the len of data, size should be <= 256 |
| * @retval TEE_SUCCESS return TEE_SUCCESS |
| */ |
| TEE_Result TEE_RPMB_Write(const char *devName, |
| uint16_t addr, |
| uint8_t *data, |
| uint32_t len); |
| |
| /** Get SOC property from OTP |
| * |
| * @param propIndex property index |
| * @param propType property type |
| * @parm propData returned property data |
| * @retval TEE_SUCCESS return TEE_SUCCESS |
| */ |
| TEE_Result TEE_GetOtpProperty(uint32_t index, |
| uint8_t type, |
| otp_property *prop); |
| #endif /* _TEE_INTERNAL_PRIVATE_API_H_ */ |