PebbleOS
Loading...
Searching...
No Matches
Data Structures | Enumerations | Functions
MPU

Memory Protection Unit regions. More...

Data Structures

struct  MpuRegion
 MPU region, described by its real base and size. More...
 

Enumerations

enum  MpuCachePolicy { MpuCachePolicy_NotCacheable , MpuCachePolicy_WriteThrough , MpuCachePolicy_WriteBackWriteAllocate , MpuCachePolicy_WriteBackNoWriteAllocate }
 Cache policy of a region. More...
 
enum  MpuPermissions {
  MpuPermissions_NoAccess , MpuPermissions_PrivRW , MpuPermissions_PrivRW_UserRO , MpuPermissions_PrivRW_UserRW ,
  MpuPermissions_PrivRO , MpuPermissions_PrivRO_UserRO , MpuPermissionsCount
}
 Access permissions of a region. More...
 

Functions

void mpu_enable (void)
 Enable the MPU.
 
void mpu_disable (void)
 Disable the MPU.
 
void mpu_set_region (const MpuRegion *region)
 Program a region.
 
MpuRegion mpu_get_region (int region_num)
 Read back a programmed region.
 
void mpu_get_register_settings (const MpuRegion *region, uint32_t *base_address_reg, uint32_t *attributes_reg)
 Compute the register values for a region without programming it.
 
bool mpu_memory_is_cachable (const void *addr)
 Check whether an address may be cached.
 
void mpu_init_region_from_region (MpuRegion *copy, const MpuRegion *from, bool allow_user_access)
 Copy a privileged read/write region, optionally granting unprivileged access.
 

Detailed Description

Memory Protection Unit regions.

Backends exist for ARMv7-M and ARMv8-M. Regions are described by their real base and size; the backend derives the hardware encoding.

const MpuRegion region = {
.region_num = 3,
.enabled = true,
.base_address = (uintptr_t)buf,
.size = sizeof(buf),
.permissions = MpuPermissions_PrivRW,
};
mpu_set_region(&region);
uint8_t region_num
Region number, 0 to 15.
Definition mpu.h:79
MPU region, described by its real base and size.
Definition mpu.h:77
void mpu_set_region(const MpuRegion *region)
Program a region.
@ MpuCachePolicy_WriteBackWriteAllocate
Write-back, write-allocate.
Definition mpu.h:39
@ MpuPermissions_PrivRW
Privileged read/write, no unprivileged access.
Definition mpu.h:58

Data Structure Documentation

◆ MpuRegion

struct MpuRegion

MPU region, described by its real base and size.

The ARMv7-M backend rounds the region up to a power-of-two block and computes the subregion mask; the ARMv8-M backend programs the limit register directly.

Data Fields
uintptr_t base_address Base address, 32-byte aligned.
MpuCachePolicy cache_policy Cache policy.
bool enabled: 1 Region is enabled.
bool executable: 1 Allow instruction fetch (XN=0).

Defaults to non-executable. Flash, app RAM, worker RAM and any code relocated to RAM must opt in.

MpuPermissions permissions Access permissions.
uint8_t region_num: 4 Region number, 0 to 15.
uint32_t size Size in bytes.

Enumeration Type Documentation

◆ MpuCachePolicy

Cache policy of a region.

Enumerator
MpuCachePolicy_NotCacheable 

Not cacheable.

MpuCachePolicy_WriteThrough 

Write-through.

MpuCachePolicy_WriteBackWriteAllocate 

Write-back, write-allocate.

MpuCachePolicy_WriteBackNoWriteAllocate 

Write-back, no write-allocate.

◆ MpuPermissions

Access permissions of a region.

The backends map these to the hardware AP encoding (3 bits on ARMv7-M, 2 bits on ARMv8-M). The two-bit ARMv8-M field cannot express two of them precisely:

Enumerator
MpuPermissions_NoAccess 

No access.

MpuPermissions_PrivRW 

Privileged read/write, no unprivileged access.

MpuPermissions_PrivRW_UserRO 

Privileged read/write, unprivileged read-only.

MpuPermissions_PrivRW_UserRW 

Privileged and unprivileged read/write.

MpuPermissions_PrivRO 

Privileged read-only, no unprivileged access.

MpuPermissions_PrivRO_UserRO 

Privileged and unprivileged read-only.

MpuPermissionsCount 

Number of permission sets.

Function Documentation

◆ mpu_disable()

void mpu_disable ( void  )

Disable the MPU.

◆ mpu_enable()

void mpu_enable ( void  )

Enable the MPU.

The default memory map stays enabled as a background region for privileged code.

◆ mpu_get_region()

MpuRegion mpu_get_region ( int  region_num)

Read back a programmed region.

Parameters
region_numRegion number.
Returns
Region as decoded from the hardware registers.

◆ mpu_get_register_settings()

void mpu_get_register_settings ( const MpuRegion *  region,
uint32_t *  base_address_reg,
uint32_t *  attributes_reg 
)

Compute the register values for a region without programming it.

Parameters
regionRegion to encode.
[out]base_address_regValue for the RBAR register.
[out]attributes_regValue for the RASR (ARMv7-M) or RLAR (ARMv8-M) register.

◆ mpu_init_region_from_region()

void mpu_init_region_from_region ( MpuRegion *  copy,
const MpuRegion *  from,
bool  allow_user_access 
)

Copy a privileged read/write region, optionally granting unprivileged access.

Used to switch app and worker RAM regions on task switches.

Parameters
[out]copyDestination region.
fromSource region; must be MpuPermissions_PrivRW.
allow_user_accessGrant unprivileged read/write access in copy.

◆ mpu_memory_is_cachable()

bool mpu_memory_is_cachable ( const void *  addr)

Check whether an address may be cached.

Only SRAM is considered cacheable, and only while the data cache is enabled.

Parameters
addrAddress to check.
Returns
true if addr is cacheable.

◆ mpu_set_region()

void mpu_set_region ( const MpuRegion *  region)

Program a region.

Parameters
regionRegion to program, in slot MpuRegion::region_num.