kree_mem.c 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. #include <trustzone/kree/mem.h>
  2. #include "trustzone/kree/system.h"
  3. #include <tz_cross/ta_mem.h>
  4. #include <linux/mm.h>
  5. #define DBG_KREE_MEM
  6. /* notiec: handle type is the same */
  7. static inline TZ_RESULT _allocFunc(uint32_t cmd, KREE_SESSION_HANDLE session,
  8. uint32_t *mem_handle, uint32_t alignment,
  9. uint32_t size, char *dbg)
  10. {
  11. MTEEC_PARAM p[4];
  12. TZ_RESULT ret;
  13. if ((session == 0) || (mem_handle == NULL) || (size == 0))
  14. return TZ_RESULT_ERROR_BAD_PARAMETERS;
  15. p[0].value.a = alignment;
  16. p[1].value.a = size;
  17. ret = KREE_TeeServiceCall(session, cmd,
  18. TZ_ParamTypes3(TZPT_VALUE_INPUT,
  19. TZPT_VALUE_INPUT,
  20. TZPT_VALUE_OUTPUT),
  21. p);
  22. if (ret != TZ_RESULT_SUCCESS) {
  23. #ifdef DBG_KREE_MEM
  24. pr_debug("[kree] %s Error: %d\n", dbg, ret);
  25. #endif
  26. return ret;
  27. }
  28. *mem_handle = (KREE_SECUREMEM_HANDLE) p[2].value.a;
  29. return TZ_RESULT_SUCCESS;
  30. }
  31. static inline TZ_RESULT _handleOpFunc(uint32_t cmd, KREE_SESSION_HANDLE session,
  32. uint32_t mem_handle, char *dbg)
  33. {
  34. MTEEC_PARAM p[4];
  35. TZ_RESULT ret;
  36. if ((session == 0) || (mem_handle == 0))
  37. return TZ_RESULT_ERROR_BAD_PARAMETERS;
  38. p[0].value.a = (uint32_t) mem_handle;
  39. ret = KREE_TeeServiceCall(session, cmd,
  40. TZ_ParamTypes1(TZPT_VALUE_INPUT), p);
  41. if (ret < 0) {
  42. #ifdef DBG_KREE_MEM
  43. pr_debug("[kree] %s Error: %d\n", dbg, ret);
  44. #endif
  45. return ret;
  46. }
  47. return TZ_RESULT_SUCCESS;
  48. }
  49. static inline TZ_RESULT _handleOpFunc_1(uint32_t cmd,
  50. KREE_SESSION_HANDLE session,
  51. uint32_t mem_handle, uint32_t *count,
  52. char *dbg)
  53. {
  54. MTEEC_PARAM p[4];
  55. TZ_RESULT ret;
  56. if ((session == 0) || (mem_handle == 0) || (count == NULL))
  57. return TZ_RESULT_ERROR_BAD_PARAMETERS;
  58. p[0].value.a = (uint32_t) mem_handle;
  59. ret = KREE_TeeServiceCall(session, cmd,
  60. TZ_ParamTypes2(TZPT_VALUE_INPUT,
  61. TZPT_VALUE_OUTPUT),
  62. p);
  63. if (ret < 0) {
  64. #ifdef DBG_KREE_MEM
  65. pr_debug("[kree] %s Error: %d\n", dbg, ret);
  66. #endif
  67. *count = 0;
  68. return ret;
  69. }
  70. *count = p[1].value.a;
  71. return TZ_RESULT_SUCCESS;
  72. }
  73. TZ_RESULT kree_register_sharedmem(KREE_SESSION_HANDLE session,
  74. KREE_SHAREDMEM_HANDLE *mem_handle,
  75. void *start, uint32_t size, void *map_p)
  76. {
  77. MTEEC_PARAM p[4];
  78. TZ_RESULT ret;
  79. p[0].value.a = (unsigned long)start;
  80. p[0].value.b = (unsigned long long)(unsigned long)start >> 32;
  81. p[1].value.a = size;
  82. p[2].mem.buffer = map_p;
  83. if (map_p != NULL)
  84. p[2].mem.size = ((*(uint32_t *)map_p)+1)*sizeof(uint32_t);
  85. else
  86. p[2].mem.size = 0;
  87. ret = KREE_TeeServiceCall(session, TZCMD_MEM_SHAREDMEM_REG,
  88. TZ_ParamTypes4(TZPT_VALUE_INPUT,
  89. TZPT_VALUE_INPUT,
  90. TZPT_MEM_INPUT,
  91. TZPT_VALUE_OUTPUT),
  92. p);
  93. if (ret != TZ_RESULT_SUCCESS) {
  94. *mem_handle = 0;
  95. return ret;
  96. }
  97. *mem_handle = p[3].value.a;
  98. return TZ_RESULT_SUCCESS;
  99. }
  100. TZ_RESULT kree_unregister_sharedmem(KREE_SESSION_HANDLE session,
  101. KREE_SHAREDMEM_HANDLE mem_handle)
  102. {
  103. MTEEC_PARAM p[4];
  104. TZ_RESULT ret;
  105. p[0].value.a = (uint32_t) mem_handle;
  106. ret = KREE_TeeServiceCall(session, TZCMD_MEM_SHAREDMEM_UNREG,
  107. TZ_ParamTypes1(TZPT_VALUE_INPUT), p);
  108. return ret;
  109. }
  110. /* APIs
  111. */
  112. TZ_RESULT KREE_RegisterSharedmem(KREE_SESSION_HANDLE session,
  113. KREE_SHAREDMEM_HANDLE *shm_handle,
  114. KREE_SHAREDMEM_PARAM *param)
  115. {
  116. TZ_RESULT ret;
  117. if ((session == 0) || (shm_handle == NULL) ||
  118. (param->buffer == NULL) || (param->size == 0))
  119. return TZ_RESULT_ERROR_BAD_PARAMETERS;
  120. /* only for kmalloc */
  121. if ((param->buffer >= (void *)PAGE_OFFSET) &&
  122. (param->buffer < high_memory)) {
  123. ret = kree_register_sharedmem(session, shm_handle,
  124. param->buffer, param->size,
  125. 0); /* set 0 for no remap... */
  126. if (ret != TZ_RESULT_SUCCESS) {
  127. #ifdef DBG_KREE_MEM
  128. pr_debug("[kree] KREE_RegisterSharedmem Error: %d\n",
  129. ret);
  130. #endif
  131. return ret;
  132. }
  133. } else {
  134. pr_debug("[kree] KREE_RegisterSharedmem Error: support kmalloc only!!!\n");
  135. return TZ_RESULT_ERROR_NOT_IMPLEMENTED;
  136. }
  137. return TZ_RESULT_SUCCESS;
  138. }
  139. TZ_RESULT KREE_UnregisterSharedmem(KREE_SESSION_HANDLE session,
  140. KREE_SHAREDMEM_HANDLE shm_handle)
  141. {
  142. TZ_RESULT ret;
  143. if ((session == 0) || (shm_handle == 0))
  144. return TZ_RESULT_ERROR_BAD_PARAMETERS;
  145. ret = kree_unregister_sharedmem(session, shm_handle);
  146. if (ret < 0) {
  147. #ifdef DBG_KREE_MEM
  148. pr_debug("[kree] KREE_UnregisterSharedmem Error: %d\n", ret);
  149. #endif
  150. return ret;
  151. }
  152. return TZ_RESULT_SUCCESS;
  153. }
  154. TZ_RESULT KREE_AllocSecuremem(KREE_SESSION_HANDLE session,
  155. KREE_SECUREMEM_HANDLE *mem_handle,
  156. uint32_t alignment, uint32_t size)
  157. {
  158. TZ_RESULT ret;
  159. ret =
  160. _allocFunc(TZCMD_MEM_SECUREMEM_ALLOC, session, mem_handle,
  161. alignment, size, "KREE_AllocSecuremem");
  162. return ret;
  163. }
  164. TZ_RESULT KREE_ReferenceSecuremem(KREE_SESSION_HANDLE session,
  165. KREE_SECUREMEM_HANDLE mem_handle)
  166. {
  167. TZ_RESULT ret;
  168. ret =
  169. _handleOpFunc(TZCMD_MEM_SECUREMEM_REF, session, mem_handle,
  170. "KREE_ReferenceSecuremem");
  171. return ret;
  172. }
  173. TZ_RESULT KREE_UnreferenceSecuremem(KREE_SESSION_HANDLE session,
  174. KREE_SECUREMEM_HANDLE mem_handle)
  175. {
  176. TZ_RESULT ret;
  177. uint32_t count = 0;
  178. ret =
  179. _handleOpFunc_1(TZCMD_MEM_SECUREMEM_UNREF, session, mem_handle,
  180. &count, "KREE_UnreferenceSecuremem");
  181. #ifdef DBG_KREE_MEM
  182. pr_debug("KREE_UnreferenceSecuremem: count = 0x%x\n", count);
  183. #endif
  184. return ret;
  185. }
  186. TZ_RESULT KREE_AllocSecurechunkmem(KREE_SESSION_HANDLE session,
  187. KREE_SECUREMEM_HANDLE *cm_handle,
  188. uint32_t alignment,
  189. uint32_t size)
  190. {
  191. TZ_RESULT ret;
  192. ret =
  193. _allocFunc(TZCMD_MEM_SECURECM_ALLOC, session, cm_handle,
  194. alignment, size, "KREE_AllocSecurechunkmem");
  195. return ret;
  196. }
  197. TZ_RESULT KREE_ReferenceSecurechunkmem(KREE_SESSION_HANDLE session,
  198. KREE_SECURECM_HANDLE cm_handle)
  199. {
  200. TZ_RESULT ret;
  201. ret =
  202. _handleOpFunc(TZCMD_MEM_SECURECM_REF, session, cm_handle,
  203. "KREE_ReferenceSecurechunkmem");
  204. return ret;
  205. }
  206. TZ_RESULT KREE_UnreferenceSecurechunkmem(KREE_SESSION_HANDLE session,
  207. KREE_SECURECM_HANDLE cm_handle)
  208. {
  209. TZ_RESULT ret;
  210. uint32_t count = 0;
  211. ret =
  212. _handleOpFunc_1(TZCMD_MEM_SECURECM_UNREF, session, cm_handle,
  213. &count, "KREE_UnreferenceSecurechunkmem");
  214. #ifdef DBG_KREE_MEM
  215. pr_debug("KREE_UnreferenceSecurechunkmem: count = 0x%x\n", count);
  216. #endif
  217. return ret;
  218. }
  219. TZ_RESULT KREE_ReadSecurechunkmem(KREE_SESSION_HANDLE session, uint32_t offset,
  220. uint32_t size, void *buffer)
  221. {
  222. MTEEC_PARAM p[4];
  223. TZ_RESULT ret;
  224. if ((session == 0) || (size == 0))
  225. return TZ_RESULT_ERROR_BAD_PARAMETERS;
  226. p[0].value.a = offset;
  227. p[1].value.a = size;
  228. p[2].mem.buffer = buffer;
  229. p[2].mem.size = size; /* fix me!!!! */
  230. ret = KREE_TeeServiceCall(session, TZCMD_MEM_SECURECM_READ,
  231. TZ_ParamTypes3(TZPT_VALUE_INPUT,
  232. TZPT_VALUE_INPUT,
  233. TZPT_MEM_OUTPUT),
  234. p);
  235. if (ret != TZ_RESULT_SUCCESS) {
  236. #ifdef DBG_KREE_MEM
  237. pr_debug("[kree] KREE_ReadSecurechunkmem Error: %d\n", ret);
  238. #endif
  239. return ret;
  240. }
  241. return TZ_RESULT_SUCCESS;
  242. }
  243. TZ_RESULT KREE_WriteSecurechunkmem(KREE_SESSION_HANDLE session, uint32_t offset,
  244. uint32_t size, void *buffer)
  245. {
  246. MTEEC_PARAM p[4];
  247. TZ_RESULT ret;
  248. if ((session == 0) || (size == 0))
  249. return TZ_RESULT_ERROR_BAD_PARAMETERS;
  250. p[0].value.a = offset;
  251. p[1].value.a = size;
  252. p[2].mem.buffer = buffer;
  253. p[2].mem.size = size; /* fix me!!!! */
  254. ret = KREE_TeeServiceCall(session, TZCMD_MEM_SECURECM_WRITE,
  255. TZ_ParamTypes3(TZPT_VALUE_INPUT,
  256. TZPT_VALUE_INPUT,
  257. TZPT_MEM_INPUT),
  258. p);
  259. if (ret != TZ_RESULT_SUCCESS) {
  260. #ifdef DBG_KREE_MEM
  261. pr_debug("[kree] KREE_WriteSecurechunkmem Error: %d\n", ret);
  262. #endif
  263. return ret;
  264. }
  265. return TZ_RESULT_SUCCESS;
  266. }
  267. TZ_RESULT KREE_GetSecurechunkReleaseSize(KREE_SESSION_HANDLE session,
  268. uint32_t *size)
  269. {
  270. MTEEC_PARAM p[4];
  271. TZ_RESULT ret;
  272. ret =
  273. KREE_TeeServiceCall(session, TZCMD_MEM_SECURECM_RSIZE,
  274. TZ_ParamTypes1(TZPT_VALUE_OUTPUT), p);
  275. if (ret != TZ_RESULT_SUCCESS) {
  276. #ifdef DBG_KREE_MEM
  277. pr_debug("[kree] KREE_GetSecurechunkReleaseSize Error: %d\n",
  278. ret);
  279. #endif
  280. return ret;
  281. }
  282. *size = p[0].value.a;
  283. return TZ_RESULT_SUCCESS;
  284. }
  285. TZ_RESULT KREE_StartSecurechunkmemSvc(KREE_SESSION_HANDLE session,
  286. unsigned long start_pa, uint32_t size)
  287. {
  288. MTEEC_PARAM p[4];
  289. TZ_RESULT ret;
  290. p[0].value.a = start_pa;
  291. p[1].value.a = size;
  292. ret = KREE_TeeServiceCall(session, TZCMD_MEM_SECURECM_START,
  293. TZ_ParamTypes2(TZPT_VALUE_INPUT,
  294. TZPT_VALUE_INPUT),
  295. p);
  296. if (ret != TZ_RESULT_SUCCESS) {
  297. #ifdef DBG_KREE_MEM
  298. pr_debug("[kree] KREE_StartSecurechunkmemSvc Error: %d\n", ret);
  299. #endif
  300. return ret;
  301. }
  302. return TZ_RESULT_SUCCESS;
  303. }
  304. TZ_RESULT KREE_StopSecurechunkmemSvc(KREE_SESSION_HANDLE session,
  305. unsigned long *cm_pa, uint32_t *size)
  306. {
  307. MTEEC_PARAM p[4];
  308. TZ_RESULT ret;
  309. ret = KREE_TeeServiceCall(session, TZCMD_MEM_SECURECM_STOP,
  310. TZ_ParamTypes2(TZPT_VALUE_OUTPUT,
  311. TZPT_VALUE_OUTPUT),
  312. p);
  313. if (ret != TZ_RESULT_SUCCESS) {
  314. #ifdef DBG_KREE_MEM
  315. pr_debug("[kree] KREE_StopSecurechunkmemSvc Error: %d\n", ret);
  316. #endif
  317. return ret;
  318. }
  319. if (cm_pa != NULL)
  320. *cm_pa = (unsigned long)p[0].value.a;
  321. if (size != NULL)
  322. *size = p[1].value.a;
  323. return TZ_RESULT_SUCCESS;
  324. }
  325. TZ_RESULT KREE_QuerySecurechunkmem(KREE_SESSION_HANDLE session,
  326. unsigned long *cm_pa, uint32_t *size)
  327. {
  328. MTEEC_PARAM p[4];
  329. TZ_RESULT ret;
  330. ret = KREE_TeeServiceCall(session, TZCMD_MEM_SECURECM_QUERY,
  331. TZ_ParamTypes2(TZPT_VALUE_OUTPUT,
  332. TZPT_VALUE_OUTPUT),
  333. p);
  334. if (ret != TZ_RESULT_SUCCESS) {
  335. #ifdef DBG_KREE_MEM
  336. pr_debug("[kree] KREE_QuerySecurechunkmem Error: %d\n", ret);
  337. #endif
  338. return ret;
  339. }
  340. if (cm_pa != NULL)
  341. *cm_pa = (unsigned long)p[0].value.a;
  342. if (size != NULL)
  343. *size = p[1].value.a;
  344. return TZ_RESULT_SUCCESS;
  345. }
  346. TZ_RESULT KREE_GetTEETotalSize(KREE_SESSION_HANDLE session, uint32_t *size)
  347. {
  348. MTEEC_PARAM p[4];
  349. TZ_RESULT ret;
  350. ret = KREE_TeeServiceCall(session, TZCMD_MEM_TOTAL_SIZE,
  351. TZ_ParamTypes1(TZPT_VALUE_OUTPUT), p);
  352. if (ret != TZ_RESULT_SUCCESS) {
  353. #ifdef DBG_KREE_MEM
  354. pr_warn("[kree] KREE_GetTEETotalSize Error: %d\n", ret);
  355. #endif
  356. return ret;
  357. }
  358. *size = p[0].value.a;
  359. return TZ_RESULT_SUCCESS;
  360. }