trustzone.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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. #if defined(__CC_ARM)
  30. static __inline rt_uint32_t __get_IPSR(void)
  31. {
  32. register rt_uint32_t result __asm("ipsr");
  33. return(result);
  34. }
  35. #elif defined(__clang__)
  36. __attribute__((always_inline)) static __inline rt_uint32_t __get_IPSR(void)
  37. {
  38. rt_uint32_t result;
  39. __asm volatile ("MRS %0, ipsr" : "=r" (result) );
  40. return(result);
  41. }
  42. #elif defined(__IAR_SYSTEMS_ICC__)
  43. _Pragma("inline=forced") static inline int __get_IPSR(int value)
  44. {
  45. rt_uint32_t result;
  46. asm("MRS %0, ipsr" : "=r"(result));
  47. return result;
  48. }
  49. #elif defined(__GNUC__)
  50. __attribute__((always_inline)) static inline rt_uint32_t __get_IPSR(void)
  51. {
  52. rt_uint32_t result;
  53. __asm volatile ("MRS %0, ipsr" : "=r" (result) );
  54. return(result);
  55. }
  56. #endif
  57. void rt_trustzone_init(void)
  58. {
  59. static rt_uint8_t _init;
  60. if (_init)
  61. return;
  62. tzcall(TZ_INIT_CONTEXT_ID, 0, 0, 0);
  63. _init = 1;
  64. }
  65. rt_err_t rt_trustzone_enter(rt_ubase_t module)
  66. {
  67. rt_trustzone_init();
  68. if (tzcall(TZ_ALLOC_CONTEXT_ID, module, 0, 0))
  69. {
  70. return RT_EOK;
  71. }
  72. return -RT_ERROR;
  73. }
  74. rt_err_t rt_trustzone_exit(void)
  75. {
  76. tzcall(TZ_FREE_CONTEXT_ID, 0, 0, 0);
  77. return RT_EOK;
  78. }
  79. void rt_trustzone_context_store(rt_ubase_t context)
  80. {
  81. TZ_StoreContext_S(context);
  82. }
  83. void rt_trustzone_context_load(rt_ubase_t context)
  84. {
  85. TZ_LoadContext_S(context);
  86. }
  87. int rt_secure_svc_handle(int svc_id, rt_ubase_t arg0, rt_ubase_t arg1, rt_ubase_t arg2)
  88. {
  89. rt_ubase_t tmp;
  90. int res = 0;
  91. switch (svc_id)
  92. {
  93. case TZ_INIT_CONTEXT_ID:
  94. TZ_InitContextSystem_S();
  95. break;
  96. case TZ_ALLOC_CONTEXT_ID:
  97. res = TZ_AllocModuleContext_S(arg0);
  98. if (res <= 0)
  99. {
  100. rt_kprintf("Alloc Context Failed\n");
  101. }
  102. else
  103. {
  104. rt_trustzone_current_context = res;
  105. TZ_LoadContext_S(res);
  106. }
  107. break;
  108. case TZ_FREE_CONTEXT_ID:
  109. TZ_FreeModuleContext_S(rt_trustzone_current_context);
  110. rt_trustzone_current_context = 0;
  111. break;
  112. }
  113. return res;
  114. }