mirror of https://github.com/ARMmbed/mbed-os.git
Fix target.mpu-rom-end setting, for ARMv8-M too
targets.json was not specifying the same macro name as the code was checking for, so setting was ineffective. Making this work tripped up not-supported checks in ARMv8-M - rather than deal with making this work, support it instead. Both ARMv7-M and ARMv8-M slightly reduce code size and runtime impact if mpu-rom-end is 0x1fffffff, using one fewer region. This means default setup for ARMv8-M now requires 5 regions, with mpu-rom-end set to default 0x0fffffff, but this can be put back to 4 by changing the setting.pull/9061/head
parent
170b73442b
commit
02330336f2
|
@ -25,7 +25,9 @@
|
|||
#error "Device has v7m MPU but it is not enabled. Add 'MPU' to device_has in targets.json"
|
||||
#endif
|
||||
|
||||
#if !defined(MBED_MPU_ROM_END)
|
||||
#ifdef MBED_CONF_TARGET_MPU_ROM_END
|
||||
#define MBED_MPU_ROM_END MBED_CONF_TARGET_MPU_ROM_END
|
||||
#else
|
||||
#define MBED_MPU_ROM_END (0x10000000 - 1)
|
||||
#endif
|
||||
#define MBED_MPU_RAM_START (MBED_MPU_ROM_END + 1)
|
||||
|
@ -48,9 +50,13 @@ void mbed_mpu_init()
|
|||
|
||||
const uint32_t regions = (MPU->TYPE & MPU_TYPE_DREGION_Msk) >> MPU_TYPE_DREGION_Pos;
|
||||
|
||||
// Our MPU setup requires 4 regions - if this assert is hit, remove
|
||||
// DEVICE_MPU from device_has
|
||||
// Our MPU setup requires 3 or 4 regions - if this assert is hit, remove
|
||||
// a region by setting MPU_ROM_END to 0x1fffffff, or remove MPU from device_has
|
||||
#if MBED_MPU_RAM_START == 0x20000000
|
||||
MBED_ASSERT(regions >= 3);
|
||||
#else
|
||||
MBED_ASSERT(regions >= 4);
|
||||
#endif
|
||||
|
||||
// Disable the MCU
|
||||
MPU->CTRL = 0;
|
||||
|
@ -99,11 +105,12 @@ void mbed_mpu_init()
|
|||
ARM_MPU_REGION_SIZE_512MB) // Size
|
||||
);
|
||||
|
||||
// Select region 1 and use it for a WT ram region in the Code area
|
||||
#if MBED_MPU_RAM_START < 0x20000000
|
||||
// Select region 3 and use it for a WT ram region in the Code area
|
||||
// - Code MBED_MPU_ROM_END + 1 to 0x1FFFFFFF
|
||||
ARM_MPU_SetRegion(
|
||||
ARM_MPU_RBAR(
|
||||
1, // Region
|
||||
3, // Region
|
||||
0x00000000), // Base
|
||||
ARM_MPU_RASR(
|
||||
1, // DisableExec
|
||||
|
@ -123,13 +130,17 @@ void mbed_mpu_init()
|
|||
((MBED_MPU_RAM_START <= 0x20000000) ? 0 : (1 << 7)),
|
||||
ARM_MPU_REGION_SIZE_512MB) // Size
|
||||
);
|
||||
#define LAST_RAM_REGION 3
|
||||
#else
|
||||
#define LAST_RAM_REGION 2
|
||||
#endif
|
||||
|
||||
// Select region 2 and use it for WBWA ram regions
|
||||
// Select region 1 and use it for WBWA ram regions
|
||||
// - SRAM 0x20000000 to 0x3FFFFFFF
|
||||
// - RAM 0x60000000 to 0x7FFFFFFF
|
||||
ARM_MPU_SetRegion(
|
||||
ARM_MPU_RBAR(
|
||||
2, // Region
|
||||
1, // Region
|
||||
0x00000000), // Base
|
||||
ARM_MPU_RASR(
|
||||
1, // DisableExec
|
||||
|
@ -150,11 +161,11 @@ void mbed_mpu_init()
|
|||
ARM_MPU_REGION_SIZE_4GB) // Size
|
||||
);
|
||||
|
||||
// Select region 3 and use it for the WT ram region
|
||||
// Select region 2 and use it for the WT ram region
|
||||
// - RAM 0x80000000 to 0x9FFFFFFF
|
||||
ARM_MPU_SetRegion(
|
||||
ARM_MPU_RBAR(
|
||||
3, // Region
|
||||
2, // Region
|
||||
0x80000000), // Base
|
||||
ARM_MPU_RASR(
|
||||
1, // DisableExec
|
||||
|
@ -214,7 +225,7 @@ void mbed_mpu_enable_ram_xn(bool enable)
|
|||
// Flush memory writes before configuring the MPU.
|
||||
__DMB();
|
||||
|
||||
for (uint32_t region = 1; region <= 3; region++) {
|
||||
for (uint32_t region = 1; region <= LAST_RAM_REGION; region++) {
|
||||
enable_region(enable, region);
|
||||
}
|
||||
|
||||
|
|
|
@ -25,11 +25,15 @@
|
|||
#error "Device has v8m MPU but it is not enabled. Add 'MPU' to device_has in targets.json"
|
||||
#endif
|
||||
|
||||
#if !defined(MBED_MPU_ROM_END)
|
||||
#define MBED_MPU_ROM_END (0x20000000 - 1)
|
||||
#ifdef MBED_CONF_TARGET_MPU_ROM_END
|
||||
#define MBED_MPU_ROM_END MBED_CONF_TARGET_MPU_ROM_END
|
||||
#else
|
||||
#define MBED_MPU_ROM_END (0x10000000 - 1)
|
||||
#endif
|
||||
#define MBED_MPU_RAM_START (MBED_MPU_ROM_END + 1)
|
||||
|
||||
MBED_STATIC_ASSERT(MBED_MPU_ROM_END == 0x1fffffff, "Changing MBED_MPU_ROM_END for ARMv8-M is not supported.");
|
||||
MBED_STATIC_ASSERT(MBED_MPU_ROM_END <= 0x20000000 - 1,
|
||||
"Unsupported value for MBED_MPU_ROM_END");
|
||||
|
||||
void mbed_mpu_init()
|
||||
{
|
||||
|
@ -38,9 +42,13 @@ void mbed_mpu_init()
|
|||
|
||||
const uint32_t regions = (MPU->TYPE & MPU_TYPE_DREGION_Msk) >> MPU_TYPE_DREGION_Pos;
|
||||
|
||||
// Our MPU setup requires 4 regions - if this assert is hit, remove
|
||||
// DEVICE_MPU from device_has
|
||||
// Our MPU setup requires 4 or 5 regions - if this assert is hit, remove
|
||||
// a region by setting MPU_ROM_END to 0x1fffffff, or remove MPU from device_has
|
||||
#if MBED_MPU_RAM_START == 0x20000000
|
||||
MBED_ASSERT(regions >= 4);
|
||||
#else
|
||||
MBED_ASSERT(regions >= 5);
|
||||
#endif
|
||||
|
||||
// Disable the MCU
|
||||
MPU->CTRL = 0;
|
||||
|
@ -54,7 +62,7 @@ void mbed_mpu_init()
|
|||
* ARMv8-M memory map:
|
||||
*
|
||||
* Start End Name Executable by default Default cache Mbed MPU protection
|
||||
* 0x00000000 - 0x1FFFFFFF Code Yes WT, WA Write disabled
|
||||
* 0x00000000 - 0x1FFFFFFF Code Yes WT, WA Write disabled for first portion and execute disabled for the rest
|
||||
* 0x20000000 - 0x3FFFFFFF SRAM Yes WB, WA, RA Execute disabled
|
||||
* 0x40000000 - 0x5FFFFFFF Peripheral No
|
||||
* 0x60000000 - 0x7FFFFFFF RAM Yes WB, WA, RA Execute disabled
|
||||
|
@ -82,10 +90,28 @@ void mbed_mpu_init()
|
|||
1, // Read-Only
|
||||
1, // Non-Privileged
|
||||
0), // Execute Never disabled
|
||||
ARM_MPU_RLAR(
|
||||
MBED_MPU_ROM_END, // Limit
|
||||
AttrIndex_WTRA) // Attribute index - Write-Through, Read-allocate
|
||||
);
|
||||
|
||||
#if MBED_MPU_RAM_START != 0x20000000
|
||||
ARM_MPU_SetRegion(
|
||||
4, // Region
|
||||
ARM_MPU_RBAR(
|
||||
MBED_MPU_RAM_START, // Base
|
||||
ARM_MPU_SH_NON, // Non-shareable
|
||||
0, // Read-Write
|
||||
1, // Non-Privileged
|
||||
1), // Execute Never enabled
|
||||
ARM_MPU_RLAR(
|
||||
0x1FFFFFFF, // Limit
|
||||
AttrIndex_WTRA) // Attribute index - Write-Through, Read-allocate
|
||||
);
|
||||
#define LAST_RAM_REGION 4
|
||||
#else
|
||||
#define LAST_RAM_REGION 3
|
||||
#endif
|
||||
|
||||
ARM_MPU_SetRegion(
|
||||
1, // Region
|
||||
|
@ -173,7 +199,7 @@ void mbed_mpu_enable_ram_xn(bool enable)
|
|||
// Flush memory writes before configuring the MPU.
|
||||
__DMB();
|
||||
|
||||
for (uint32_t region = 1; region <= 3; region++) {
|
||||
for (uint32_t region = 1; region <= LAST_RAM_REGION; region++) {
|
||||
enable_region(enable, region);
|
||||
}
|
||||
|
||||
|
|
|
@ -32,8 +32,7 @@
|
|||
},
|
||||
"mpu-rom-end": {
|
||||
"help": "Last address of ROM protected by the MPU",
|
||||
"value": "0x0fffffff",
|
||||
"macro_name": "MPU_ROM_END"
|
||||
"value": "0x0fffffff"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
Loading…
Reference in New Issue