test.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. #include <linux/module.h>
  2. #include <linux/types.h>
  3. #include <linux/slab.h>
  4. #include <linux/kthread.h>
  5. #include <linux/freezer.h>
  6. #include "tz_cross/trustzone.h"
  7. #include "tz_cross/ta_test.h"
  8. #include "tz_cross/ta_mem.h"
  9. #include "trustzone/kree/system.h"
  10. #include "trustzone/kree/mem.h"
  11. #include "kree_int.h"
  12. uint32_t TEECK_Test_Add(KREE_SESSION_HANDLE session, uint32_t a, uint32_t b)
  13. {
  14. MTEEC_PARAM param[4];
  15. uint32_t paramTypes;
  16. TZ_RESULT ret;
  17. param[0].value.a = a;
  18. param[1].value.a = b;
  19. paramTypes = TZ_ParamTypes3(TZPT_VALUE_INPUT, TZPT_VALUE_INPUT,
  20. TZPT_VALUE_OUTPUT);
  21. ret = KREE_TeeServiceCall(session, TZCMD_TEST_ADD, paramTypes, param);
  22. if (ret != TZ_RESULT_SUCCESS) {
  23. pr_warn("ServiceCall error %d\n", ret);
  24. param[2].value.a = 0;
  25. }
  26. return param[2].value.a;
  27. }
  28. void tz_test(void)
  29. {
  30. TZ_RESULT ret;
  31. KREE_SESSION_HANDLE test_session;
  32. KREE_SESSION_HANDLE mem_session;
  33. KREE_SECUREMEM_HANDLE mem_handle;
  34. KREE_SHAREDMEM_HANDLE shm_handle;
  35. KREE_SHAREDMEM_PARAM shm_param;
  36. uint32_t result;
  37. struct timespec start, end;
  38. long long ns;
  39. int i;
  40. MTEEC_PARAM param[4];
  41. uint32_t *ptr;
  42. int size;
  43. ret = KREE_CreateSession(TZ_TA_TEST_UUID, &test_session);
  44. if (ret != TZ_RESULT_SUCCESS) {
  45. pr_warn("CreateSession error %d\n", ret);
  46. return;
  47. }
  48. result = TEECK_Test_Add(test_session, 10, 20);
  49. pr_debug("tz_test TZCMD_TEST_ADD %d\n", result);
  50. /* / Time test. */
  51. getnstimeofday(&start);
  52. for (i = 0; i < 100; i++)
  53. result = TEECK_Test_Add(test_session, 10, 20);
  54. getnstimeofday(&end);
  55. ns = ((long long)end.tv_sec - start.tv_sec) * 1000000000 +
  56. (end.tv_nsec - start.tv_nsec);
  57. pr_debug("100 times TEST_ADD %lld ns\n", ns);
  58. ret = KREE_CreateSession(TZ_TA_MEM_UUID, &mem_session);
  59. if (ret != TZ_RESULT_SUCCESS) {
  60. pr_warn("Create memory session error %d\n", ret);
  61. return;
  62. }
  63. pr_debug("test A\n");
  64. size = 4 * 1024;
  65. ptr = kmalloc(size, GFP_KERNEL);
  66. shm_param.buffer = ptr;
  67. shm_param.size = size;
  68. ret = KREE_RegisterSharedmem(mem_session, &shm_handle, &shm_param);
  69. if (ret != TZ_RESULT_SUCCESS) {
  70. pr_warn("KREE_RegisterSharedmem Error: %s\n",
  71. TZ_GetErrorString(ret));
  72. return;
  73. }
  74. pr_debug("shm handle = 0x%x\n", shm_handle);
  75. for (i = 0; i < 4 * 1024 / 4; i++)
  76. ptr[i] = i;
  77. param[0].memref.handle = (uint32_t) shm_handle;
  78. param[0].memref.offset = 0;
  79. param[0].memref.size = 4 * 1024;
  80. param[1].value.a = (4 * 1024) / 4;
  81. ret = KREE_TeeServiceCall(test_session, TZCMD_TEST_ADD_MEM,
  82. TZ_ParamTypes3(TZPT_MEMREF_INPUT,
  83. TZPT_VALUE_INPUT,
  84. TZPT_VALUE_OUTPUT),
  85. param);
  86. if (ret != TZ_RESULT_SUCCESS) {
  87. pr_warn("TZCMD_TEST_ADD_MEM error %d\n", ret);
  88. return;
  89. }
  90. pr_debug("KREE ADD MEM result = 0x%x\n", param[2].value.a);
  91. ret = KREE_AllocSecuremem(mem_session, &mem_handle, 0, 1024);
  92. if (ret != TZ_RESULT_SUCCESS) {
  93. pr_warn("Secure memory allocate error %d\n", ret);
  94. return;
  95. }
  96. param[0].value.a = (uint32_t) mem_handle;
  97. ret = KREE_TeeServiceCall(test_session, TZCMD_TEST_DO_A,
  98. TZ_ParamTypes3(TZPT_VALUE_INPUT,
  99. TZPT_VALUE_OUTPUT,
  100. TZPT_VALUE_OUTPUT),
  101. param);
  102. pr_debug("Do A = 0x%x, 0x%x (%d)\n",
  103. param[1].value.a, param[2].value.a, ret);
  104. ret = KREE_ReferenceSecuremem(mem_session, mem_handle);
  105. if (ret != TZ_RESULT_SUCCESS)
  106. pr_warn("KREE_ReferenceSecuremem Error: %d\n", ret);
  107. param[0].value.a = (uint32_t) mem_handle;
  108. ret = KREE_TeeServiceCall(test_session, TZCMD_TEST_DO_B,
  109. TZ_ParamTypes3(TZPT_VALUE_INPUT,
  110. TZPT_VALUE_OUTPUT,
  111. TZPT_VALUE_OUTPUT),
  112. param);
  113. pr_debug("Do B = 0x%x, 0x%x (%d)\n",
  114. param[1].value.a, param[2].value.a, ret);
  115. /* Free/Unreference secure memory */
  116. ret = KREE_UnreferenceSecuremem(mem_session, mem_handle);
  117. if (ret != TZ_RESULT_SUCCESS)
  118. pr_warn("KREE_UnReferenceSecureMem Error 1: %d\n", ret);
  119. ret = KREE_UnreferenceSecuremem(mem_session, mem_handle);
  120. if (ret != TZ_RESULT_SUCCESS)
  121. pr_warn("KREE_UnReferenceSecureMem Error 2: %d\n", ret);
  122. ret = KREE_UnregisterSharedmem(mem_session, shm_handle);
  123. if (ret != TZ_RESULT_SUCCESS) {
  124. pr_warn("KREE_UnregisterSharedmem Error: %s\n",
  125. TZ_GetErrorString(ret));
  126. return;
  127. }
  128. ret = KREE_CloseSession(test_session);
  129. if (ret != TZ_RESULT_SUCCESS)
  130. pr_warn("CloseSession error %d\n", ret);
  131. ret = KREE_CloseSession(mem_session);
  132. if (ret != TZ_RESULT_SUCCESS)
  133. pr_warn("Close memory session error %d\n", ret);
  134. pr_debug("KREE test done!!!!\n");
  135. }