memprot.h 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588
  1. /*
  2. * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. /* INTERNAL API
  7. * generic interface to MMU memory protection features
  8. */
  9. #pragma once
  10. #include <stdbool.h>
  11. #include <stdint.h>
  12. #include "esp_attr.h"
  13. #include "esp_err.h"
  14. #ifdef __cplusplus
  15. extern "C" {
  16. #endif
  17. //convenient constants for better code readabilty
  18. #define RD_ENA true
  19. #define RD_DIS false
  20. #define WR_ENA true
  21. #define WR_DIS false
  22. #define EX_ENA true
  23. #define EX_DIS false
  24. #define RD_LOW_ENA true
  25. #define RD_LOW_DIS false
  26. #define WR_LOW_ENA true
  27. #define WR_LOW_DIS false
  28. #define EX_LOW_ENA true
  29. #define EX_LOW_DIS false
  30. #define RD_HIGH_ENA true
  31. #define RD_HIGH_DIS false
  32. #define WR_HIGH_ENA true
  33. #define WR_HIGH_DIS false
  34. #define EX_HIGH_ENA true
  35. #define EX_HIGH_DIS false
  36. #define PANIC_HNDL_ON true
  37. #define PANIC_HNDL_OFF false
  38. #define MEMPROT_LOCK true
  39. #define MEMPROT_UNLOCK false
  40. #define DEF_SPLIT_LINE NULL
  41. #define MEMPROT_INVALID_ADDRESS -1
  42. //memory range types
  43. typedef enum {
  44. MEMPROT_NONE = 0x00000000,
  45. MEMPROT_IRAM0_SRAM = 0x00000001, //0x40020000-0x4006FFFF, RWX
  46. MEMPROT_DRAM0_SRAM = 0x00000002, //0x3FFB0000-0x3FFFFFFF, RW
  47. MEMPROT_IRAM0_RTCFAST = 0x00000004, //0x40070000-0x40071FFF, RWX
  48. MEMPROT_DRAM0_RTCFAST = 0x00000008, //0x3FF9E000-0x3FF9FFFF, RW
  49. MEMPROT_PERI1_RTCSLOW = 0x00000010, //0x3F421000-0x3F423000, RW
  50. MEMPROT_PERI2_RTCSLOW_0 = 0x00000020, //0x50001000-0x50003000, RWX
  51. MEMPROT_PERI2_RTCSLOW_1 = 0x00000040, //0x60002000-0x60004000, RWX
  52. MEMPROT_ALL = 0xFFFFFFFF
  53. } mem_type_prot_t;
  54. /**
  55. * @brief Returns splitting address for required memory region
  56. *
  57. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  58. *
  59. * @return Splitting address for the memory region required.
  60. * The address is given by region-specific global symbol exported from linker script,
  61. * it is not read out from related configuration register.
  62. */
  63. uint32_t * esp_memprot_get_split_addr(mem_type_prot_t mem_type);
  64. /**
  65. * @brief Initializes illegal memory access control for required memory section.
  66. *
  67. * All memory access interrupts share ETS_MEMACCESS_ERR_INUM input channel, it is caller's
  68. * responsibility to properly detect actual intr. source as well as possible prioritization in case
  69. * of multiple source reported during one intr.handling routine run
  70. *
  71. * @param mem_type Memory protection area type (see mem_type_prot_t enum)\
  72. *
  73. * @return ESP_OK on success, ESP_ERR_INVALID_ARG on failure
  74. */
  75. esp_err_t esp_memprot_intr_init(mem_type_prot_t mem_type);
  76. /**
  77. * @brief Enable/disable the memory protection interrupt
  78. *
  79. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  80. * @param enable enable/disable
  81. *
  82. * @return ESP_OK on success, ESP_ERR_INVALID_ARG on failure
  83. */
  84. esp_err_t esp_memprot_intr_ena(mem_type_prot_t mem_type, bool enable);
  85. /**
  86. * @brief Sets a request for clearing interrupt-on flag for specified memory region (register write)
  87. *
  88. * @note When called without actual interrupt-on flag set, subsequent occurrence of related interrupt is ignored.
  89. * Should be used only after the real interrupt appears, typically as the last step in interrupt handler's routine.
  90. *
  91. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  92. *
  93. * @return ESP_OK on success, ESP_ERR_INVALID_ARG on failure
  94. */
  95. esp_err_t esp_memprot_clear_intr(mem_type_prot_t mem_type);
  96. /**
  97. * @brief Detects which memory protection interrupt is active
  98. *
  99. * @note Check order
  100. * MEMPROT_IRAM0_SRAM
  101. * MEMPROT_IRAM0_RTCFAST
  102. * MEMPROT_DRAM0_SRAM
  103. * MEMPROT_DRAM0_RTCFAST
  104. *
  105. * @return Memory protection area type (see mem_type_prot_t enum)
  106. */
  107. mem_type_prot_t esp_memprot_get_active_intr_memtype(void);
  108. /**
  109. * @brief Gets interrupt status register contents for specified memory region
  110. *
  111. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  112. * @param fault_reg_val Contents of status register
  113. *
  114. * @return ESP_OK on success, ESP_ERR_INVALID_ARG on failure
  115. */
  116. esp_err_t esp_memprot_get_fault_reg(mem_type_prot_t mem_type, uint32_t *fault_reg_val);
  117. /**
  118. * @brief Get details of given interrupt status
  119. *
  120. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  121. * @param faulting_address Faulting address causing the interrupt [out]
  122. * @param op_type Operation being processed at the faulting address [out]
  123. * IRAM0: 0 - read, 1 - write
  124. * DRAM0: 0 - read, 1 - write
  125. * @param op_subtype Additional info for op_type [out]
  126. * IRAM0: 0 - instruction segment access, 1 - data segment access
  127. * DRAM0: 0 - non-atomic operation, 1 - atomic operation
  128. * @return ESP_OK on success, ESP_ERR_INVALID_ARG on failure
  129. */
  130. esp_err_t esp_memprot_get_fault_status(mem_type_prot_t mem_type, uint32_t **faulting_address, uint32_t *op_type, uint32_t *op_subtype);
  131. /**
  132. * @brief Gets string representation of required memory region identifier
  133. *
  134. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  135. *
  136. * @return mem_type as string
  137. */
  138. const char * esp_memprot_type_to_str(mem_type_prot_t mem_type);
  139. /**
  140. * @brief Detects whether any of the interrupt locks is active (requires digital system reset to unlock)
  141. *
  142. * @return true/false
  143. */
  144. bool esp_memprot_is_locked_any(void);
  145. /**
  146. * @brief Sets lock for specified memory region.
  147. *
  148. * Locks can be unlocked only by digital system reset
  149. *
  150. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  151. *
  152. * @return ESP_OK on success, ESP_ERR_INVALID_ARG on failure
  153. */
  154. esp_err_t esp_memprot_set_lock(mem_type_prot_t mem_type);
  155. /**
  156. * @brief Gets lock status for required memory region
  157. *
  158. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  159. * @param locked Settings locked: true/false (locked/unlocked)
  160. *
  161. * @return ESP_OK on success, ESP_ERR_INVALID_ARG on failure
  162. */
  163. esp_err_t esp_memprot_get_lock(mem_type_prot_t mem_type, bool *locked);
  164. /**
  165. * @brief Gets permission control configuration register contents for required memory region
  166. *
  167. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  168. * @param conf_reg_val Permission control register contents
  169. *
  170. * @return ESP_OK on success, ESP_ERR_INVALID_ARG on failure
  171. */
  172. esp_err_t esp_memprot_get_conf_reg(mem_type_prot_t mem_type, uint32_t *conf_reg_val);
  173. /**
  174. * @brief Gets interrupt permission settings for unified management block
  175. *
  176. * Gets interrupt permission settings register contents for required memory region, returns settings for unified management blocks
  177. *
  178. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  179. * @param perm_reg Permission settings register contents
  180. *
  181. * @return ESP_OK on success, ESP_ERR_INVALID_ARG on failure
  182. */
  183. esp_err_t esp_memprot_get_perm_uni_reg(mem_type_prot_t mem_type, uint32_t *perm_reg);
  184. /**
  185. * @brief Gets interrupt permission settings for split management block
  186. *
  187. * Gets interrupt permission settings register contents for required memory region (unified management blocks)
  188. *
  189. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  190. * @return split_reg Unified management settings register contents
  191. *
  192. * @return ESP_OK on success, ESP_ERR_INVALID_ARG on failure
  193. */
  194. esp_err_t esp_memprot_get_perm_split_reg(mem_type_prot_t mem_type, uint32_t *split_reg);
  195. /**
  196. * @brief Detects whether any of the memory protection interrupts is enabled
  197. *
  198. * @return true/false
  199. */
  200. bool esp_memprot_is_intr_ena_any(void);
  201. /**
  202. * @brief Gets interrupt-enabled flag for given memory region
  203. *
  204. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  205. * @param enable_bit Interrupt-enabled flag
  206. *
  207. * @return ESP_OK on success, ESP_ERR_INVALID_ARG on failure
  208. */
  209. esp_err_t esp_memprot_get_intr_ena_bit(mem_type_prot_t mem_type, uint32_t *enable_bit);
  210. /**
  211. * @brief Gets interrupt-active flag for given memory region
  212. *
  213. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  214. * @param intr_on_bit Interrupt-active flag
  215. *
  216. * @return ESP_OK on success, ESP_ERR_INVALID_ARG on failure */
  217. esp_err_t esp_memprot_get_intr_on_bit(mem_type_prot_t mem_type, uint32_t *intr_on_bit);
  218. /**
  219. * @brief Gets interrupt-clear request flag for given memory region
  220. *
  221. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  222. * @param clear_bit Interrupt-clear request flag
  223. *
  224. * @return ESP_OK on success, ESP_ERR_INVALID_ARG on failure
  225. */
  226. esp_err_t esp_memprot_get_intr_clr_bit(mem_type_prot_t mem_type, uint32_t *clear_bit);
  227. /**
  228. * @brief Gets read permission value for specified block and memory region
  229. *
  230. * Returns read permission bit value for required unified-management block (0-3) in given memory region.
  231. * Applicable to all memory types.
  232. *
  233. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  234. * @param block Memory block identifier (0-3)
  235. * @param read_bit Read permission value for required block
  236. *
  237. * @return ESP_OK on success, ESP_ERR_INVALID_ARG on failure
  238. */
  239. esp_err_t esp_memprot_get_uni_block_read_bit(mem_type_prot_t mem_type, uint32_t block, uint32_t *read_bit);
  240. /**
  241. * @brief Gets write permission value for specified block and memory region
  242. *
  243. * Returns write permission bit value for required unified-management block (0-3) in given memory region.
  244. * Applicable to all memory types.
  245. *
  246. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  247. * @param block Memory block identifier (0-3)
  248. * @param write_bit Write permission value for required block
  249. *
  250. * @return ESP_OK on success, ESP_ERR_INVALID_ARG on failure
  251. */
  252. esp_err_t esp_memprot_get_uni_block_write_bit(mem_type_prot_t mem_type, uint32_t block, uint32_t *write_bit);
  253. /**
  254. * @brief Gets execute permission value for specified block and memory region
  255. *
  256. * Returns execute permission bit value for required unified-management block (0-3) in given memory region.
  257. * Applicable only to IRAM memory types
  258. *
  259. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  260. * @param block Memory block identifier (0-3)
  261. * @param exec_bit Execute permission value for required block
  262. *
  263. * @return ESP_OK on success, ESP_ERR_INVALID_ARG on failure
  264. */
  265. esp_err_t esp_memprot_get_uni_block_exec_bit(mem_type_prot_t mem_type, uint32_t block, uint32_t *exec_bit);
  266. /**
  267. * @brief Sets permissions for specified block in DRAM region
  268. *
  269. * Sets Read and Write permission for specified unified-management block (0-3) in given memory region.
  270. * Applicable only to DRAM memory types
  271. *
  272. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  273. * @param block Memory block identifier (0-3)
  274. * @param write_perm Write permission flag
  275. * @param read_perm Read permission flag
  276. *
  277. * @return ESP_OK on success, ESP_ERR_INVALID_ARG on failure
  278. */
  279. esp_err_t esp_memprot_set_uni_block_perm_dram(mem_type_prot_t mem_type, uint32_t block, bool write_perm, bool read_perm);
  280. /**
  281. * @brief Sets permissions for high and low memory segment in DRAM region
  282. *
  283. * Sets Read and Write permission for both low and high memory segments given by splitting address.
  284. * The splitting address must be equal to or higher then beginning of block 5
  285. * Applicable only to DRAM memory types
  286. *
  287. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  288. * @param split_addr Address to split the memory region to lower and higher segment
  289. * @param lw Low segment Write permission flag
  290. * @param lr Low segment Read permission flag
  291. * @param hw High segment Write permission flag
  292. * @param hr High segment Read permission flag
  293. *
  294. * @return ESP_OK on success, ESP_ERR_INVALID_ARG on failure
  295. */
  296. esp_err_t esp_memprot_set_prot_dram(mem_type_prot_t mem_type, uint32_t *split_addr, bool lw, bool lr, bool hw, bool hr);
  297. /**
  298. * @brief Sets permissions for specified block in IRAM region
  299. *
  300. * Sets Read, Write and Execute permission for specified unified-management block (0-3) in given memory region.
  301. * Applicable only to IRAM memory types
  302. *
  303. * @param mem_type Memory protection area type (MEMPROT_IRAM0_SRAM)
  304. * @param block Memory block identifier (0-3)
  305. * @param write_perm Write permission flag
  306. * @param read_perm Read permission flag
  307. * @param exec_perm Execute permission flag
  308. *
  309. * @return ESP_OK on success
  310. * ESP_ERR_NOT_SUPPORTED on invalid mem_type
  311. * ESP_ERR_INVALID_ARG on incorrect block number
  312. */
  313. esp_err_t esp_memprot_set_uni_block_perm_iram(mem_type_prot_t mem_type, uint32_t block, bool write_perm, bool read_perm, bool exec_perm);
  314. /**
  315. * @brief Sets permissions for high and low memory segment in IRAM region
  316. *
  317. * Sets Read, Write and Execute permission for both low and high memory segments given by splitting address.
  318. * The splitting address must be equal to or higher then beginning of block 5
  319. * Applicable only to IRAM memory types
  320. *
  321. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  322. * @param split_addr Address to split the memory region to lower and higher segment
  323. * @param lw Low segment Write permission flag
  324. * @param lr Low segment Read permission flag
  325. * @param lx Low segment Execute permission flag
  326. * @param hw High segment Write permission flag
  327. * @param hr High segment Read permission flag
  328. * @param hx High segment Execute permission flag
  329. *
  330. * @return ESP_OK on success, ESP_ERR_INVALID_ARG on failure
  331. */
  332. esp_err_t esp_memprot_set_prot_iram(mem_type_prot_t mem_type, uint32_t *split_addr, bool lw, bool lr, bool lx, bool hw, bool hr, bool hx);
  333. /**
  334. * @brief Activates memory protection for all supported memory region types
  335. *
  336. * @note The feature is disabled when JTAG interface is connected
  337. *
  338. * @param invoke_panic_handler map mem.prot interrupt to ETS_MEMACCESS_ERR_INUM and thus invokes panic handler when fired ('true' not suitable for testing)
  339. * @param lock_feature sets LOCK bit, see esp_memprot_set_lock() ('true' not suitable for testing)
  340. * @param mem_type_mask holds a set of required memory protection types (bitmask built of mem_type_prot_t). NULL means default (MEMPROT_ALL in this version)
  341. *
  342. * @return ESP_OK on success, ESP_ERR_INVALID_ARG on failure
  343. */
  344. esp_err_t esp_memprot_set_prot(bool invoke_panic_handler, bool lock_feature, uint32_t *mem_type_mask);
  345. /**
  346. * @brief Get permission settings bits for IRAM0 split mgmt. Only IRAM0 memory types allowed
  347. *
  348. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  349. * @param lw Low segment Write permission flag
  350. * @param lr Low segment Read permission flag
  351. * @param lx Low segment Execute permission flag
  352. * @param hw High segment Write permission flag
  353. * @param hr High segment Read permission flag
  354. * @param hx High segment Execute permission flag
  355. *
  356. * @return ESP_OK on success, ESP_ERR_INVALID_ARG on failure
  357. */
  358. esp_err_t esp_memprot_get_perm_split_bits_iram(mem_type_prot_t mem_type, bool *lw, bool *lr, bool *lx, bool *hw, bool *hr, bool *hx);
  359. /**
  360. * @brief Get permission settings bits for DRAM0 split mgmt. Only DRAM0 memory types allowed
  361. *
  362. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  363. * @param lw Low segment Write permission flag
  364. * @param lr Low segment Read permission flag
  365. * @param hw High segment Write permission flag
  366. * @param hr High segment Read permission flag
  367. *
  368. * @return ESP_OK on success, ESP_ERR_INVALID_ARG on failure
  369. */
  370. esp_err_t esp_memprot_get_perm_split_bits_dram(mem_type_prot_t mem_type, bool *lw, bool *lr, bool *hw, bool *hr);
  371. /**
  372. * @brief Sets permissions for high and low memory segment in PERIBUS1 region
  373. *
  374. * Sets Read and Write permission for both low and high memory segments given by splitting address.
  375. * Applicable only to PERIBUS1 memory types
  376. *
  377. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  378. * @param split_addr Address to split the memory region to lower and higher segment
  379. * @param lw Low segment Write permission flag
  380. * @param lr Low segment Read permission flag
  381. * @param hw High segment Write permission flag
  382. * @param hr High segment Read permission flag
  383. *
  384. * @return ESP_OK on success, ESP_ERR_INVALID_ARG on failure
  385. */
  386. esp_err_t esp_memprot_set_prot_peri1(mem_type_prot_t mem_type, uint32_t *split_addr, bool lw, bool lr, bool hw, bool hr);
  387. /**
  388. * @brief Get permission settings bits for PERIBUS1 split mgmt. Only PERIBUS1 memory types allowed
  389. *
  390. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  391. * @param lw Low segment Write permission flag
  392. * @param lr Low segment Read permission flag
  393. * @param hw High segment Write permission flag
  394. * @param hr High segment Read permission flag
  395. *
  396. * @return ESP_OK on success, ESP_ERR_INVALID_ARG on failure
  397. */
  398. esp_err_t esp_memprot_get_perm_split_bits_peri1(mem_type_prot_t mem_type, bool *lw, bool *lr, bool *hw, bool *hr);
  399. /**
  400. * @brief Get permission settings bits for PERIBUS2 split mgmt. Only PERIBUS2 memory types allowed
  401. *
  402. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  403. * @param lw Low segment Write permission flag
  404. * @param lr Low segment Read permission flag
  405. * @param lx Low segment Execute permission flag
  406. * @param hw High segment Write permission flag
  407. * @param hr High segment Read permission flag
  408. * @param hx High segment Execute permission flag
  409. *
  410. * @return ESP_OK on success, ESP_ERR_INVALID_ARG on failure
  411. */
  412. esp_err_t esp_memprot_get_perm_split_bits_peri2(mem_type_prot_t mem_type, bool *lw, bool *lr, bool *lx, bool *hw, bool *hr, bool *hx);
  413. /**
  414. * @brief Configures the memory protection for high and low segment in PERIBUS2 region
  415. *
  416. * Sets Read Write permission for both low and high memory segments given by splitting address.
  417. * Applicable only to PERIBUS2 memory types
  418. *
  419. * @param mem_type Memory protection area type (MEMPROT_PERI2_RTCSLOW_0, MEMPROT_PERI2_RTCSLOW_1)
  420. * @param split_addr Address to split the memory region to lower and higher segment (32bit aligned)
  421. * @param lw Low segment Write permission flag
  422. * @param lr Low segment Read permission flag
  423. * @param lx Low segment Execute permission flag
  424. * @param hw High segment Write permission flag
  425. * @param hr High segment Read permission flag
  426. * @param hx High segment Execute permission flag
  427. *
  428. * @return ESP_OK on success
  429. * ESP_ERR_NOT_SUPPORTED on invalid mem_type
  430. * ESP_ERR_INVALID_STATE on splitting address out of PERIBUS2 range
  431. * ESP_ERR_INVALID_SIZE on splitting address not 32-bit aligned
  432. */
  433. esp_err_t esp_memprot_set_prot_peri2(mem_type_prot_t mem_type, uint32_t *split_addr, bool lw, bool lr, bool lx, bool hw, bool hr, bool hx);
  434. /**
  435. * @brief Get permissions for specified memory type. Irrelevant bits are ignored
  436. *
  437. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  438. * @param lw Low segment Write permission flag
  439. * @param lr Low segment Read permission flag
  440. * @param lx Low segment Execute permission flag
  441. * @param hw High segment Write permission flag
  442. * @param hr High segment Read permission flag
  443. * @param hx High segment Execute permission flag
  444. *
  445. * @return ESP_OK on success
  446. * ESP_ERR_INVALID_ARG on NULL lw/lr/lx/hw/hr/hx args
  447. * ESP_ERR_NOT_SUPPORTED on invalid mem_type
  448. */
  449. esp_err_t esp_memprot_get_permissions(mem_type_prot_t mem_type, bool *lw, bool *lr, bool *lx, bool *hw, bool *hr, bool *hx);
  450. /**
  451. * @brief Get Read permission settings for low and high regions of given memory type
  452. *
  453. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  454. * @param lr Low segment Read permission flag
  455. * @param hr High segment Read permission flag
  456. *
  457. * @return ESP_OK on success
  458. * ESP_ERR_INVALID_ARG on NULL lr/hr args
  459. * ESP_ERR_NOT_SUPPORTED on invalid mem_type
  460. */
  461. esp_err_t esp_memprot_get_perm_read(mem_type_prot_t mem_type, bool *lr, bool *hr);
  462. /**
  463. * @brief Get Write permission settings for low and high regions of given memory type
  464. *
  465. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  466. * @param lr Low segment Write permission flag
  467. * @param hr High segment Write permission flag
  468. *
  469. * @return ESP_OK on success
  470. * ESP_ERR_INVALID_ARG on NULL lw/hw args
  471. * ESP_ERR_NOT_SUPPORTED on invalid mem_type
  472. */
  473. esp_err_t esp_memprot_get_perm_write(mem_type_prot_t mem_type, bool *lw, bool *hw);
  474. /**
  475. * @brief Get Execute permission settings for low and high regions of given memory type
  476. * Applicable only to IBUS-compatible memory types
  477. *
  478. * @param mem_type Memory protection area type (MEMPROT_IRAM0_SRAM, MEMPROT_IRAM0_RTCFAST, MEMPROT_PERI2_RTCSLOW_0, MEMPROT_PERI2_RTCSLOW_1)
  479. * @param lx Low segment Exec permission flag
  480. * @param hx High segment Exec permission flag
  481. *
  482. * @return ESP_OK on success
  483. * ESP_ERR_INVALID_ARG on NULL lx/hx args
  484. * ESP_ERR_NOT_SUPPORTED on invalid mem_type
  485. */
  486. esp_err_t esp_memprot_get_perm_exec(mem_type_prot_t mem_type, bool *lx, bool *hx);
  487. /**
  488. * @brief Returns the lowest address in required memory region
  489. *
  490. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  491. *
  492. * @return Required address or MEMPROT_INVALID_ADDRESS for invalid mem_type
  493. */
  494. uint32_t esp_memprot_get_low_limit(mem_type_prot_t mem_type);
  495. /**
  496. * @brief Returns the highest address in required memory region
  497. *
  498. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  499. *
  500. * @return Required address or MEMPROT_INVALID_ADDRESS for invalid mem_type
  501. */
  502. uint32_t esp_memprot_get_high_limit(mem_type_prot_t mem_type);
  503. /**
  504. * @brief Sets READ permission bit for required memory region
  505. *
  506. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  507. * @param lr Low segment Read permission flag
  508. * @param hr High segment Read permission flag
  509. *
  510. * @return ESP_OK on success
  511. * ESP_ERR_NOT_SUPPORTED on invalid mem_type
  512. */
  513. esp_err_t esp_memprot_set_read_perm(mem_type_prot_t mem_type, bool lr, bool hr);
  514. /**
  515. * @brief Sets WRITE permission bit for required memory region
  516. *
  517. * @param mem_type Memory protection area type (see mem_type_prot_t enum)
  518. * @param lr Low segment Write permission flag
  519. * @param hr High segment Write permission flag
  520. *
  521. * @return ESP_OK on success
  522. * ESP_ERR_NOT_SUPPORTED on invalid mem_type
  523. */
  524. esp_err_t esp_memprot_set_write_perm(mem_type_prot_t mem_type, bool lw, bool hw);
  525. /**
  526. * @brief Sets EXECUTE permission bit for required memory region
  527. *
  528. * @param mem_type Memory protection area type (MEMPROT_IRAM0_SRAM, MEMPROT_IRAM0_RTCFAST, MEMPROT_PERI2_RTCSLOW_0, MEMPROT_PERI2_RTCSLOW_1)
  529. * @param lr Low segment Exec permission flag
  530. * @param hr High segment Exec permission flag
  531. *
  532. * @return ESP_OK on success
  533. * ESP_ERR_NOT_SUPPORTED on invalid mem_type
  534. */
  535. esp_err_t esp_memprot_set_exec_perm(mem_type_prot_t mem_type, bool lx, bool hx);
  536. #ifdef __cplusplus
  537. }
  538. #endif