rkp.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include <linux/rkp.h>
  3. #include <linux/mm.h>
  4. #include <asm/pgtable.h>
  5. bool rkp_started __rkp_ro = false;
  6. static u64 robuffer_base __rkp_ro;
  7. static u64 robuffer_size __rkp_ro;
  8. /* init/main.c */
  9. void __init rkp_init(void)
  10. {
  11. struct rkp_init init_data;
  12. memset((void *)&init_data, 0, sizeof(struct rkp_init));
  13. /* initialized rkp_init struct */
  14. init_data.magic = RKP_INIT_MAGIC;
  15. init_data.vmalloc_start = VMALLOC_START;
  16. #ifndef CONFIG_RKP_FIMC_CHECK
  17. init_data.no_fimc_verify = 1;
  18. #endif
  19. init_data.fimc_phys_addr = 0;
  20. init_data._text = (u64)_stext;
  21. init_data._etext = (u64)_etext;
  22. init_data._srodata = (u64)__start_rodata;
  23. init_data._erodata = (u64)__end_rodata;
  24. init_data.large_memory = 0;
  25. init_data.vmalloc_end = (u64)high_memory;
  26. init_data.init_mm_pgd = (u64)__pa(swapper_pg_dir);
  27. init_data.id_map_pgd = (u64)__pa(idmap_pg_dir);
  28. init_data.zero_pg_addr = (u64)__pa(empty_zero_page);
  29. #ifdef CONFIG_UNMAP_KERNEL_AT_EL0
  30. init_data.tramp_pgd = (u64)__pa(tramp_pg_dir);
  31. init_data.tramp_valias = (u64)TRAMP_VALIAS;
  32. #endif
  33. uh_call(UH_APP_RKP, RKP_START, (u64)&init_data, (u64)kimage_voffset, 0, 0);
  34. rkp_started = true;
  35. }
  36. /* init/main.c */
  37. void rkp_deferred_init(void)
  38. {
  39. uh_call(UH_APP_RKP, RKP_DEFERRED_START, 0, 0, 0, 0);
  40. }
  41. /* RO BUFFER */
  42. void rkp_robuffer_init(void)
  43. {
  44. uh_call(UH_APP_RKP, RKP_GET_RO_INFO, (u64)&robuffer_base, (u64)&robuffer_size, 0, 0);
  45. }
  46. inline phys_addr_t rkp_ro_alloc_phys(int shift)
  47. {
  48. phys_addr_t alloc_addr = 0;
  49. uh_call(UH_APP_RKP, RKP_ROBUFFER_ALLOC, (u64)&alloc_addr, 1, 0, 0);
  50. return alloc_addr;
  51. }
  52. inline phys_addr_t rkp_ro_alloc_phys_for_text(void)
  53. {
  54. phys_addr_t alloc_addr = 0;
  55. uh_call(UH_APP_RKP, RKP_ROBUFFER_ALLOC, (u64)&alloc_addr, 1, 1, 0);
  56. return alloc_addr;
  57. }
  58. inline void *rkp_ro_alloc(void)
  59. {
  60. void *addr = NULL;
  61. uh_call(UH_APP_RKP, RKP_ROBUFFER_ALLOC, (u64)&addr, 1, 0, 0);
  62. if (!addr)
  63. return 0;
  64. return (void *)__phys_to_virt(addr);
  65. }
  66. inline void rkp_ro_free(void *addr)
  67. {
  68. uh_call(UH_APP_RKP, RKP_ROBUFFER_FREE, (u64)addr, 0, 0, 0);
  69. }
  70. /*
  71. inline bool is_rkp_ro_buffer(u64 addr)
  72. {
  73. u64 pa = (u64)virt_to_phys((void *)addr);
  74. if ((robuffer_base <= pa) && (pa < robuffer_base + robuffer_size))
  75. return true;
  76. else
  77. return false;
  78. }
  79. */
  80. inline bool is_rkp_ro_buffer(u64 addr)
  81. {
  82. u64 va = (u64)phys_to_virt(robuffer_base);
  83. if ((va <= addr) && (addr < va + robuffer_size))
  84. return true;
  85. else
  86. return false;
  87. }