RT-Thread_v4.1.1
This commit is contained in:
98
libcpu/arm/cortex-m33/trustzone.c
Normal file
98
libcpu/arm/cortex-m33/trustzone.c
Normal file
@ -0,0 +1,98 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2021, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2019-10-28 tyx the first version.
|
||||
*/
|
||||
|
||||
#include <rtthread.h>
|
||||
|
||||
#ifdef ARM_CM33_ENABLE_TRUSTZONE
|
||||
extern void TZ_InitContextSystem_S(void);
|
||||
extern rt_uint32_t TZ_AllocModuleContext_S (rt_uint32_t module);
|
||||
extern rt_uint32_t TZ_FreeModuleContext_S(rt_uint32_t id);
|
||||
extern rt_uint32_t TZ_LoadContext_S(rt_uint32_t id);
|
||||
extern rt_uint32_t TZ_StoreContext_S(rt_uint32_t id);
|
||||
#else
|
||||
void TZ_InitContextSystem_S(void){}
|
||||
rt_uint32_t TZ_AllocModuleContext_S (rt_uint32_t module){return 0;}
|
||||
rt_uint32_t TZ_FreeModuleContext_S(rt_uint32_t id) {return 0;}
|
||||
rt_uint32_t TZ_LoadContext_S(rt_uint32_t id){return 0;};
|
||||
rt_uint32_t TZ_StoreContext_S(rt_uint32_t id){return 0;};
|
||||
#endif
|
||||
extern int tzcall(int id, rt_ubase_t arg0, rt_ubase_t arg1, rt_ubase_t arg2);
|
||||
|
||||
#define TZ_INIT_CONTEXT_ID (0x1001)
|
||||
#define TZ_ALLOC_CONTEXT_ID (0x1002)
|
||||
#define TZ_FREE_CONTEXT_ID (0x1003)
|
||||
|
||||
rt_ubase_t rt_trustzone_current_context;
|
||||
|
||||
void rt_trustzone_init(void)
|
||||
{
|
||||
static rt_uint8_t _init;
|
||||
|
||||
if (_init)
|
||||
return;
|
||||
tzcall(TZ_INIT_CONTEXT_ID, 0, 0, 0);
|
||||
_init = 1;
|
||||
}
|
||||
|
||||
rt_err_t rt_trustzone_enter(rt_ubase_t module)
|
||||
{
|
||||
rt_trustzone_init();
|
||||
if (tzcall(TZ_ALLOC_CONTEXT_ID, module, 0, 0))
|
||||
{
|
||||
return RT_EOK;
|
||||
}
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
rt_err_t rt_trustzone_exit(void)
|
||||
{
|
||||
tzcall(TZ_FREE_CONTEXT_ID, 0, 0, 0);
|
||||
return RT_EOK;
|
||||
}
|
||||
|
||||
void rt_trustzone_context_store(rt_ubase_t context)
|
||||
{
|
||||
TZ_StoreContext_S(context);
|
||||
}
|
||||
|
||||
void rt_trustzone_context_load(rt_ubase_t context)
|
||||
{
|
||||
TZ_LoadContext_S(context);
|
||||
}
|
||||
|
||||
int rt_secure_svc_handle(int svc_id, rt_ubase_t arg0, rt_ubase_t arg1, rt_ubase_t arg2)
|
||||
{
|
||||
int res = 0;
|
||||
|
||||
switch (svc_id)
|
||||
{
|
||||
case TZ_INIT_CONTEXT_ID:
|
||||
TZ_InitContextSystem_S();
|
||||
break;
|
||||
case TZ_ALLOC_CONTEXT_ID:
|
||||
res = TZ_AllocModuleContext_S(arg0);
|
||||
if (res <= 0)
|
||||
{
|
||||
rt_kprintf("Alloc Context Failed\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
rt_trustzone_current_context = res;
|
||||
TZ_LoadContext_S(res);
|
||||
}
|
||||
break;
|
||||
case TZ_FREE_CONTEXT_ID:
|
||||
TZ_FreeModuleContext_S(rt_trustzone_current_context);
|
||||
rt_trustzone_current_context = 0;
|
||||
break;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
Reference in New Issue
Block a user