trustzone.c 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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. #include <rtthread.h>
  11. #ifdef ARM_CM33_ENABLE_TRUSTZONE
  12. extern void TZ_InitContextSystem_S(void);
  13. extern rt_uint32_t TZ_AllocModuleContext_S (rt_uint32_t module);
  14. extern rt_uint32_t TZ_FreeModuleContext_S(rt_uint32_t id);
  15. extern rt_uint32_t TZ_LoadContext_S(rt_uint32_t id);
  16. extern rt_uint32_t TZ_StoreContext_S(rt_uint32_t id);
  17. #else
  18. void TZ_InitContextSystem_S(void){}
  19. rt_uint32_t TZ_AllocModuleContext_S (rt_uint32_t module){return 0;}
  20. rt_uint32_t TZ_FreeModuleContext_S(rt_uint32_t id) {return 0;}
  21. rt_uint32_t TZ_LoadContext_S(rt_uint32_t id){return 0;};
  22. rt_uint32_t TZ_StoreContext_S(rt_uint32_t id){return 0;};
  23. #endif
  24. extern int tzcall(int id, rt_ubase_t arg0, rt_ubase_t arg1, rt_ubase_t arg2);
  25. #define TZ_INIT_CONTEXT_ID (0x1001)
  26. #define TZ_ALLOC_CONTEXT_ID (0x1002)
  27. #define TZ_FREE_CONTEXT_ID (0x1003)
  28. rt_ubase_t rt_trustzone_current_context;
  29. void rt_trustzone_init(void)
  30. {
  31. static rt_uint8_t _init;
  32. if (_init)
  33. return;
  34. tzcall(TZ_INIT_CONTEXT_ID, 0, 0, 0);
  35. _init = 1;
  36. }
  37. rt_err_t rt_trustzone_enter(rt_ubase_t module)
  38. {
  39. rt_trustzone_init();
  40. if (tzcall(TZ_ALLOC_CONTEXT_ID, module, 0, 0))
  41. {
  42. return RT_EOK;
  43. }
  44. return -RT_ERROR;
  45. }
  46. rt_err_t rt_trustzone_exit(void)
  47. {
  48. tzcall(TZ_FREE_CONTEXT_ID, 0, 0, 0);
  49. return RT_EOK;
  50. }
  51. void rt_trustzone_context_store(rt_ubase_t context)
  52. {
  53. TZ_StoreContext_S(context);
  54. }
  55. void rt_trustzone_context_load(rt_ubase_t context)
  56. {
  57. TZ_LoadContext_S(context);
  58. }
  59. int rt_secure_svc_handle(int svc_id, rt_ubase_t arg0, rt_ubase_t arg1, rt_ubase_t arg2)
  60. {
  61. int res = 0;
  62. switch (svc_id)
  63. {
  64. case TZ_INIT_CONTEXT_ID:
  65. TZ_InitContextSystem_S();
  66. break;
  67. case TZ_ALLOC_CONTEXT_ID:
  68. res = TZ_AllocModuleContext_S(arg0);
  69. if (res <= 0)
  70. {
  71. rt_kprintf("Alloc Context Failed\n");
  72. }
  73. else
  74. {
  75. rt_trustzone_current_context = res;
  76. TZ_LoadContext_S(res);
  77. }
  78. break;
  79. case TZ_FREE_CONTEXT_ID:
  80. TZ_FreeModuleContext_S(rt_trustzone_current_context);
  81. rt_trustzone_current_context = 0;
  82. break;
  83. }
  84. return res;
  85. }