Skip to content

Conversation

@AhmedIsmail02
Copy link
Member

@AhmedIsmail02 AhmedIsmail02 commented Dec 22, 2025

Description

This PR introduces the following:

  • Support for the Memory Protection Unit (MPU) to the ARM Cortex-R82 port. The MPU enhances system security by allowing the definition of memory regions with specific access permissions. The following changes have been made:

    • Added MPU configuration functions in port.c to set up memory regions and their attributes.
    • Updated portASM.S to include assembly routines for MPU and context switching with MPU support.
    • Created mpu_wrappers_v2_asm.c to provide assembly wrappers for MPU operations.
    • Updated portmacro.h to include MPU-related macros and definitions.
    • Modified task.h to include MPU-related task attributes.
    • Updated CMakeLists.txt to include the new MPU source file.
    • Enhanced the README.md with instructions on MPU configuration.
  • Minor code improvements to enhance readability and maintainability of the Cortex-R82 port files. Changes include refactoring variable names and optimising comments without altering functionality.

This PR blocks Arm-Cortex-R82: Add SMP MPU examples PR.

Test Steps

Checklist:

  • I have tested my changes. No regression in existing tests.
  • I have modified and/or added unit-tests to cover the code changes in this Pull Request.

Related Issue

By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.

* regions are invalidated.
* The minimum region size is 64 Bytes.
*/
if( ( xRegions != NULL ) && ( xRegions[ ucIndex ].ulLengthInBytes > 64UL ) )
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should the check be >= 64. Also, should we add an assert to help application writers to catch invalid length instead of silently ignoring them.

Copy link
Member Author

@AhmedIsmail02 AhmedIsmail02 Jan 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, that's correct. A new check has been added to help application writers catch invalid MPU region sizes.

#define portUNPRIVILEGED_FLASH_REGION ( 1ULL )
#define portUNPRIVILEGED_SYSCALLS_REGION ( 2ULL )
#define portPRIVILEGED_RAM_REGION ( 3ULL )
#define portSTACK_REGION ( 0ULL )
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

portSTACK_REGION is used to index the region in xRegionsSettings array but portSTACK_REGION and portPRIVILEGED_FLASH_REGION both being 0 makes it feel like we are using same MPU region for unprivileged flash and stack.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch, a new macro portSTACK_REGION_INDEX along with some comments have been introduced to make it clearer.

.macro saveallgpregisters
/* Save all general-purpose registers on stack. */
.macro portLOAD_MPU_REGIONS_ADDRESSES
MOV X3, #4 /* i = 4 First four MPU regions are already programmed.*/
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Possible to use some macro for this 4?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Certainly, the portSTACK_REGION macro which is now defined with a value of 4 is used instead, also a comment has been added for better readability.

@AhmedIsmail02 AhmedIsmail02 force-pushed the add-cortex-r82-mpu-support branch 2 times, most recently from 4ccbfac to 91c7ebb Compare January 23, 2026 16:09
@sonarqubecloud
Copy link

This commit introduces support for the Memory Protection Unit (MPU)
to the ARM Cortex-R82 port. The MPU enhances system security
by allowing the definition of memory regions with specific access
permissions. The following changes have been made:
- Added MPU configuration functions in `port.c` to set up memory
  regions and their attributes.
- Updated `portASM.S` to include assembly routines for MPU
  and context switching with MPU support.
- Created `mpu_wrappers_v2_asm.c` to provide assembly wrappers for
  MPU operations.
- Updated `portmacro.h` to include MPU-related macros and definitions.
- Modified `task.h` to include MPU-related task attributes.
- Updated `CMakeLists.txt` to include the new MPU source file.
- Enhanced the `README.md` with instructions on MPU configuration.

Signed-off-by: Ahmed Ismail <Ahmed.Ismail@arm.com>
This commit includes minor code improvements to enhance readability
and maintainability of the Cortex-R82 port files. Changes include
refactoring variable names, optimizing comments, and improving code
structure without altering functionality.

Signed-off-by: Ahmed Ismail <Ahmed.Ismail@arm.com>
This stack-depth check should not be performed for ports
where portUSING_MPU_WRAPPERS is set to 1.
In this case, pxTopOfStack and pxNewTCB->pxTopOfStack reside
in different memory regions: pxTopOfStack is in unprivileged SRAM,
while pxNewTCB->pxTopOfStack is in privileged SRAM.
This is because pxPortInitialiseStack() returns the address of
`ullContext` array rather than the decremented pxTopOfStack,
as is done in the non-MPU case.
Consequently, this check is not valid in this scenario.

Signed-off-by: Ahmed Ismail <Ahmed.Ismail@arm.com>
@AhmedIsmail02 AhmedIsmail02 force-pushed the add-cortex-r82-mpu-support branch from 91c7ebb to 6c6df4f Compare January 26, 2026 10:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants