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