diff --git a/cpukit/score/cpu/arm/include/rtems/score/armv7-pmsa.h b/cpukit/score/cpu/arm/include/rtems/score/armv7-pmsa.h index dd9640c0ff..d579bfe7b8 100644 --- a/cpukit/score/cpu/arm/include/rtems/score/armv7-pmsa.h +++ b/cpukit/score/cpu/arm/include/rtems/score/armv7-pmsa.h @@ -38,6 +38,7 @@ #define _RTEMS_SCORE_ARMV7_PMSA_H #include +#include #include #ifdef __cplusplus @@ -371,6 +372,32 @@ ARMV7_PMSA_TEXT_SECTION static inline uint32_t _ARMV7_PMSA_Find_region( return UINT32_MAX; } +ARMV7_PMSA_TEXT_SECTION +static inline bool _ARMV7_PMSA_Is_region_enabled(uint32_t index) +{ + _Assert(index < _ARMV7_PMSA_Get_max_regions()); + + _ARMV7_Write_rgnr(ARMV7_RGNR_REGION(index)); + _ARM_Instruction_synchronization_barrier(); + + return (_ARMV7_Read_drsr() & ARMV7_RSR_EN) != 0; +} + +ARMV7_PMSA_TEXT_SECTION +static inline uint32_t _ARMV7_PMSA_Find_available_region(void) +{ + uint32_t region_count = _ARMV7_PMSA_Get_max_regions(); + uint32_t index; + + for (index = 0; index < region_count; index++) { + if (!_ARMV7_PMSA_Is_region_enabled(index)) { + return index; + } + } + + return UINT32_MAX; +} + /** @} */ #ifdef __cplusplus