teei_ramdump.c 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /*
  2. * Copyright (c) 2015-2020 MICROTRUST Incorporated
  3. * All rights reserved
  4. *
  5. * This file and software is confidential and proprietary to MICROTRUST Inc.
  6. * Unauthorized copying of this file and software is strictly prohibited.
  7. * You MUST NOT disclose this file and software unless you get a license
  8. * agreement from MICROTRUST Incorporated.
  9. */
  10. #include <arch/arm/mmu.h>
  11. #include <debug.h>
  12. #include <dev/aee_platform_debug.h>
  13. #include <libfdt.h>
  14. #ifdef MTK_SMC_ID_MGMT
  15. #include <mtk_secure_api.h>
  16. #endif
  17. #include <platform/boot_mode.h>
  18. #include <platform/mt_typedefs.h>
  19. #include <plat_teei_dbg_info.h>
  20. #include <sys/types.h>
  21. #ifdef MICROTRUST_TEE_DUMP_SUPPORT
  22. static int get_teei_info(u64 *addr, u32 *size)
  23. {
  24. u64 buf_addr = 0;
  25. u32 buf_size = 0;
  26. u32 ret = 0;
  27. uint32_t smc_id = ARCH32_TEEI_LOG_BUF_INFO;
  28. if ((addr == NULL) || (size == NULL)) {
  29. return -1;
  30. }
  31. #ifdef MTK_SMC_ID_MGMT
  32. ret = mt_secure_call_ret3(smc_id, 0, 0, 0, 0, &buf_addr, &buf_size);
  33. #else
  34. __asm__ volatile("mov r0, %[smcid]\n"
  35. "smc #0x0\n"
  36. "mov %[ret], r0\n"
  37. "mov %[addr], r1\n"
  38. "mov %[size], r2\n"
  39. :[ret]"=r"(ret), [addr]"=r"(buf_addr),
  40. [size]"=r"(buf_size):[smcid]"r"(smc_id):"cc",
  41. "r0", "r1", "r2", "r3");
  42. #endif
  43. /*dprintf(INFO, "[microtrust][%s][%d] TEE: buffer addr:%llx,
  44. * tee_log_buf_size:%x\n", __func__, __LINE__, buf_addr, buf_size);*/
  45. *addr = buf_addr;
  46. *size = buf_size;
  47. return ret;
  48. }
  49. static uint32_t save_teei_log(u64 offset, int *len, CALLBACK dev_write)
  50. {
  51. uint32_t datasize = 0;
  52. uint64_t teei_log_buf_addr = 0;
  53. uint32_t teei_log_buf_size = 0;
  54. int ret;
  55. ret = get_teei_info(&teei_log_buf_addr, &teei_log_buf_size);
  56. if ((ret != 0) || (teei_log_buf_addr == 0))
  57. return 0;
  58. #ifdef MTK_3LEVEL_PAGETABLE
  59. arch_mmu_map(ROUNDDOWN((uint64_t)teei_log_buf_addr, PAGE_SIZE),
  60. ROUNDDOWN((uint32_t)teei_log_buf_addr, PAGE_SIZE),
  61. MMU_MEMORY_TYPE_NORMAL_WRITE_BACK |
  62. MMU_MEMORY_AP_P_RW_U_NA,
  63. ROUNDUP(teei_log_buf_size, PAGE_SIZE));
  64. #endif
  65. *len = teei_log_buf_size;
  66. datasize = dev_write((void *)teei_log_buf_addr, *len);
  67. /*dprintf(INFO, "[microtrust][%s][%d] TEE: dev_write:0x%x,
  68. * teei_log_buf_addr:0x%llx, teei_log_buf_size:0x%x\n", __func__,
  69. * __LINE__, datasize, teei_log_buf_addr, teei_log_buf_size);*/
  70. return datasize;
  71. }
  72. void teei_log_init(void)
  73. {
  74. plat_teei_log_get = save_teei_log;
  75. }
  76. #endif