rkp.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef __RKP_H__
  3. #define __RKP_H__
  4. #ifndef __ASSEMBLY__
  5. #include <asm/stack_pointer.h>
  6. #include <asm/thread_info.h>
  7. #include <linux/spinlock.h>
  8. #include <linux/uh.h>
  9. #ifdef CONFIG_RKP_TEST
  10. #define RKP_INIT_MAGIC 0x5afe0002
  11. #else
  12. #define RKP_INIT_MAGIC 0x5afe0001
  13. #endif
  14. #define __rkp_ro __section(".rkp_ro")
  15. enum __RKP_CMD_ID {
  16. RKP_START = 0x00,
  17. RKP_DEFERRED_START = 0x01,
  18. /* RKP robuffer cmds*/
  19. RKP_GET_RO_INFO = 0x2,
  20. RKP_CHG_RO = 0x03,
  21. RKP_CHG_RW = 0x04,
  22. RKP_PGD_RO = 0x05,
  23. RKP_PGD_RW = 0x06,
  24. RKP_ROBUFFER_ALLOC = 0x07,
  25. RKP_ROBUFFER_FREE = 0x08,
  26. /* module, binary load */
  27. RKP_DYNAMIC_LOAD = 0x09,
  28. RKP_MODULE_LOAD = 0x0A,
  29. RKP_BPF_LOAD = 0x0B,
  30. /* Log */
  31. RKP_LOG = 0x0C,
  32. #ifdef CONFIG_RKP_TEST
  33. RKP_TEST_INIT = 0x0D,
  34. RKP_TEST_GET_PAR = 0x0E,
  35. RKP_TEST_EXIT = 0x0F,
  36. RKP_TEST_TEXT_VALID = 0x12,
  37. #endif
  38. RKP_KPROBE_PAGE = 0x11,
  39. RKP_GET_GUEST_LINEAR_MEM = 0x13,
  40. RKP_FREE_GUEST_LINEAR_MEM = 0x14,
  41. };
  42. #define RKP_DYN_COMMAND_BREAKDOWN 0x00
  43. #define RKP_DYN_COMMAND_INS 0x01
  44. #define RKP_DYN_COMMAND_RM 0x10
  45. #define RKP_DYN_FIMC 0x02
  46. #define RKP_DYN_FIMC_COMBINED 0x03
  47. #define RKP_MODULE_PXN_CLEAR 0x1
  48. #define RKP_MODULE_PXN_SET 0x2
  49. struct rkp_init { //copy from uh (app/rkp/rkp.h)
  50. u32 magic;
  51. u64 vmalloc_start;
  52. u64 vmalloc_end;
  53. u64 init_mm_pgd;
  54. u64 id_map_pgd;
  55. u64 zero_pg_addr;
  56. u64 rkp_pgt_bitmap;
  57. u64 rkp_dbl_bitmap;
  58. u32 rkp_bitmap_size;
  59. u32 no_fimc_verify;
  60. u64 fimc_phys_addr;
  61. u64 _text;
  62. u64 _etext;
  63. u64 extra_memory_addr;
  64. u32 extra_memory_size;
  65. u64 physmap_addr; //not used. what is this for?
  66. u64 _srodata;
  67. u64 _erodata;
  68. u32 large_memory;
  69. u64 tramp_pgd;
  70. u64 tramp_valias;
  71. };
  72. struct rkp_dynamic_load {
  73. u32 type;
  74. u64 binary_base;
  75. u64 binary_size;
  76. u64 code_base1;
  77. u64 code_size1;
  78. u64 code_base2;
  79. u64 code_size2;
  80. };
  81. struct module_info {
  82. u64 base_va;
  83. u64 vm_size;
  84. u64 core_base_va;
  85. u64 core_text_size;
  86. u64 core_ro_size;
  87. u64 init_base_va;
  88. u64 init_text_size;
  89. };
  90. extern bool rkp_started;
  91. extern void __init rkp_init(void);
  92. extern void rkp_deferred_init(void);
  93. extern void rkp_robuffer_init(void);
  94. extern inline phys_addr_t rkp_ro_alloc_phys(int shift);
  95. extern inline phys_addr_t rkp_ro_alloc_phys_for_text(void);
  96. extern inline void *rkp_ro_alloc(void);
  97. extern inline void rkp_ro_free(void *free_addr);
  98. extern inline bool is_rkp_ro_buffer(u64 addr);
  99. void *module_alloc_by_rkp(unsigned int core_layout_size, unsigned int core_text_size);
  100. #endif //__ASSEMBLY__
  101. #endif //__RKP_H__