memprot.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578
  1. // Copyright 2020 Espressif Systems (Shanghai) PTE LTD
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. /* INTERNAL API
  15. * implementation of PMS memory protection features
  16. */
  17. #include <stdio.h>
  18. #include "sdkconfig.h"
  19. #include "soc/sensitive_reg.h"
  20. #include "soc/dport_access.h"
  21. #include "soc/periph_defs.h"
  22. #include "esp_intr_alloc.h"
  23. #include "hal/memprot_ll.h"
  24. #include "esp32c3/memprot.h"
  25. #include "riscv/interrupt.h"
  26. #include "esp32c3/rom/ets_sys.h"
  27. #include "esp_fault.h"
  28. #include "soc/cpu.h"
  29. extern int _iram_text_end;
  30. const char *esp_memprot_mem_type_to_str(mem_type_prot_t mem_type)
  31. {
  32. switch (mem_type) {
  33. case MEMPROT_NONE:
  34. return "NONE";
  35. case MEMPROT_IRAM0_SRAM:
  36. return "IRAM0_SRAM";
  37. case MEMPROT_DRAM0_SRAM:
  38. return "DRAM0_SRAM";
  39. case MEMPROT_ALL:
  40. return "ALL";
  41. default:
  42. return "UNKNOWN";
  43. }
  44. }
  45. const char *esp_memprot_split_line_to_str(split_line_t line_type)
  46. {
  47. switch (line_type) {
  48. case MEMPROT_IRAM0_DRAM0_SPLITLINE:
  49. return "MEMPROT_IRAM0_DRAM0_SPLITLINE";
  50. case MEMPROT_IRAM0_LINE_0_SPLITLINE:
  51. return "MEMPROT_IRAM0_LINE_0_SPLITLINE";
  52. case MEMPROT_IRAM0_LINE_1_SPLITLINE:
  53. return "MEMPROT_IRAM0_LINE_1_SPLITLINE";
  54. case MEMPROT_DRAM0_DMA_LINE_0_SPLITLINE:
  55. return "MEMPROT_DRAM0_DMA_LINE_0_SPLITLINE";
  56. case MEMPROT_DRAM0_DMA_LINE_1_SPLITLINE:
  57. return "MEMPROT_DRAM0_DMA_LINE_1_SPLITLINE";
  58. default:
  59. return "UNKNOWN";
  60. }
  61. }
  62. const char *esp_memprot_pms_to_str(pms_area_t area_type)
  63. {
  64. switch (area_type) {
  65. case MEMPROT_IRAM0_PMS_AREA_0:
  66. return "MEMPROT_IRAM0_PMS_AREA_0";
  67. case MEMPROT_IRAM0_PMS_AREA_1:
  68. return "MEMPROT_IRAM0_PMS_AREA_1";
  69. case MEMPROT_IRAM0_PMS_AREA_2:
  70. return "MEMPROT_IRAM0_PMS_AREA_2";
  71. case MEMPROT_IRAM0_PMS_AREA_3:
  72. return "MEMPROT_IRAM0_PMS_AREA_3";
  73. case MEMPROT_DRAM0_PMS_AREA_0:
  74. return "MEMPROT_DRAM0_PMS_AREA_0";
  75. case MEMPROT_DRAM0_PMS_AREA_1:
  76. return "MEMPROT_DRAM0_PMS_AREA_1";
  77. case MEMPROT_DRAM0_PMS_AREA_2:
  78. return "MEMPROT_DRAM0_PMS_AREA_2";
  79. case MEMPROT_DRAM0_PMS_AREA_3:
  80. return "MEMPROT_DRAM0_PMS_AREA_3";
  81. default:
  82. return "UNKNOWN";
  83. }
  84. }
  85. /* split lines */
  86. void *esp_memprot_get_default_main_split_addr()
  87. {
  88. return &_iram_text_end;
  89. }
  90. uint32_t *esp_memprot_get_split_addr(split_line_t line_type)
  91. {
  92. switch ( line_type ) {
  93. case MEMPROT_IRAM0_DRAM0_SPLITLINE:
  94. return memprot_ll_get_iram0_split_line_main_I_D();
  95. case MEMPROT_IRAM0_LINE_0_SPLITLINE:
  96. return memprot_ll_get_iram0_split_line_I_0();
  97. case MEMPROT_IRAM0_LINE_1_SPLITLINE:
  98. return memprot_ll_get_iram0_split_line_I_1();
  99. case MEMPROT_DRAM0_DMA_LINE_0_SPLITLINE:
  100. return memprot_ll_get_dram0_split_line_D_0();
  101. case MEMPROT_DRAM0_DMA_LINE_1_SPLITLINE:
  102. return memprot_ll_get_dram0_split_line_D_1();
  103. default:
  104. abort();
  105. }
  106. }
  107. void esp_memprot_set_split_line_lock()
  108. {
  109. memprot_ll_set_iram0_dram0_split_line_lock();
  110. }
  111. bool esp_memprot_get_split_line_lock()
  112. {
  113. return memprot_ll_get_iram0_dram0_split_line_lock();
  114. }
  115. void esp_memprot_set_split_line(split_line_t line_type, const void *line_addr)
  116. {
  117. //split-line must be divisible by 512 (PMS module restriction)
  118. assert( ((uint32_t)line_addr) % 0x200 == 0 );
  119. switch ( line_type ) {
  120. case MEMPROT_IRAM0_DRAM0_SPLITLINE:
  121. memprot_ll_set_iram0_split_line_main_I_D(line_addr);
  122. break;
  123. case MEMPROT_IRAM0_LINE_0_SPLITLINE:
  124. memprot_ll_set_iram0_split_line_I_0(line_addr);
  125. break;
  126. case MEMPROT_IRAM0_LINE_1_SPLITLINE:
  127. memprot_ll_set_iram0_split_line_I_1(line_addr);
  128. break;
  129. case MEMPROT_DRAM0_DMA_LINE_0_SPLITLINE:
  130. memprot_ll_set_dram0_split_line_D_0(line_addr);
  131. break;
  132. case MEMPROT_DRAM0_DMA_LINE_1_SPLITLINE:
  133. memprot_ll_set_dram0_split_line_D_1(line_addr);
  134. break;
  135. default:
  136. abort();
  137. }
  138. }
  139. /* PMS */
  140. void esp_memprot_set_pms_lock(mem_type_prot_t mem_type)
  141. {
  142. switch ( mem_type ) {
  143. case MEMPROT_IRAM0_SRAM:
  144. memprot_ll_iram0_set_pms_lock();
  145. break;
  146. case MEMPROT_DRAM0_SRAM:
  147. memprot_ll_dram0_set_pms_lock();
  148. break;
  149. default:
  150. abort();
  151. }
  152. }
  153. bool esp_memprot_get_pms_lock(mem_type_prot_t mem_type)
  154. {
  155. switch ( mem_type ) {
  156. case MEMPROT_IRAM0_SRAM:
  157. return memprot_ll_iram0_get_pms_lock();
  158. case MEMPROT_DRAM0_SRAM:
  159. return memprot_ll_dram0_get_pms_lock();
  160. default:
  161. abort();
  162. }
  163. }
  164. void esp_memprot_iram_set_pms_area(pms_area_t area_type, bool r, bool w, bool x)
  165. {
  166. switch ( area_type ) {
  167. case MEMPROT_IRAM0_PMS_AREA_0:
  168. memprot_ll_iram0_set_pms_area_0(r, w, x);
  169. break;
  170. case MEMPROT_IRAM0_PMS_AREA_1:
  171. memprot_ll_iram0_set_pms_area_1(r, w, x);
  172. break;
  173. case MEMPROT_IRAM0_PMS_AREA_2:
  174. memprot_ll_iram0_set_pms_area_2(r, w, x);
  175. break;
  176. case MEMPROT_IRAM0_PMS_AREA_3:
  177. memprot_ll_iram0_set_pms_area_3(r, w, x);
  178. break;
  179. default:
  180. abort();
  181. }
  182. }
  183. void esp_memprot_iram_get_pms_area(pms_area_t area_type, bool *r, bool *w, bool *x)
  184. {
  185. switch ( area_type ) {
  186. case MEMPROT_IRAM0_PMS_AREA_0:
  187. memprot_ll_iram0_get_pms_area_0(r, w, x);
  188. break;
  189. case MEMPROT_IRAM0_PMS_AREA_1:
  190. memprot_ll_iram0_get_pms_area_1(r, w, x);
  191. break;
  192. case MEMPROT_IRAM0_PMS_AREA_2:
  193. memprot_ll_iram0_get_pms_area_2(r, w, x);
  194. break;
  195. case MEMPROT_IRAM0_PMS_AREA_3:
  196. memprot_ll_iram0_get_pms_area_3(r, w, x);
  197. break;
  198. default:
  199. abort();
  200. }
  201. }
  202. void esp_memprot_dram_set_pms_area(pms_area_t area_type, bool r, bool w)
  203. {
  204. switch ( area_type ) {
  205. case MEMPROT_DRAM0_PMS_AREA_0:
  206. memprot_ll_dram0_set_pms_area_0(r, w);
  207. break;
  208. case MEMPROT_DRAM0_PMS_AREA_1:
  209. memprot_ll_dram0_set_pms_area_1(r, w);
  210. break;
  211. case MEMPROT_DRAM0_PMS_AREA_2:
  212. memprot_ll_dram0_set_pms_area_2(r, w);
  213. break;
  214. case MEMPROT_DRAM0_PMS_AREA_3:
  215. memprot_ll_dram0_set_pms_area_3(r, w);
  216. break;
  217. default:
  218. abort();
  219. }
  220. }
  221. void esp_memprot_dram_get_pms_area(pms_area_t area_type, bool *r, bool *w)
  222. {
  223. switch ( area_type ) {
  224. case MEMPROT_DRAM0_PMS_AREA_0:
  225. memprot_ll_dram0_get_pms_area_0(r, w);
  226. break;
  227. case MEMPROT_DRAM0_PMS_AREA_1:
  228. memprot_ll_dram0_get_pms_area_1(r, w);
  229. break;
  230. case MEMPROT_DRAM0_PMS_AREA_2:
  231. memprot_ll_dram0_get_pms_area_2(r, w);
  232. break;
  233. case MEMPROT_DRAM0_PMS_AREA_3:
  234. memprot_ll_dram0_get_pms_area_3(r, w);
  235. break;
  236. default:
  237. abort();
  238. }
  239. }
  240. /* monitor */
  241. void esp_memprot_set_monitor_lock(mem_type_prot_t mem_type)
  242. {
  243. switch ( mem_type ) {
  244. case MEMPROT_IRAM0_SRAM:
  245. memprot_ll_iram0_set_monitor_lock();
  246. break;
  247. case MEMPROT_DRAM0_SRAM:
  248. memprot_ll_dram0_set_monitor_lock();
  249. break;
  250. default:
  251. abort();
  252. }
  253. }
  254. bool esp_memprot_get_monitor_lock(mem_type_prot_t mem_type)
  255. {
  256. switch ( mem_type ) {
  257. case MEMPROT_IRAM0_SRAM:
  258. return memprot_ll_iram0_get_monitor_lock();
  259. case MEMPROT_DRAM0_SRAM:
  260. return memprot_ll_dram0_get_monitor_lock();
  261. default:
  262. abort();
  263. }
  264. }
  265. void esp_memprot_set_monitor_en(mem_type_prot_t mem_type, bool enable)
  266. {
  267. switch ( mem_type ) {
  268. case MEMPROT_IRAM0_SRAM:
  269. memprot_ll_iram0_set_monitor_en(enable);
  270. break;
  271. case MEMPROT_DRAM0_SRAM:
  272. memprot_ll_dram0_set_monitor_en(enable);
  273. break;
  274. default:
  275. abort();
  276. }
  277. }
  278. bool esp_memprot_get_monitor_en(mem_type_prot_t mem_type)
  279. {
  280. switch ( mem_type ) {
  281. case MEMPROT_IRAM0_SRAM:
  282. return memprot_ll_iram0_get_monitor_en();
  283. case MEMPROT_DRAM0_SRAM:
  284. return memprot_ll_dram0_get_monitor_en();
  285. default:
  286. abort();
  287. }
  288. }
  289. bool esp_memprot_is_intr_ena_any()
  290. {
  291. return esp_memprot_get_monitor_en(MEMPROT_IRAM0_SRAM) || esp_memprot_get_monitor_en(MEMPROT_DRAM0_SRAM);
  292. }
  293. void esp_memprot_monitor_clear_intr(mem_type_prot_t mem_type)
  294. {
  295. switch ( mem_type ) {
  296. case MEMPROT_IRAM0_SRAM:
  297. memprot_ll_iram0_clear_monitor_intr();
  298. memprot_ll_iram0_reset_clear_monitor_intr();
  299. break;
  300. case MEMPROT_DRAM0_SRAM:
  301. memprot_ll_dram0_clear_monitor_intr();
  302. memprot_ll_dram0_reset_clear_monitor_intr();
  303. break;
  304. default:
  305. abort();
  306. }
  307. }
  308. mem_type_prot_t esp_memprot_get_active_intr_memtype()
  309. {
  310. if ( memprot_ll_iram0_get_monitor_status_intr() > 0 ) {
  311. return MEMPROT_IRAM0_SRAM;
  312. } else if ( memprot_ll_dram0_get_monitor_status_intr() ) {
  313. return MEMPROT_DRAM0_SRAM;
  314. }
  315. return MEMPROT_NONE;
  316. }
  317. bool esp_memprot_is_locked_any()
  318. {
  319. return
  320. esp_memprot_get_split_line_lock() ||
  321. esp_memprot_get_pms_lock(MEMPROT_IRAM0_SRAM) ||
  322. esp_memprot_get_pms_lock(MEMPROT_DRAM0_SRAM) ||
  323. esp_memprot_get_monitor_lock(MEMPROT_IRAM0_SRAM) ||
  324. esp_memprot_get_monitor_lock(MEMPROT_DRAM0_SRAM);
  325. }
  326. bool esp_memprot_get_violate_intr_on(mem_type_prot_t mem_type)
  327. {
  328. switch ( mem_type ) {
  329. case MEMPROT_IRAM0_SRAM:
  330. return memprot_ll_iram0_get_monitor_status_intr() == 1;
  331. case MEMPROT_DRAM0_SRAM:
  332. return memprot_ll_dram0_get_monitor_status_intr() == 1;
  333. default:
  334. abort();
  335. }
  336. }
  337. uint32_t esp_memprot_get_violate_addr(mem_type_prot_t mem_type)
  338. {
  339. switch ( mem_type ) {
  340. case MEMPROT_IRAM0_SRAM:
  341. return memprot_ll_iram0_get_monitor_status_fault_addr();
  342. case MEMPROT_DRAM0_SRAM:
  343. return memprot_ll_dram0_get_monitor_status_fault_addr();
  344. default:
  345. abort();
  346. }
  347. }
  348. pms_world_t esp_memprot_get_violate_world(mem_type_prot_t mem_type)
  349. {
  350. uint32_t world = 0;
  351. switch ( mem_type ) {
  352. case MEMPROT_IRAM0_SRAM:
  353. world = memprot_ll_iram0_get_monitor_status_fault_world();
  354. break;
  355. case MEMPROT_DRAM0_SRAM:
  356. world = memprot_ll_dram0_get_monitor_status_fault_world();
  357. break;
  358. default:
  359. abort();
  360. }
  361. switch ( world ) {
  362. case 0x01: return MEMPROT_PMS_WORLD_0;
  363. case 0x10: return MEMPROT_PMS_WORLD_1;
  364. default: return MEMPROT_PMS_WORLD_INVALID;
  365. }
  366. }
  367. pms_operation_type_t esp_memprot_get_violate_wr(mem_type_prot_t mem_type)
  368. {
  369. switch ( mem_type ) {
  370. case MEMPROT_IRAM0_SRAM:
  371. return memprot_ll_iram0_get_monitor_status_fault_wr() == 1 ? MEMPROT_PMS_OP_WRITE : MEMPROT_PMS_OP_READ;
  372. case MEMPROT_DRAM0_SRAM:
  373. return memprot_ll_dram0_get_monitor_status_fault_wr() == 1 ? MEMPROT_PMS_OP_WRITE : MEMPROT_PMS_OP_READ;
  374. default:
  375. abort();
  376. }
  377. }
  378. bool esp_memprot_get_violate_loadstore(mem_type_prot_t mem_type)
  379. {
  380. switch ( mem_type ) {
  381. case MEMPROT_IRAM0_SRAM:
  382. return memprot_ll_iram0_get_monitor_status_fault_loadstore() == 1;
  383. default:
  384. abort();
  385. }
  386. }
  387. uint32_t esp_memprot_get_violate_byte_en(mem_type_prot_t mem_type)
  388. {
  389. switch ( mem_type ) {
  390. case MEMPROT_DRAM0_SRAM:
  391. return memprot_ll_dram0_get_monitor_status_fault_byte_en();
  392. default:
  393. abort();
  394. }
  395. }
  396. int esp_memprot_intr_get_cpuid()
  397. {
  398. return PRO_CPU_NUM;
  399. }
  400. void esp_memprot_set_intr_matrix(mem_type_prot_t mem_type)
  401. {
  402. ESP_INTR_DISABLE(ETS_MEMPROT_ERR_INUM);
  403. switch (mem_type) {
  404. case MEMPROT_IRAM0_SRAM:
  405. intr_matrix_set(esp_memprot_intr_get_cpuid(), memprot_ll_iram0_get_intr_source_num(), ETS_MEMPROT_ERR_INUM);
  406. break;
  407. case MEMPROT_DRAM0_SRAM:
  408. intr_matrix_set(esp_memprot_intr_get_cpuid(), memprot_ll_dram0_get_intr_source_num(), ETS_MEMPROT_ERR_INUM);
  409. break;
  410. default:
  411. abort();
  412. }
  413. /* Set the type and priority to cache error interrupts. */
  414. esprv_intc_int_set_type(BIT(ETS_MEMPROT_ERR_INUM), INTR_TYPE_LEVEL);
  415. esprv_intc_int_set_priority(ETS_MEMPROT_ERR_INUM, SOC_INTERRUPT_LEVEL_MEDIUM);
  416. ESP_INTR_ENABLE(ETS_MEMPROT_ERR_INUM);
  417. }
  418. void esp_memprot_set_prot(bool invoke_panic_handler, bool lock_feature, uint32_t *mem_type_mask)
  419. {
  420. esp_memprot_set_prot_int(invoke_panic_handler, lock_feature, NULL, mem_type_mask);
  421. }
  422. void esp_memprot_set_prot_int(bool invoke_panic_handler, bool lock_feature, void *split_addr, uint32_t *mem_type_mask)
  423. {
  424. //if being debugged check we are not glitched and dont enable Memprot
  425. if (esp_cpu_in_ocd_debug_mode()) {
  426. ESP_FAULT_ASSERT(esp_cpu_in_ocd_debug_mode());
  427. } else {
  428. uint32_t required_mem_prot = mem_type_mask == NULL ? (uint32_t) MEMPROT_ALL : *mem_type_mask;
  429. bool use_iram0 = required_mem_prot & MEMPROT_IRAM0_SRAM;
  430. bool use_dram0 = required_mem_prot & MEMPROT_DRAM0_SRAM;
  431. if (required_mem_prot == MEMPROT_NONE) {
  432. return;
  433. }
  434. //disable protection
  435. if (use_iram0) {
  436. esp_memprot_set_monitor_en(MEMPROT_IRAM0_SRAM, false);
  437. }
  438. if (use_dram0) {
  439. esp_memprot_set_monitor_en(MEMPROT_DRAM0_SRAM, false);
  440. }
  441. //panic handling
  442. if (invoke_panic_handler) {
  443. if (use_iram0) {
  444. esp_memprot_set_intr_matrix(MEMPROT_IRAM0_SRAM);
  445. }
  446. if (use_dram0) {
  447. esp_memprot_set_intr_matrix(MEMPROT_DRAM0_SRAM);
  448. }
  449. }
  450. //set split lines (must-have for all mem_types)
  451. const void *line_addr = split_addr == NULL ? esp_memprot_get_default_main_split_addr() : split_addr;
  452. esp_memprot_set_split_line(MEMPROT_IRAM0_LINE_1_SPLITLINE, line_addr);
  453. esp_memprot_set_split_line(MEMPROT_IRAM0_LINE_0_SPLITLINE, line_addr);
  454. esp_memprot_set_split_line(MEMPROT_IRAM0_DRAM0_SPLITLINE, line_addr);
  455. esp_memprot_set_split_line(MEMPROT_DRAM0_DMA_LINE_0_SPLITLINE,
  456. (void *) (MAP_IRAM_TO_DRAM((uint32_t) line_addr)));
  457. esp_memprot_set_split_line(MEMPROT_DRAM0_DMA_LINE_1_SPLITLINE,
  458. (void *) (MAP_IRAM_TO_DRAM((uint32_t) line_addr)));
  459. //set permissions
  460. if (required_mem_prot & MEMPROT_IRAM0_SRAM) {
  461. esp_memprot_iram_set_pms_area(MEMPROT_IRAM0_PMS_AREA_0, true, false, true);
  462. esp_memprot_iram_set_pms_area(MEMPROT_IRAM0_PMS_AREA_1, true, false, true);
  463. esp_memprot_iram_set_pms_area(MEMPROT_IRAM0_PMS_AREA_2, true, false, true);
  464. esp_memprot_iram_set_pms_area(MEMPROT_IRAM0_PMS_AREA_3, true, true, false);
  465. }
  466. if (required_mem_prot & MEMPROT_DRAM0_SRAM) {
  467. esp_memprot_dram_set_pms_area(MEMPROT_DRAM0_PMS_AREA_0, true, false);
  468. esp_memprot_dram_set_pms_area(MEMPROT_DRAM0_PMS_AREA_1, true, true);
  469. esp_memprot_dram_set_pms_area(MEMPROT_DRAM0_PMS_AREA_2, true, true);
  470. esp_memprot_dram_set_pms_area(MEMPROT_DRAM0_PMS_AREA_3, true, true);
  471. }
  472. //reenable protection
  473. if (use_iram0) {
  474. esp_memprot_monitor_clear_intr(MEMPROT_IRAM0_SRAM);
  475. esp_memprot_set_monitor_en(MEMPROT_IRAM0_SRAM, true);
  476. }
  477. if (use_dram0) {
  478. esp_memprot_monitor_clear_intr(MEMPROT_DRAM0_SRAM);
  479. esp_memprot_set_monitor_en(MEMPROT_DRAM0_SRAM, true);
  480. }
  481. //lock if required
  482. if (lock_feature) {
  483. esp_memprot_set_split_line_lock();
  484. if (use_iram0) {
  485. esp_memprot_set_pms_lock(MEMPROT_IRAM0_SRAM);
  486. esp_memprot_set_monitor_lock(MEMPROT_IRAM0_SRAM);
  487. }
  488. if (use_dram0) {
  489. esp_memprot_set_pms_lock(MEMPROT_DRAM0_SRAM);
  490. esp_memprot_set_monitor_lock(MEMPROT_DRAM0_SRAM);
  491. }
  492. }
  493. }
  494. }
  495. uint32_t esp_memprot_get_dram_status_reg_1()
  496. {
  497. return memprot_ll_dram0_get_monitor_status_register_1();
  498. }
  499. uint32_t esp_memprot_get_dram_status_reg_2()
  500. {
  501. return memprot_ll_dram0_get_monitor_status_register_2();
  502. }
  503. uint32_t esp_memprot_get_iram_status_reg()
  504. {
  505. return memprot_ll_iram0_get_monitor_status_register();
  506. }
  507. uint32_t esp_memprot_get_monitor_enable_reg(mem_type_prot_t mem_type)
  508. {
  509. switch (mem_type) {
  510. case MEMPROT_IRAM0_SRAM:
  511. return memprot_ll_iram0_get_monitor_enable_register();
  512. case MEMPROT_DRAM0_SRAM:
  513. return memprot_ll_dram0_get_monitor_enable_register();
  514. default:
  515. abort();
  516. }
  517. }