1 /*
2 * Copyright (c) 2006-2021, RT-Thread Development Team
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Change Logs:
7 * Date Author Notes
8 * 2019-10-28 tyx the first version.
9 */
10
11 #include <rtthread.h>
12
13 #ifdef ARM_CM33_ENABLE_TRUSTZONE
14 extern void TZ_InitContextSystem_S(void);
15 extern rt_uint32_t TZ_AllocModuleContext_S (rt_uint32_t module);
16 extern rt_uint32_t TZ_FreeModuleContext_S(rt_uint32_t id);
17 extern rt_uint32_t TZ_LoadContext_S(rt_uint32_t id);
18 extern rt_uint32_t TZ_StoreContext_S(rt_uint32_t id);
19 #else
TZ_InitContextSystem_S(void)20 void TZ_InitContextSystem_S(void){}
TZ_AllocModuleContext_S(rt_uint32_t module)21 rt_uint32_t TZ_AllocModuleContext_S (rt_uint32_t module){return 0;}
TZ_FreeModuleContext_S(rt_uint32_t id)22 rt_uint32_t TZ_FreeModuleContext_S(rt_uint32_t id) {return 0;}
TZ_LoadContext_S(rt_uint32_t id)23 rt_uint32_t TZ_LoadContext_S(rt_uint32_t id){return 0;};
TZ_StoreContext_S(rt_uint32_t id)24 rt_uint32_t TZ_StoreContext_S(rt_uint32_t id){return 0;};
25 #endif
26 extern int tzcall(int id, rt_ubase_t arg0, rt_ubase_t arg1, rt_ubase_t arg2);
27
28 #define TZ_INIT_CONTEXT_ID (0x1001)
29 #define TZ_ALLOC_CONTEXT_ID (0x1002)
30 #define TZ_FREE_CONTEXT_ID (0x1003)
31
32 rt_ubase_t rt_trustzone_current_context;
33
rt_trustzone_init(void)34 void rt_trustzone_init(void)
35 {
36 static rt_uint8_t _init;
37
38 if (_init)
39 return;
40 tzcall(TZ_INIT_CONTEXT_ID, 0, 0, 0);
41 _init = 1;
42 }
43
rt_trustzone_enter(rt_ubase_t module)44 rt_err_t rt_trustzone_enter(rt_ubase_t module)
45 {
46 rt_trustzone_init();
47 if (tzcall(TZ_ALLOC_CONTEXT_ID, module, 0, 0))
48 {
49 return RT_EOK;
50 }
51 return -RT_ERROR;
52 }
53
rt_trustzone_exit(void)54 rt_err_t rt_trustzone_exit(void)
55 {
56 tzcall(TZ_FREE_CONTEXT_ID, 0, 0, 0);
57 return RT_EOK;
58 }
59
rt_trustzone_context_store(rt_ubase_t context)60 void rt_trustzone_context_store(rt_ubase_t context)
61 {
62 TZ_StoreContext_S(context);
63 }
64
rt_trustzone_context_load(rt_ubase_t context)65 void rt_trustzone_context_load(rt_ubase_t context)
66 {
67 TZ_LoadContext_S(context);
68 }
69
rt_secure_svc_handle(int svc_id,rt_ubase_t arg0,rt_ubase_t arg1,rt_ubase_t arg2)70 int rt_secure_svc_handle(int svc_id, rt_ubase_t arg0, rt_ubase_t arg1, rt_ubase_t arg2)
71 {
72 int res = 0;
73
74 switch (svc_id)
75 {
76 case TZ_INIT_CONTEXT_ID:
77 TZ_InitContextSystem_S();
78 break;
79 case TZ_ALLOC_CONTEXT_ID:
80 res = TZ_AllocModuleContext_S(arg0);
81 if (res <= 0)
82 {
83 rt_kprintf("Alloc Context Failed\n");
84 }
85 else
86 {
87 rt_trustzone_current_context = res;
88 TZ_LoadContext_S(res);
89 }
90 break;
91 case TZ_FREE_CONTEXT_ID:
92 TZ_FreeModuleContext_S(rt_trustzone_current_context);
93 rt_trustzone_current_context = 0;
94 break;
95 }
96 return res;
97 }
98
99