mirror of
https://github.com/apache/nuttx.git
synced 2026-08-20 21:18:23 +00:00
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 8b63d02309.
This commit is contained in:
parent
70efabd0ad
commit
b4f488e8bf
2 changed files with 19 additions and 26 deletions
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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--;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue