From b4f488e8bf66bcc95fafa8c0db3843dc998f58de Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Tue, 8 Jan 2019 07:46:19 -0600 Subject: [PATCH] Revert "arch/arm/armv7-m: MPU: mpu_log2regionceil needs take into account the offset too" Masayuki Ishikawa reports that this commit breaks ALL PROTECTED mode builds. It violates the basic requirements of the use of the MPU in protected mode. Those basic requirements are: 1. The MPU region must be aligned to the base address of the memory region being mapped (it may NEVER extend before the memory region). That is, the following MUST always be zero: (base & ((1 << l2size) - 1)) 2. The MPU region must never extend beyond the end of the memory region. That is, the following must be true: size >= (1 << l2size) This reverts commit 8b63d0230936bd7d6bd94f4c76b9402946f69b21. --- arch/arm/src/armv7-m/mpu.h | 24 ++++++++++++------------ arch/arm/src/armv7-m/up_mpu.c | 21 +++++++-------------- 2 files changed, 19 insertions(+), 26 deletions(-) diff --git a/arch/arm/src/armv7-m/mpu.h b/arch/arm/src/armv7-m/mpu.h index 5017023c66f..4a5bab065bd 100644 --- a/arch/arm/src/armv7-m/mpu.h +++ b/arch/arm/src/armv7-m/mpu.h @@ -170,11 +170,11 @@ unsigned int mpu_allocregion(void); * Determine the smallest value of l2size (log base 2 size) such that the * following is true: * - * (base & ((1 << l2size) - 1)) + size <= (1 << l2size) + * size <= (1 << l2size) * ****************************************************************************/ -uint8_t mpu_log2regionceil(uintptr_t base, size_t size); +uint8_t mpu_log2regionceil(size_t size); /**************************************************************************** * Name: mpu_log2regionfloor @@ -183,11 +183,11 @@ uint8_t mpu_log2regionceil(uintptr_t base, size_t size); * Determine the largest value of l2size (log base 2 size) such that the * following is true: * - * (base & ((1 << l2size) - 1)) + size >= (1 << l2size) + * size >= (1 << l2size) * ****************************************************************************/ -uint8_t mpu_log2regionfloor(uintptr_t base, size_t size); +uint8_t mpu_log2regionfloor(size_t size); /**************************************************************************** * Name: mpu_subregion @@ -286,7 +286,7 @@ static inline void mpu_priv_stronglyordered(uintptr_t base, size_t size) /* Select the region size and the sub-region map */ - l2size = mpu_log2regionceil(base, size); + l2size = mpu_log2regionceil(size); subregions = mpu_subregion(base, size, l2size); /* The configure the region */ @@ -327,7 +327,7 @@ static inline void mpu_user_flash(uintptr_t base, size_t size) /* Select the region size and the sub-region map */ - l2size = mpu_log2regionceil(base, size); + l2size = mpu_log2regionceil(size); subregions = mpu_subregion(base, size, l2size); /* The configure the region */ @@ -365,7 +365,7 @@ static inline void mpu_priv_flash(uintptr_t base, size_t size) /* Select the region size and the sub-region map */ - l2size = mpu_log2regionceil(base, size); + l2size = mpu_log2regionceil(size); subregions = mpu_subregion(base, size, l2size); /* The configure the region */ @@ -403,7 +403,7 @@ static inline void mpu_user_intsram(uintptr_t base, size_t size) /* Select the region size and the sub-region map */ - l2size = mpu_log2regionceil(base, size); + l2size = mpu_log2regionceil(size); subregions = mpu_subregion(base, size, l2size); /* The configure the region */ @@ -442,7 +442,7 @@ static inline void mpu_priv_intsram(uintptr_t base, size_t size) /* Select the region size and the sub-region map */ - l2size = mpu_log2regionceil(base, size); + l2size = mpu_log2regionceil(size); subregions = mpu_subregion(base, size, l2size); /* The configure the region */ @@ -481,7 +481,7 @@ static inline void mpu_user_extsram(uintptr_t base, size_t size) /* Select the region size and the sub-region map */ - l2size = mpu_log2regionceil(base, size); + l2size = mpu_log2regionceil(size); subregions = mpu_subregion(base, size, l2size); /* The configure the region */ @@ -521,7 +521,7 @@ static inline void mpu_priv_extsram(uintptr_t base, size_t size) /* Select the region size and the sub-region map */ - l2size = mpu_log2regionceil(base, size); + l2size = mpu_log2regionceil(size); subregions = mpu_subregion(base, size, l2size); /* The configure the region */ @@ -561,7 +561,7 @@ static inline void mpu_peripheral(uintptr_t base, size_t size) /* Select the region size and the sub-region map */ - l2size = mpu_log2regionceil(base, size); + l2size = mpu_log2regionceil(size); subregions = mpu_subregion(base, size, l2size); /* Then configure the region */ diff --git a/arch/arm/src/armv7-m/up_mpu.c b/arch/arm/src/armv7-m/up_mpu.c index 9370f2108d2..3e802fddfdb 100644 --- a/arch/arm/src/armv7-m/up_mpu.c +++ b/arch/arm/src/armv7-m/up_mpu.c @@ -221,24 +221,17 @@ unsigned int mpu_allocregion(void) * Determine the smallest value of l2size (log base 2 size) such that the * following is true: * - * (base & ((1 << l2size) - 1)) + size <= (1 << l2size) + * size <= (1 << l2size) * ****************************************************************************/ -uint8_t mpu_log2regionceil(uintptr_t base, size_t size) +uint8_t mpu_log2regionceil(size_t size) { uint8_t l2size; /* The minimum permitted region size is 32 bytes (log2(32) = 5. */ - for (l2size = 5; l2size < 32; l2size++) - { - if ((base & ((1 << l2size) - 1)) + size <= (1 << l2size)) - { - break; - } - } - + for (l2size = 5; l2size < 32 && size > (1 << l2size); l2size++); return l2size; } @@ -249,15 +242,15 @@ uint8_t mpu_log2regionceil(uintptr_t base, size_t size) * Determine the largest value of l2size (log base 2 size) such that the * following is true: * - * (base & ((1 << l2size) - 1)) + size >= (1 << l2size) + * size >= (1 << l2size) * ****************************************************************************/ -uint8_t mpu_log2regionfloor(uintptr_t base, size_t size) +uint8_t mpu_log2regionfloor(size_t size) { - uint8_t l2size = mpu_log2regionceil(base, size); + uint8_t l2size = mpu_log2regionceil(size); - if (l2size > 4 && (base & ((1 << l2size) - 1)) + size < (1 << l2size)) + if (l2size > 4 && size < (1 << l2size)) { l2size--; }