mpu.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2023-09-25 tangzz98 the first version
  9. */
  10. #ifndef __MPU_H__
  11. #define __MPU_H__
  12. #ifdef RT_USING_MEM_PROTECTION
  13. #include <board.h>
  14. #define MPU_MIN_REGION_SIZE 32U
  15. /* MPU attributes for configuring data region permission */
  16. /* Privileged No Access, Unprivileged No Access */
  17. #define P_NA_U_NA ((0x0 << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk | MPU_RASR_XN_Msk)
  18. /* Privileged Read Write, Unprivileged No Access */
  19. #define P_RW_U_NA ((0x1 << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk | MPU_RASR_XN_Msk)
  20. /* Privileged Read Write, Unprivileged Read Only */
  21. #define P_RW_U_RO ((0x2 << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk | MPU_RASR_XN_Msk)
  22. /* Privileged Read Write, Unprivileged Read Write */
  23. #define P_RW_U_RW ((0x3 << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk | MPU_RASR_XN_Msk)
  24. /* Privileged Read Only, Unprivileged No Access */
  25. #define P_RO_U_NA ((0x5 << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk | MPU_RASR_XN_Msk)
  26. /* Privileged Read Only, Unprivileged Read Only */
  27. #define P_RO_U_RO ((0x6 << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk | MPU_RASR_XN_Msk)
  28. /* MPU attributes for configuring code region permission */
  29. /* Privileged Read Write Execute, Unprivileged Read Write Execute */
  30. #define P_RWX_U_RWX ((0x3 << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk)
  31. /* Privileged Read Write Execute, Unprivileged Read Execute */
  32. #define P_RWX_U_RX ((0x2 << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk)
  33. /* Privileged Read Write Execute, Unprivileged No Access */
  34. #define P_RWX_U_NA ((0x1 << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk)
  35. /* Privileged Read Execute, Unprivileged Read Execute */
  36. #define P_RX_U_RX ((0x6 << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk)
  37. /* Privileged Read Execute, Unprivileged No Access */
  38. #define P_RX_U_NA ((0x5 << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk)
  39. /* MPU attributes for configuring memory type, cacheability and shareability */
  40. #define STRONGLY_ORDERED_SHAREABLE MPU_RASR_S_Msk
  41. #define DEVICE_SHAREABLE (MPU_RASR_B_Msk | MPU_RASR_S_Msk)
  42. #define NORMAL_OUTER_INNER_WRITE_THROUGH_SHAREABLE \
  43. (MPU_RASR_C_Msk | MPU_RASR_S_Msk)
  44. #define NORMAL_OUTER_INNER_WRITE_THROUGH_NON_SHAREABLE MPU_RASR_C_Msk
  45. #define NORMAL_OUTER_INNER_WRITE_BACK_SHAREABLE \
  46. (MPU_RASR_C_Msk | MPU_RASR_B_Msk | MPU_RASR_S_Msk)
  47. #define NORMAL_OUTER_INNER_WRITE_BACK_NON_SHAREABLE \
  48. (MPU_RASR_C_Msk | MPU_RASR_B_Msk)
  49. #define NORMAL_OUTER_INNER_NON_CACHEABLE_SHAREABLE \
  50. ((1 << MPU_RASR_TEX_Pos) | MPU_RASR_S_Msk)
  51. #define NORMAL_OUTER_INNER_NON_CACHEABLE_NON_SHAREABLE \
  52. (1 << MPU_RASR_TEX_Pos)
  53. #define NORMAL_OUTER_INNER_WRITE_BACK_WRITE_READ_ALLOCATE_SHAREABLE \
  54. ((1 << MPU_RASR_TEX_Pos) |\
  55. MPU_RASR_C_Msk | MPU_RASR_B_Msk | MPU_RASR_S_Msk)
  56. #define NORMAL_OUTER_INNER_WRITE_BACK_WRITE_READ_ALLOCATE_NON_SHAREABLE \
  57. ((1 << MPU_RASR_TEX_Pos) | MPU_RASR_C_Msk | MPU_RASR_B_Msk)
  58. #define DEVICE_NON_SHAREABLE (2 << MPU_RASR_TEX_Pos)
  59. #define RESERVED ((2 << MPU_RASR_TEX_Pos) | MPU_RASR_B_Msk)
  60. typedef struct
  61. {
  62. rt_thread_t thread; /* Thread that triggered exception */
  63. void *addr; /* Address of faulting memory access */
  64. rt_mem_region_t region; /* Configurations of the memory region containing the address */
  65. rt_uint8_t mmfsr; /* Content of MemManage Status Register */
  66. } rt_mem_exception_info_t;
  67. typedef void (*rt_hw_mpu_exception_hook_t)(rt_mem_exception_info_t *);
  68. #define RT_ARM_MEM_ATTR(perm, type) ((rt_mem_attr_t){ (perm) | (type)})
  69. /* Convenient macros for configuring data region attributes with default memory type */
  70. #define RT_MEM_REGION_P_NA_U_NA RT_ARM_MEM_ATTR(P_NA_U_NA, RESERVED)
  71. #define RT_MEM_REGION_P_RW_U_RW RT_ARM_MEM_ATTR(P_RW_U_RW, RESERVED)
  72. #define RT_MEM_REGION_P_RW_U_RO RT_ARM_MEM_ATTR(P_RW_U_RO, RESERVED)
  73. #define RT_MEM_REGION_P_RW_U_NA RT_ARM_MEM_ATTR(P_RW_U_NA, RESERVED)
  74. #define RT_MEM_REGION_P_RO_U_RO RT_ARM_MEM_ATTR(P_RO_U_RO, RESERVED)
  75. #define RT_MEM_REGION_P_RO_U_NA RT_ARM_MEM_ATTR(P_RO_U_NA, RESERVED)
  76. /* Convenient macros for configuring code region attributes with default memory type */
  77. #define RT_MEM_REGION_P_RWX_U_RWX RT_ARM_MEM_ATTR(P_RWX_U_RWX, RESERVED)
  78. #define RT_MEM_REGION_P_RWX_U_RX RT_ARM_MEM_ATTR(P_RWX_U_RX, RESERVED)
  79. #define RT_MEM_REGION_P_RWX_U_NA RT_ARM_MEM_ATTR(P_RWX_U_NA, RESERVED)
  80. #define RT_MEM_REGION_P_RX_U_RX RT_ARM_MEM_ATTR(P_RX_U_RX, RESERVED)
  81. #define RT_MEM_REGION_P_RX_U_NA RT_ARM_MEM_ATTR(P_RX_U_NA, RESERVED)
  82. rt_bool_t rt_hw_mpu_region_valid(rt_mem_region_t *region);
  83. rt_err_t rt_hw_mpu_init(void);
  84. rt_err_t rt_hw_mpu_add_region(rt_thread_t thread, rt_mem_region_t *region);
  85. rt_err_t rt_hw_mpu_delete_region(rt_thread_t thread, rt_mem_region_t *region);
  86. rt_err_t rt_hw_mpu_update_region(rt_thread_t thread, rt_mem_region_t *region);
  87. rt_err_t rt_hw_mpu_exception_set_hook(rt_hw_mpu_exception_hook_t hook);
  88. #endif /* RT_USING_MEM_PROTECTION */
  89. #endif /* __MPU_H__ */