memprot.c 16 KB

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