memprot.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  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 "esp_log.h"
  24. static const char *TAG = "memprot";
  25. #include "esp32c3/memprot.h"
  26. #include "hal/memprot_ll.h"
  27. #include "riscv/interrupt.h"
  28. #include "esp_log.h"
  29. extern int _iram_text_end;
  30. const char *mem_type_to_str(mem_type_prot_t mem_type)
  31. {
  32. switch (mem_type) {
  33. case MEMPROT_NONE:
  34. return "MEMPROT_NONE";
  35. case MEMPROT_IRAM0_SRAM:
  36. return "MEMPROT_IRAM0_SRAM";
  37. case MEMPROT_DRAM0_SRAM:
  38. return "MEMPROT_DRAM0_SRAM";
  39. case MEMPROT_ALL:
  40. return "MEMPROT_ALL";
  41. default:
  42. return "UNKNOWN";
  43. }
  44. }
  45. const char *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 *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_main_split_addr()
  87. {
  88. return &_iram_text_end;
  89. }
  90. void esp_memprot_set_split_line_lock(bool lock)
  91. {
  92. memprot_ll_set_iram0_dram0_split_line_lock(lock);
  93. }
  94. bool esp_memprot_get_split_line_lock()
  95. {
  96. return memprot_ll_get_iram0_dram0_split_line_lock();
  97. }
  98. void esp_memprot_set_split_line(split_line_t line_type, const void *line_addr)
  99. {
  100. uint32_t addr = (uint32_t)line_addr;
  101. ESP_LOGD(TAG, "Setting split line %s, addr: 0x%08X", split_line_to_str(line_type), addr);
  102. //split-line must be divisible by 512
  103. assert( addr % 0x200 == 0 );
  104. switch ( line_type ) {
  105. case MEMPROT_IRAM0_DRAM0_SPLITLINE:
  106. memprot_ll_set_iram0_split_line_main_I_D(line_addr);
  107. break;
  108. case MEMPROT_IRAM0_LINE_0_SPLITLINE:
  109. memprot_ll_set_iram0_split_line_I_0(line_addr);
  110. break;
  111. case MEMPROT_IRAM0_LINE_1_SPLITLINE:
  112. memprot_ll_set_iram0_split_line_I_1(line_addr);
  113. break;
  114. case MEMPROT_DRAM0_DMA_LINE_0_SPLITLINE:
  115. memprot_ll_set_dram0_split_line_D_0(line_addr);
  116. break;
  117. case MEMPROT_DRAM0_DMA_LINE_1_SPLITLINE:
  118. memprot_ll_set_dram0_split_line_D_1(line_addr);
  119. break;
  120. default:
  121. ESP_LOGE(TAG, "Invalid split line type, aborting: 0x%08X", addr);
  122. abort();
  123. }
  124. }
  125. // TODO - get split lines
  126. /* PMS */
  127. void esp_memprot_set_pms_lock(mem_type_prot_t mem_type, bool lock)
  128. {
  129. ESP_LOGD(TAG, "esp_memprot_set_pms_lock(%s, %s)", mem_type_to_str(mem_type), lock ? "true" : "false");
  130. switch ( mem_type ) {
  131. case MEMPROT_IRAM0_SRAM:
  132. memprot_ll_iram0_set_pms_lock(lock);
  133. break;
  134. case MEMPROT_DRAM0_SRAM:
  135. memprot_ll_dram0_set_pms_lock(lock);
  136. break;
  137. default:
  138. ESP_LOGE(TAG, "Invalid mem_type (%s), aborting", mem_type_to_str(mem_type));
  139. abort();
  140. }
  141. }
  142. bool esp_memprot_get_pms_lock(mem_type_prot_t mem_type)
  143. {
  144. ESP_LOGD(TAG, "esp_memprot_get_pms_lock(%s)", mem_type_to_str(mem_type));
  145. switch ( mem_type ) {
  146. case MEMPROT_IRAM0_SRAM:
  147. return memprot_ll_iram0_get_pms_lock();
  148. case MEMPROT_DRAM0_SRAM:
  149. return memprot_ll_dram0_get_pms_lock();
  150. default:
  151. ESP_LOGE(TAG, "Invalid mem_type (%s), aborting", mem_type_to_str(mem_type));
  152. abort();
  153. }
  154. }
  155. void esp_memprot_iram_set_pms_area(pms_area_t area_type, bool r, bool w, bool x)
  156. {
  157. ESP_LOGD(TAG, "esp_memprot_iram_set_pms_area(area:%s r:%u w:%u, x:%u)", pms_to_str(area_type), r, w, x);
  158. switch ( area_type ) {
  159. case MEMPROT_IRAM0_PMS_AREA_0:
  160. memprot_ll_iram0_set_pms_area_0(r, w, x);
  161. break;
  162. case MEMPROT_IRAM0_PMS_AREA_1:
  163. memprot_ll_iram0_set_pms_area_1(r, w, x);
  164. break;
  165. case MEMPROT_IRAM0_PMS_AREA_2:
  166. memprot_ll_iram0_set_pms_area_2(r, w, x);
  167. break;
  168. case MEMPROT_IRAM0_PMS_AREA_3:
  169. memprot_ll_iram0_set_pms_area_3(r, w, x);
  170. break;
  171. default:
  172. ESP_LOGE(TAG, "Invalid area_type %d", pms_to_str(area_type));
  173. abort();
  174. }
  175. }
  176. void esp_memprot_dram_set_pms_area(pms_area_t area_type, bool r, bool w)
  177. {
  178. ESP_LOGD(TAG, "esp_memprot_dram_set_pms_area(area:%s r:%u w:%u)", pms_to_str(area_type), r, w);
  179. switch ( area_type ) {
  180. case MEMPROT_DRAM0_PMS_AREA_0:
  181. memprot_ll_dram0_set_pms_area_0(r, w);
  182. break;
  183. case MEMPROT_DRAM0_PMS_AREA_1:
  184. memprot_ll_dram0_set_pms_area_1(r, w);
  185. break;
  186. case MEMPROT_DRAM0_PMS_AREA_2:
  187. memprot_ll_dram0_set_pms_area_2(r, w);
  188. break;
  189. case MEMPROT_DRAM0_PMS_AREA_3:
  190. memprot_ll_dram0_set_pms_area_3(r, w);
  191. break;
  192. default:
  193. ESP_LOGE(TAG, "Invalid area_type %d", pms_to_str(area_type));
  194. abort();
  195. }
  196. }
  197. /* TODO - get single areas */
  198. /* monitor */
  199. void esp_memprot_set_monitor_lock(mem_type_prot_t mem_type, bool lock)
  200. {
  201. ESP_LOGD(TAG, "esp_memprot_set_monitor_lock(%s, %s)", mem_type_to_str(mem_type), lock ? "true" : "false");
  202. switch ( mem_type ) {
  203. case MEMPROT_IRAM0_SRAM:
  204. memprot_ll_iram0_set_monitor_lock(lock);
  205. break;
  206. case MEMPROT_DRAM0_SRAM:
  207. memprot_ll_dram0_set_monitor_lock(lock);
  208. break;
  209. default:
  210. ESP_LOGE(TAG, "Invalid mem_type (%s), aborting", mem_type_to_str(mem_type));
  211. abort();
  212. }
  213. }
  214. bool esp_memprot_get_monitor_lock(mem_type_prot_t mem_type)
  215. {
  216. ESP_LOGD(TAG, "esp_memprot_get_monitor_lock(%s)", mem_type_to_str(mem_type));
  217. switch ( mem_type ) {
  218. case MEMPROT_IRAM0_SRAM:
  219. return memprot_ll_iram0_get_monitor_lock();
  220. case MEMPROT_DRAM0_SRAM:
  221. return memprot_ll_dram0_get_monitor_lock();
  222. default:
  223. ESP_LOGE(TAG, "Invalid mem_type (%s), aborting", mem_type_to_str(mem_type));
  224. abort();
  225. }
  226. }
  227. void esp_memprot_set_monitor_en(mem_type_prot_t mem_type, bool enable)
  228. {
  229. ESP_LOGD(TAG, "esp_memprot_set_monitor_en(%s)", mem_type_to_str(mem_type));
  230. switch ( mem_type ) {
  231. case MEMPROT_IRAM0_SRAM:
  232. memprot_ll_iram0_set_monitor_en(enable);
  233. break;
  234. case MEMPROT_DRAM0_SRAM:
  235. memprot_ll_dram0_set_monitor_en(enable);
  236. break;
  237. default:
  238. ESP_LOGE(TAG, "Invalid mem_type (%s), aborting", mem_type_to_str(mem_type));
  239. abort();
  240. }
  241. }
  242. bool esp_memprot_get_monitor_en(mem_type_prot_t mem_type)
  243. {
  244. ESP_LOGD(TAG, "esp_memprot_set_monitor_en(%s)", mem_type_to_str(mem_type));
  245. switch ( mem_type ) {
  246. case MEMPROT_IRAM0_SRAM:
  247. return memprot_ll_iram0_get_monitor_en();
  248. case MEMPROT_DRAM0_SRAM:
  249. return memprot_ll_dram0_get_monitor_en();
  250. default:
  251. ESP_LOGE(TAG, "Invalid mem_type (%s), aborting", mem_type_to_str(mem_type));
  252. abort();
  253. }
  254. }
  255. bool esp_memprot_is_intr_ena_any()
  256. {
  257. return esp_memprot_get_monitor_en(MEMPROT_IRAM0_SRAM) || esp_memprot_get_monitor_en(MEMPROT_DRAM0_SRAM);
  258. }
  259. void esp_memprot_monitor_clear_intr(mem_type_prot_t mem_type)
  260. {
  261. ESP_LOGD(TAG, "esp_memprot_monitor_clear_intr(%s)", mem_type_to_str(mem_type));
  262. switch ( mem_type ) {
  263. case MEMPROT_IRAM0_SRAM:
  264. memprot_ll_iram0_clear_monitor_intr();
  265. break;
  266. case MEMPROT_DRAM0_SRAM:
  267. memprot_ll_dram0_clear_monitor_intr();
  268. break;
  269. default:
  270. ESP_LOGE(TAG, "Invalid mem_type (%s), aborting", mem_type_to_str(mem_type));
  271. abort();
  272. }
  273. }
  274. mem_type_prot_t esp_memprot_get_active_intr_memtype()
  275. {
  276. if ( memprot_ll_iram0_get_monitor_status_intr() > 0 ) {
  277. return MEMPROT_IRAM0_SRAM;
  278. } else if ( memprot_ll_dram0_get_monitor_status_intr() ) {
  279. return MEMPROT_DRAM0_SRAM;
  280. }
  281. return MEMPROT_NONE;
  282. }
  283. bool esp_memprot_is_locked_any()
  284. {
  285. return
  286. esp_memprot_get_split_line_lock() ||
  287. esp_memprot_get_pms_lock(MEMPROT_IRAM0_SRAM) ||
  288. esp_memprot_get_pms_lock(MEMPROT_DRAM0_SRAM) ||
  289. esp_memprot_get_monitor_lock(MEMPROT_IRAM0_SRAM) ||
  290. esp_memprot_get_monitor_lock(MEMPROT_DRAM0_SRAM);
  291. }
  292. uint32_t esp_memprot_get_violate_intr_on(mem_type_prot_t mem_type)
  293. {
  294. switch ( mem_type ) {
  295. case MEMPROT_IRAM0_SRAM:
  296. return memprot_ll_iram0_get_monitor_status_intr();
  297. case MEMPROT_DRAM0_SRAM:
  298. return memprot_ll_dram0_get_monitor_status_intr();
  299. default:
  300. ESP_LOGE(TAG, "Invalid mem_type (%s), aborting", mem_type_to_str(mem_type));
  301. abort();
  302. }
  303. }
  304. uint32_t esp_memprot_get_violate_addr(mem_type_prot_t mem_type)
  305. {
  306. switch ( mem_type ) {
  307. case MEMPROT_IRAM0_SRAM:
  308. return memprot_ll_iram0_get_monitor_status_fault_addr();
  309. case MEMPROT_DRAM0_SRAM:
  310. return memprot_ll_dram0_get_monitor_status_fault_addr();
  311. default:
  312. ESP_LOGE(TAG, "Invalid mem_type (%s), aborting", mem_type_to_str(mem_type));
  313. abort();
  314. }
  315. }
  316. uint32_t esp_memprot_get_violate_world(mem_type_prot_t mem_type)
  317. {
  318. switch ( mem_type ) {
  319. case MEMPROT_IRAM0_SRAM:
  320. return memprot_ll_iram0_get_monitor_status_fault_world();
  321. case MEMPROT_DRAM0_SRAM:
  322. return memprot_ll_dram0_get_monitor_status_fault_world();
  323. default:
  324. ESP_LOGE(TAG, "Invalid mem_type (%s), aborting", mem_type_to_str(mem_type));
  325. abort();
  326. }
  327. }
  328. uint32_t esp_memprot_get_violate_wr(mem_type_prot_t mem_type)
  329. {
  330. switch ( mem_type ) {
  331. case MEMPROT_IRAM0_SRAM:
  332. return memprot_ll_iram0_get_monitor_status_fault_wr();
  333. case MEMPROT_DRAM0_SRAM:
  334. return memprot_ll_dram0_get_monitor_status_fault_wr();
  335. default:
  336. ESP_LOGE(TAG, "Invalid mem_type (%s), aborting", mem_type_to_str(mem_type));
  337. abort();
  338. }
  339. }
  340. uint32_t esp_memprot_get_violate_loadstore(mem_type_prot_t mem_type)
  341. {
  342. switch ( mem_type ) {
  343. case MEMPROT_IRAM0_SRAM:
  344. return memprot_ll_iram0_get_monitor_status_fault_loadstore();
  345. default:
  346. ESP_LOGE(TAG, "Invalid mem_type (%s), aborting", mem_type_to_str(mem_type));
  347. abort();
  348. }
  349. }
  350. uint32_t esp_memprot_get_violate_byte_en(mem_type_prot_t mem_type)
  351. {
  352. switch ( mem_type ) {
  353. case MEMPROT_DRAM0_SRAM:
  354. return memprot_ll_dram0_get_monitor_status_fault_byte_en();
  355. default:
  356. ESP_LOGE(TAG, "Invalid mem_type (%s), aborting", mem_type_to_str(mem_type));
  357. abort();
  358. }
  359. }
  360. int esp_memprot_intr_get_cpuid()
  361. {
  362. return PRO_CPU_NUM;
  363. }
  364. void esp_memprot_set_intr_matrix(mem_type_prot_t mem_type)
  365. {
  366. ESP_LOGD(TAG, "esp_memprot_set_intr_matrix(%s)", mem_type_to_str(mem_type));
  367. ESP_INTR_DISABLE(ETS_MEMPROT_ERR_INUM);
  368. switch (mem_type) {
  369. case MEMPROT_IRAM0_SRAM:
  370. intr_matrix_set(esp_memprot_intr_get_cpuid(), memprot_ll_iram0_get_intr_source_num(), ETS_MEMPROT_ERR_INUM);
  371. break;
  372. case MEMPROT_DRAM0_SRAM:
  373. intr_matrix_set(esp_memprot_intr_get_cpuid(), memprot_ll_dram0_get_intr_source_num(), ETS_MEMPROT_ERR_INUM);
  374. break;
  375. default:
  376. ESP_LOGE(TAG, "Invalid mem_type (%s), aborting", mem_type_to_str(mem_type));
  377. abort();
  378. }
  379. /* Set the type and priority to cache error interrupts. */
  380. esprv_intc_int_set_type(BIT(ETS_MEMPROT_ERR_INUM), INTR_TYPE_LEVEL);
  381. esprv_intc_int_set_priority(ETS_MEMPROT_ERR_INUM, SOC_INTERRUPT_LEVEL_MEDIUM);
  382. ESP_INTR_ENABLE(ETS_MEMPROT_ERR_INUM);
  383. }
  384. void esp_memprot_set_prot(bool invoke_panic_handler, bool lock_feature, uint32_t *mem_type_mask)
  385. {
  386. esp_memprot_set_prot_int(invoke_panic_handler, lock_feature, NULL, mem_type_mask);
  387. }
  388. void esp_memprot_set_prot_int(bool invoke_panic_handler, bool lock_feature, void *split_addr, uint32_t *mem_type_mask)
  389. {
  390. ESP_LOGD(TAG, "esp_memprot_set_prot(panic_handler: %u, lock: %u, split.addr: 0x%08X, mem.types: 0x%08X", invoke_panic_handler, lock_feature, (uint32_t)split_addr, (uint32_t)mem_type_mask);
  391. uint32_t required_mem_prot = mem_type_mask == NULL ? (uint32_t)MEMPROT_ALL : *mem_type_mask;
  392. bool use_iram0 = required_mem_prot & MEMPROT_IRAM0_SRAM;
  393. bool use_dram0 = required_mem_prot & MEMPROT_DRAM0_SRAM;
  394. if (required_mem_prot == MEMPROT_NONE) {
  395. return;
  396. }
  397. //disable protection
  398. if (use_iram0) {
  399. esp_memprot_set_monitor_en(MEMPROT_IRAM0_SRAM, false);
  400. }
  401. if (use_dram0) {
  402. esp_memprot_set_monitor_en(MEMPROT_DRAM0_SRAM, false);
  403. }
  404. //panic handling
  405. if (invoke_panic_handler) {
  406. if (use_iram0) {
  407. esp_memprot_set_intr_matrix(MEMPROT_IRAM0_SRAM);
  408. }
  409. if (use_dram0) {
  410. esp_memprot_set_intr_matrix(MEMPROT_DRAM0_SRAM);
  411. }
  412. }
  413. //set split lines (must-have for all mem_types)
  414. const void *line_addr = split_addr == NULL ? esp_memprot_get_main_split_addr() : split_addr;
  415. esp_memprot_set_split_line(MEMPROT_IRAM0_LINE_1_SPLITLINE, line_addr);
  416. esp_memprot_set_split_line(MEMPROT_IRAM0_LINE_0_SPLITLINE, line_addr);
  417. esp_memprot_set_split_line(MEMPROT_IRAM0_DRAM0_SPLITLINE, line_addr);
  418. esp_memprot_set_split_line(MEMPROT_DRAM0_DMA_LINE_0_SPLITLINE, (void *)(MAP_IRAM_TO_DRAM((uint32_t)line_addr)));
  419. esp_memprot_set_split_line(MEMPROT_DRAM0_DMA_LINE_1_SPLITLINE, (void *)(MAP_IRAM_TO_DRAM((uint32_t)line_addr)));
  420. //set permissions
  421. if (required_mem_prot & MEMPROT_IRAM0_SRAM) {
  422. esp_memprot_iram_set_pms_area(MEMPROT_IRAM0_PMS_AREA_0, true, false, true);
  423. esp_memprot_iram_set_pms_area(MEMPROT_IRAM0_PMS_AREA_1, true, false, true);
  424. esp_memprot_iram_set_pms_area(MEMPROT_IRAM0_PMS_AREA_2, true, false, true);
  425. esp_memprot_iram_set_pms_area(MEMPROT_IRAM0_PMS_AREA_3, true, true, false);
  426. }
  427. if (required_mem_prot & MEMPROT_DRAM0_SRAM) {
  428. esp_memprot_dram_set_pms_area( MEMPROT_DRAM0_PMS_AREA_0, true, false );
  429. esp_memprot_dram_set_pms_area(MEMPROT_DRAM0_PMS_AREA_1, true, true);
  430. esp_memprot_dram_set_pms_area(MEMPROT_DRAM0_PMS_AREA_2, true, true);
  431. esp_memprot_dram_set_pms_area(MEMPROT_DRAM0_PMS_AREA_3, true, true);
  432. }
  433. //reenable protection
  434. if (use_iram0) {
  435. esp_memprot_monitor_clear_intr(MEMPROT_IRAM0_SRAM);
  436. esp_memprot_set_monitor_en(MEMPROT_IRAM0_SRAM, true);
  437. }
  438. if (use_dram0) {
  439. esp_memprot_monitor_clear_intr(MEMPROT_DRAM0_SRAM);
  440. esp_memprot_set_monitor_en(MEMPROT_DRAM0_SRAM, true);
  441. }
  442. //lock if required
  443. if (lock_feature) {
  444. esp_memprot_set_split_line_lock(true);
  445. if (use_iram0) {
  446. esp_memprot_set_pms_lock(MEMPROT_IRAM0_SRAM, true);
  447. esp_memprot_set_monitor_lock(MEMPROT_IRAM0_SRAM, true);
  448. }
  449. if (use_dram0) {
  450. esp_memprot_set_pms_lock(MEMPROT_DRAM0_SRAM, true);
  451. esp_memprot_set_monitor_lock(MEMPROT_DRAM0_SRAM, true);
  452. }
  453. }
  454. }