1
0

trustzone.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /*
  2. * Copyright (c) 2006-2019, 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. extern void TZ_InitContextSystem_S(void);
  12. extern rt_uint32_t TZ_AllocModuleContext_S (rt_uint32_t module);
  13. extern rt_uint32_t TZ_FreeModuleContext_S(rt_uint32_t id);
  14. extern rt_uint32_t TZ_LoadContext_S(rt_uint32_t id);
  15. extern rt_uint32_t TZ_StoreContext_S(rt_uint32_t id);
  16. extern int tzcall(int id, rt_ubase_t arg0, rt_ubase_t arg1, rt_ubase_t arg2);
  17. #define TZ_INIT_CONTEXT_ID (0x1001)
  18. #define TZ_ALLOC_CONTEXT_ID (0x1002)
  19. #define TZ_FREE_CONTEXT_ID (0x1003)
  20. rt_ubase_t rt_trustzone_current_context;
  21. #if defined(__CC_ARM)
  22. static __inline rt_uint32_t __get_IPSR(void)
  23. {
  24. register rt_uint32_t result __asm("ipsr");
  25. return(result);
  26. }
  27. #elif defined(__CLANG_ARM)
  28. __attribute__((always_inline)) static __inline rt_uint32_t __get_IPSR(void)
  29. {
  30. rt_uint32_t result;
  31. __asm volatile ("MRS %0, ipsr" : "=r" (result) );
  32. return(result);
  33. }
  34. #elif defined(__IAR_SYSTEMS_ICC__)
  35. _Pragma("inline=forced") static inline int __get_IPSR(int value)
  36. {
  37. rt_uint32_t result;
  38. asm("MRS %0, ipsr" : "=r"(result));
  39. return result;
  40. }
  41. #elif defined(__GNUC__)
  42. __attribute__((always_inline)) static inline rt_uint32_t __get_IPSR(void)
  43. {
  44. rt_uint32_t result;
  45. __asm volatile ("MRS %0, ipsr" : "=r" (result) );
  46. return(result);
  47. }
  48. #endif
  49. void rt_trustzone_init(void)
  50. {
  51. static rt_uint8_t _init;
  52. if (_init)
  53. return;
  54. tzcall(TZ_INIT_CONTEXT_ID, 0, 0, 0);
  55. _init = 1;
  56. }
  57. rt_err_t rt_trustzone_enter(rt_ubase_t module)
  58. {
  59. rt_trustzone_init();
  60. if (tzcall(TZ_ALLOC_CONTEXT_ID, module, 0, 0))
  61. {
  62. return RT_EOK;
  63. }
  64. return -RT_ERROR;
  65. }
  66. rt_err_t rt_trustzone_exit(void)
  67. {
  68. tzcall(TZ_FREE_CONTEXT_ID, 0, 0, 0);
  69. return RT_EOK;
  70. }
  71. void rt_trustzone_context_store(rt_ubase_t context)
  72. {
  73. TZ_StoreContext_S(context);
  74. }
  75. void rt_trustzone_context_load(rt_ubase_t context)
  76. {
  77. TZ_LoadContext_S(context);
  78. }
  79. int rt_secure_svc_handle(int svc_id, rt_ubase_t arg0, rt_ubase_t arg1, rt_ubase_t arg2)
  80. {
  81. rt_ubase_t tmp;
  82. int res = 0;
  83. switch (svc_id)
  84. {
  85. case TZ_INIT_CONTEXT_ID:
  86. TZ_InitContextSystem_S();
  87. break;
  88. case TZ_ALLOC_CONTEXT_ID:
  89. res = TZ_AllocModuleContext_S(arg0);
  90. if (res <= 0)
  91. {
  92. rt_kprintf("Alloc Context Failed\n");
  93. }
  94. else
  95. {
  96. rt_trustzone_current_context = res;
  97. TZ_LoadContext_S(res);
  98. }
  99. break;
  100. case TZ_FREE_CONTEXT_ID:
  101. TZ_FreeModuleContext_S(rt_trustzone_current_context);
  102. rt_trustzone_current_context = 0;
  103. break;
  104. }
  105. return res;
  106. }