mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-04-19 21:11:57 -04:00
formatting: Fix uncrustify findings
Signed-off-by: Ahmed Ismail <Ahmed.Ismail@arm.com> Signed-off-by: Gaurav Aggarwal <aggarg@amazon.com>
This commit is contained in:
parent
3f23eab8c7
commit
326cbe1394
|
@ -169,79 +169,80 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to manipulate the MPU.
|
* @brief Constants required to manipulate the MPU.
|
||||||
*/
|
*/
|
||||||
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
||||||
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
||||||
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
||||||
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
||||||
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
||||||
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
||||||
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
||||||
|
|
||||||
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
||||||
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
|
|
||||||
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
||||||
|
|
||||||
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
||||||
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
|
||||||
* region. */
|
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
||||||
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
* region. */
|
||||||
|
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
||||||
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
||||||
|
|
||||||
/* Enable privileged access to unmapped region. */
|
/* Enable privileged access to unmapped region. */
|
||||||
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
||||||
|
|
||||||
/* Enable MPU. */
|
/* Enable MPU. */
|
||||||
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
||||||
|
|
||||||
/* Expected value of the portMPU_TYPE register. */
|
/* Expected value of the portMPU_TYPE register. */
|
||||||
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
||||||
|
|
||||||
/* Extract first address of the MPU region as encoded in the
|
/* Extract first address of the MPU region as encoded in the
|
||||||
* RBAR (Region Base Address Register) value. */
|
* RBAR (Region Base Address Register) value. */
|
||||||
|
@ -380,14 +381,14 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to check and configure PACBTI security feature implementation.
|
* @brief Constants required to check and configure PACBTI security feature implementation.
|
||||||
*/
|
*/
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
||||||
|
|
||||||
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
||||||
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
||||||
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
||||||
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
||||||
|
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -427,7 +428,7 @@ static void prvTaskExitError( void );
|
||||||
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_FPU */
|
#endif /* configENABLE_FPU */
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Configures PACBTI features.
|
* @brief Configures PACBTI features.
|
||||||
|
@ -1212,6 +1213,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __syscalls_flash_start__;
|
extern uint32_t * __syscalls_flash_start__;
|
||||||
|
@ -1282,6 +1284,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
||||||
* when we exit from the system call. */
|
* when we exit from the system call. */
|
||||||
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
||||||
|
|
||||||
/* Store the value of the PSPLIM register before the SVC was raised.
|
/* Store the value of the PSPLIM register before the SVC was raised.
|
||||||
* We need to restore it when we exit from the system call. */
|
* We need to restore it when we exit from the system call. */
|
||||||
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
||||||
|
@ -1300,6 +1303,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
|
|
||||||
/* Start executing the system call upon returning from this handler. */
|
/* Start executing the system call upon returning from this handler. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
||||||
|
|
||||||
/* Raise a request to exit from the system call upon finishing the
|
/* Raise a request to exit from the system call upon finishing the
|
||||||
* system call. */
|
* system call. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
||||||
|
@ -1359,6 +1363,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __privileged_functions_start__;
|
extern uint32_t * __privileged_functions_start__;
|
||||||
|
@ -1541,7 +1546,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
||||||
ulIndex++;
|
ulIndex++;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Check PACBTI security feature configuration before pushing the
|
/* Check PACBTI security feature configuration before pushing the
|
||||||
* CONTROL register's value on task's TCB. */
|
* CONTROL register's value on task's TCB. */
|
||||||
|
@ -1814,11 +1819,11 @@ BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
||||||
portNVIC_SHPR2_REG = 0;
|
portNVIC_SHPR2_REG = 0;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Set the CONTROL register value based on PACBTI security feature
|
/* Set the CONTROL register value based on PACBTI security feature
|
||||||
* configuration before starting the first task. */
|
* configuration before starting the first task. */
|
||||||
( void) prvConfigurePACBTI( pdTRUE );
|
( void ) prvConfigurePACBTI( pdTRUE );
|
||||||
}
|
}
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
|
|
||||||
|
@ -2018,9 +2023,9 @@ void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
if( xSchedulerRunning == pdFALSE )
|
if( xSchedulerRunning == pdFALSE )
|
||||||
{
|
{
|
||||||
/* Grant access to all the kernel objects before the scheduler
|
/* Grant access to all the kernel objects before the scheduler
|
||||||
* is started. It is necessary because there is no task running
|
* is started. It is necessary because there is no task running
|
||||||
* yet and therefore, we cannot use the permissions of any
|
* yet and therefore, we cannot use the permissions of any
|
||||||
* task. */
|
* task. */
|
||||||
xAccessGranted = pdTRUE;
|
xAccessGranted = pdTRUE;
|
||||||
}
|
}
|
||||||
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
||||||
|
@ -2241,7 +2246,7 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
||||||
{
|
{
|
||||||
|
@ -2253,13 +2258,13 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
/* Enable UsageFault exception. */
|
/* Enable UsageFault exception. */
|
||||||
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
||||||
|
|
||||||
#if( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if( configENABLE_BTI == 1 )
|
#if ( configENABLE_BTI == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,7 +64,7 @@
|
||||||
|
|
||||||
#ifndef configENABLE_MVE
|
#ifndef configENABLE_MVE
|
||||||
#define configENABLE_MVE 0
|
#define configENABLE_MVE 0
|
||||||
#elif( configENABLE_MVE != 0 )
|
#elif ( configENABLE_MVE != 0 )
|
||||||
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M23.
|
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M23.
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
|
@ -64,7 +64,7 @@
|
||||||
|
|
||||||
#ifndef configENABLE_MVE
|
#ifndef configENABLE_MVE
|
||||||
#define configENABLE_MVE 0
|
#define configENABLE_MVE 0
|
||||||
#elif( configENABLE_MVE != 0 )
|
#elif ( configENABLE_MVE != 0 )
|
||||||
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M23.
|
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M23.
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
|
@ -77,16 +77,16 @@
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configTOTAL_MPU_REGIONS == 16 )
|
#if ( configTOTAL_MPU_REGIONS == 16 )
|
||||||
" movs r3, #8 \n" /* r3 = 8. */
|
" movs r3, #8 \n" /* r3 = 8. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 8. */
|
" str r3, [r1] \n" /* Program RNR = 8. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" movs r3, #12 \n" /* r3 = 12. */
|
" movs r3, #12 \n" /* r3 = 12. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 12. */
|
" str r3, [r1] \n" /* Program RNR = 12. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
||||||
" \n"
|
" \n"
|
||||||
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
@ -100,14 +100,14 @@
|
||||||
" ldr r2, [r1] \n" /* r2 = Location of saved context in TCB. */
|
" ldr r2, [r1] \n" /* r2 = Location of saved context in TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_special_regs_first_task: \n"
|
" restore_special_regs_first_task: \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmdb r2!, {r3-r6} \n" /* Read task's dedicated PAC key from the task's context. */
|
" ldmdb r2!, {r3-r6} \n" /* Read task's dedicated PAC key from the task's context. */
|
||||||
" msr PAC_KEY_P_0, r3 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_0, r3 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_1, r4 \n"
|
" msr PAC_KEY_P_1, r4 \n"
|
||||||
" msr PAC_KEY_P_2, r5 \n"
|
" msr PAC_KEY_P_2, r5 \n"
|
||||||
" msr PAC_KEY_P_3, r6 \n"
|
" msr PAC_KEY_P_3, r6 \n"
|
||||||
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" ldmdb r2!, {r0, r3-r5, lr} \n" /* r0 = xSecureContext, r3 = original PSP, r4 = PSPLIM, r5 = CONTROL, LR restored. */
|
" ldmdb r2!, {r0, r3-r5, lr} \n" /* r0 = xSecureContext, r3 = original PSP, r4 = PSPLIM, r5 = CONTROL, LR restored. */
|
||||||
" msr psp, r3 \n"
|
" msr psp, r3 \n"
|
||||||
" msr psplim, r4 \n"
|
" msr psplim, r4 \n"
|
||||||
|
@ -140,14 +140,14 @@
|
||||||
" ldr r3, [r2] \n" /* Read pxCurrentTCB. */
|
" ldr r3, [r2] \n" /* Read pxCurrentTCB. */
|
||||||
" ldr r0, [r3] \n" /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
|
" ldr r0, [r3] \n" /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmia r0!, {r1-r4} \n" /* Read task's dedicated PAC key from stack. */
|
" ldmia r0!, {r1-r4} \n" /* Read task's dedicated PAC key from stack. */
|
||||||
" msr PAC_KEY_P_3, r1 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_3, r1 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_2, r2 \n"
|
" msr PAC_KEY_P_2, r2 \n"
|
||||||
" msr PAC_KEY_P_1, r3 \n"
|
" msr PAC_KEY_P_1, r3 \n"
|
||||||
" msr PAC_KEY_P_0, r4 \n"
|
" msr PAC_KEY_P_0, r4 \n"
|
||||||
" clrm {r1-r4} \n" /* Clear r1-r4. */
|
" clrm {r1-r4} \n" /* Clear r1-r4. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" \n"
|
" \n"
|
||||||
" ldm r0!, {r1-r3} \n" /* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */
|
" ldm r0!, {r1-r3} \n" /* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */
|
||||||
" ldr r4, =xSecureContext \n"
|
" ldr r4, =xSecureContext \n"
|
||||||
|
@ -297,15 +297,15 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" \n"
|
" \n"
|
||||||
" save_general_regs: \n"
|
" save_general_regs: \n"
|
||||||
" mrs r3, psp \n"
|
" mrs r3, psp \n"
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" add r3, r3, #0x20 \n" /* Move r3 to location where s0 is saved. */
|
" add r3, r3, #0x20 \n" /* Move r3 to location where s0 is saved. */
|
||||||
" tst lr, #0x10 \n"
|
" tst lr, #0x10 \n"
|
||||||
" ittt eq \n"
|
" ittt eq \n"
|
||||||
" vstmiaeq r2!, {s16-s31} \n" /* Store s16-s31. */
|
" vstmiaeq r2!, {s16-s31} \n" /* Store s16-s31. */
|
||||||
" vldmiaeq r3, {s0-s16} \n" /* Copy hardware saved FP context into s0-s16. */
|
" vldmiaeq r3, {s0-s16} \n" /* Copy hardware saved FP context into s0-s16. */
|
||||||
" vstmiaeq r2!, {s0-s16} \n" /* Store hardware saved FP context. */
|
" vstmiaeq r2!, {s0-s16} \n" /* Store hardware saved FP context. */
|
||||||
" sub r3, r3, #0x20 \n" /* Set r3 back to the location of hardware saved context. */
|
" sub r3, r3, #0x20 \n" /* Set r3 back to the location of hardware saved context. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" stmia r2!, {r4-r11} \n" /* Store r4-r11. */
|
" stmia r2!, {r4-r11} \n" /* Store r4-r11. */
|
||||||
" ldmia r3, {r4-r11} \n" /* Copy the hardware saved context into r4-r11. */
|
" ldmia r3, {r4-r11} \n" /* Copy the hardware saved context into r4-r11. */
|
||||||
" stmia r2!, {r4-r11} \n" /* Store the hardware saved context. */
|
" stmia r2!, {r4-r11} \n" /* Store the hardware saved context. */
|
||||||
|
@ -315,15 +315,15 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" mrs r4, psplim \n" /* r4 = PSPLIM. */
|
" mrs r4, psplim \n" /* r4 = PSPLIM. */
|
||||||
" mrs r5, control \n" /* r5 = CONTROL. */
|
" mrs r5, control \n" /* r5 = CONTROL. */
|
||||||
" stmia r2!, {r0, r3-r5, lr} \n" /* Store xSecureContext, original PSP (after hardware has saved context), PSPLIM, CONTROL and LR. */
|
" stmia r2!, {r0, r3-r5, lr} \n" /* Store xSecureContext, original PSP (after hardware has saved context), PSPLIM, CONTROL and LR. */
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" mrs r3, PAC_KEY_P_0 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
" mrs r3, PAC_KEY_P_0 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
||||||
" mrs r4, PAC_KEY_P_1 \n"
|
" mrs r4, PAC_KEY_P_1 \n"
|
||||||
" mrs r5, PAC_KEY_P_2 \n"
|
" mrs r5, PAC_KEY_P_2 \n"
|
||||||
" mrs r6, PAC_KEY_P_3 \n"
|
" mrs r6, PAC_KEY_P_3 \n"
|
||||||
" stmia r2!, {r3-r6} \n" /* Store the task's dedicated PAC key on the task's context. */
|
" stmia r2!, {r3-r6} \n" /* Store the task's dedicated PAC key on the task's context. */
|
||||||
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" str r2, [r1] \n" /* Save the location from where the context should be restored as the first member of TCB. */
|
" str r2, [r1] \n" /* Save the location from where the context should be restored as the first member of TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" select_next_task: \n"
|
" select_next_task: \n"
|
||||||
" mov r0, %0 \n" /* r0 = configMAX_SYSCALL_INTERRUPT_PRIORITY */
|
" mov r0, %0 \n" /* r0 = configMAX_SYSCALL_INTERRUPT_PRIORITY */
|
||||||
|
@ -358,16 +358,16 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configTOTAL_MPU_REGIONS == 16 )
|
#if ( configTOTAL_MPU_REGIONS == 16 )
|
||||||
" movs r3, #8 \n" /* r3 = 8. */
|
" movs r3, #8 \n" /* r3 = 8. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 8. */
|
" str r3, [r1] \n" /* Program RNR = 8. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" movs r3, #12 \n" /* r3 = 12. */
|
" movs r3, #12 \n" /* r3 = 12. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 12. */
|
" str r3, [r1] \n" /* Program RNR = 12. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
||||||
" \n"
|
" \n"
|
||||||
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
@ -381,14 +381,14 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldr r2, [r1] \n" /* r2 = Location of saved context in TCB. */
|
" ldr r2, [r1] \n" /* r2 = Location of saved context in TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_special_regs: \n"
|
" restore_special_regs: \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmdb r2!, {r3-r6} \n" /* Read task's dedicated PAC key from the task's context. */
|
" ldmdb r2!, {r3-r6} \n" /* Read task's dedicated PAC key from the task's context. */
|
||||||
" msr PAC_KEY_P_0, r3 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_0, r3 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_1, r4 \n"
|
" msr PAC_KEY_P_1, r4 \n"
|
||||||
" msr PAC_KEY_P_2, r5 \n"
|
" msr PAC_KEY_P_2, r5 \n"
|
||||||
" msr PAC_KEY_P_3, r6 \n"
|
" msr PAC_KEY_P_3, r6 \n"
|
||||||
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" ldmdb r2!, {r0, r3-r5, lr} \n" /* r0 = xSecureContext, r3 = original PSP, r4 = PSPLIM, r5 = CONTROL, LR restored. */
|
" ldmdb r2!, {r0, r3-r5, lr} \n" /* r0 = xSecureContext, r3 = original PSP, r4 = PSPLIM, r5 = CONTROL, LR restored. */
|
||||||
" msr psp, r3 \n"
|
" msr psp, r3 \n"
|
||||||
" msr psplim, r4 \n"
|
" msr psplim, r4 \n"
|
||||||
|
@ -411,13 +411,13 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldmdb r2!, {r4-r11} \n" /* r4-r11 contain hardware saved context. */
|
" ldmdb r2!, {r4-r11} \n" /* r4-r11 contain hardware saved context. */
|
||||||
" stmia r3!, {r4-r11} \n" /* Copy the hardware saved context on the task stack. */
|
" stmia r3!, {r4-r11} \n" /* Copy the hardware saved context on the task stack. */
|
||||||
" ldmdb r2!, {r4-r11} \n" /* r4-r11 restored. */
|
" ldmdb r2!, {r4-r11} \n" /* r4-r11 restored. */
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" tst lr, #0x10 \n"
|
" tst lr, #0x10 \n"
|
||||||
" ittt eq \n"
|
" ittt eq \n"
|
||||||
" vldmdbeq r2!, {s0-s16} \n" /* s0-s16 contain hardware saved FP context. */
|
" vldmdbeq r2!, {s0-s16} \n" /* s0-s16 contain hardware saved FP context. */
|
||||||
" vstmiaeq r3!, {s0-s16} \n" /* Copy hardware saved FP context on the task stack. */
|
" vstmiaeq r3!, {s0-s16} \n" /* Copy hardware saved FP context on the task stack. */
|
||||||
" vldmdbeq r2!, {s16-s31} \n" /* Restore s16-s31. */
|
" vldmdbeq r2!, {s16-s31} \n" /* Restore s16-s31. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_context_done: \n"
|
" restore_context_done: \n"
|
||||||
" str r2, [r1] \n" /* Save the location where the context should be saved next as the first member of TCB. */
|
" str r2, [r1] \n" /* Save the location where the context should be saved next as the first member of TCB. */
|
||||||
|
@ -454,24 +454,24 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" bmi save_special_regs \n" /* If r3 < 0 ==> Bit[6] in EXC_RETURN is 1 ==> secure stack was used. */
|
" bmi save_special_regs \n" /* If r3 < 0 ==> Bit[6] in EXC_RETURN is 1 ==> secure stack was used. */
|
||||||
" \n"
|
" \n"
|
||||||
" save_general_regs: \n"
|
" save_general_regs: \n"
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
||||||
" it eq \n"
|
" it eq \n"
|
||||||
" vstmdbeq r2!, {s16-s31} \n" /* Store the additional FP context registers which are not saved automatically. */
|
" vstmdbeq r2!, {s16-s31} \n" /* Store the additional FP context registers which are not saved automatically. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" stmdb r2!, {r4-r11} \n" /* Store the registers that are not saved automatically. */
|
" stmdb r2!, {r4-r11} \n" /* Store the registers that are not saved automatically. */
|
||||||
" \n"
|
" \n"
|
||||||
" save_special_regs: \n"
|
" save_special_regs: \n"
|
||||||
" mrs r3, psplim \n" /* r3 = PSPLIM. */
|
" mrs r3, psplim \n" /* r3 = PSPLIM. */
|
||||||
" stmdb r2!, {r0, r3, lr} \n" /* Store xSecureContext, PSPLIM and LR on the stack. */
|
" stmdb r2!, {r0, r3, lr} \n" /* Store xSecureContext, PSPLIM and LR on the stack. */
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" mrs r3, PAC_KEY_P_3 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
" mrs r3, PAC_KEY_P_3 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
||||||
" mrs r4, PAC_KEY_P_2 \n"
|
" mrs r4, PAC_KEY_P_2 \n"
|
||||||
" mrs r5, PAC_KEY_P_1 \n"
|
" mrs r5, PAC_KEY_P_1 \n"
|
||||||
" mrs r6, PAC_KEY_P_0 \n"
|
" mrs r6, PAC_KEY_P_0 \n"
|
||||||
" stmdb r2!, {r3-r6} \n" /* Store the task's dedicated PAC key on the stack. */
|
" stmdb r2!, {r3-r6} \n" /* Store the task's dedicated PAC key on the stack. */
|
||||||
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" \n"
|
" \n"
|
||||||
" str r2, [r1] \n" /* Save the new top of stack in TCB. */
|
" str r2, [r1] \n" /* Save the new top of stack in TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
|
@ -490,14 +490,14 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldr r2, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. r2 now points to the top of stack. */
|
" ldr r2, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. r2 now points to the top of stack. */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_special_regs: \n"
|
" restore_special_regs: \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmia r2!, {r3-r6} \n" /* Read task's dedicated PAC key from stack. */
|
" ldmia r2!, {r3-r6} \n" /* Read task's dedicated PAC key from stack. */
|
||||||
" msr PAC_KEY_P_3, r3 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_3, r3 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_2, r4 \n"
|
" msr PAC_KEY_P_2, r4 \n"
|
||||||
" msr PAC_KEY_P_1, r5 \n"
|
" msr PAC_KEY_P_1, r5 \n"
|
||||||
" msr PAC_KEY_P_0, r6 \n"
|
" msr PAC_KEY_P_0, r6 \n"
|
||||||
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" ldmia r2!, {r0, r3, lr} \n" /* Read from stack - r0 = xSecureContext, r3 = PSPLIM and LR restored. */
|
" ldmia r2!, {r0, r3, lr} \n" /* Read from stack - r0 = xSecureContext, r3 = PSPLIM and LR restored. */
|
||||||
" msr psplim, r3 \n" /* Restore the PSPLIM register value for the task. */
|
" msr psplim, r3 \n" /* Restore the PSPLIM register value for the task. */
|
||||||
" ldr r3, =xSecureContext \n" /* Read the location of xSecureContext i.e. &( xSecureContext ). */
|
" ldr r3, =xSecureContext \n" /* Read the location of xSecureContext i.e. &( xSecureContext ). */
|
||||||
|
@ -516,11 +516,11 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" \n"
|
" \n"
|
||||||
" restore_general_regs: \n"
|
" restore_general_regs: \n"
|
||||||
" ldmia r2!, {r4-r11} \n" /* Restore the registers that are not automatically restored. */
|
" ldmia r2!, {r4-r11} \n" /* Restore the registers that are not automatically restored. */
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
||||||
" it eq \n"
|
" it eq \n"
|
||||||
" vldmiaeq r2!, {s16-s31} \n" /* Restore the additional FP context registers which are not restored automatically. */
|
" vldmiaeq r2!, {s16-s31} \n" /* Restore the additional FP context registers which are not restored automatically. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_context_done: \n"
|
" restore_context_done: \n"
|
||||||
" msr psp, r2 \n" /* Remember the new top of stack for the task. */
|
" msr psp, r2 \n" /* Remember the new top of stack for the task. */
|
||||||
|
|
|
@ -60,7 +60,7 @@
|
||||||
|
|
||||||
#ifndef configENABLE_MVE
|
#ifndef configENABLE_MVE
|
||||||
#define configENABLE_MVE 0
|
#define configENABLE_MVE 0
|
||||||
#elif( configENABLE_MVE != 0 )
|
#elif ( configENABLE_MVE != 0 )
|
||||||
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M33.
|
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M33.
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
|
@ -77,16 +77,16 @@
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configTOTAL_MPU_REGIONS == 16 )
|
#if ( configTOTAL_MPU_REGIONS == 16 )
|
||||||
" movs r3, #8 \n" /* r3 = 8. */
|
" movs r3, #8 \n" /* r3 = 8. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 8. */
|
" str r3, [r1] \n" /* Program RNR = 8. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" movs r3, #12 \n" /* r3 = 12. */
|
" movs r3, #12 \n" /* r3 = 12. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 12. */
|
" str r3, [r1] \n" /* Program RNR = 12. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
||||||
" \n"
|
" \n"
|
||||||
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
@ -100,14 +100,14 @@
|
||||||
" ldr r1, [r0] \n" /* r1 = Location of saved context in TCB. */
|
" ldr r1, [r0] \n" /* r1 = Location of saved context in TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_special_regs_first_task: \n"
|
" restore_special_regs_first_task: \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmdb r1!, {r2-r5} \n" /* Read task's dedicated PAC key from the task's context. */
|
" ldmdb r1!, {r2-r5} \n" /* Read task's dedicated PAC key from the task's context. */
|
||||||
" msr PAC_KEY_P_0, r2 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_0, r2 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_1, r3 \n"
|
" msr PAC_KEY_P_1, r3 \n"
|
||||||
" msr PAC_KEY_P_2, r4 \n"
|
" msr PAC_KEY_P_2, r4 \n"
|
||||||
" msr PAC_KEY_P_3, r5 \n"
|
" msr PAC_KEY_P_3, r5 \n"
|
||||||
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" ldmdb r1!, {r2-r4, lr} \n" /* r2 = original PSP, r3 = PSPLIM, r4 = CONTROL, LR restored. */
|
" ldmdb r1!, {r2-r4, lr} \n" /* r2 = original PSP, r3 = PSPLIM, r4 = CONTROL, LR restored. */
|
||||||
" msr psp, r2 \n"
|
" msr psp, r2 \n"
|
||||||
" msr psplim, r3 \n"
|
" msr psplim, r3 \n"
|
||||||
|
@ -138,14 +138,14 @@
|
||||||
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
||||||
" ldr r0, [r1] \n" /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
|
" ldr r0, [r1] \n" /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmia r0!, {r1-r4} \n" /* Read task's dedicated PAC key from stack. */
|
" ldmia r0!, {r1-r4} \n" /* Read task's dedicated PAC key from stack. */
|
||||||
" msr PAC_KEY_P_3, r1 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_3, r1 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_2, r2 \n"
|
" msr PAC_KEY_P_2, r2 \n"
|
||||||
" msr PAC_KEY_P_1, r3 \n"
|
" msr PAC_KEY_P_1, r3 \n"
|
||||||
" msr PAC_KEY_P_0, r4 \n"
|
" msr PAC_KEY_P_0, r4 \n"
|
||||||
" clrm {r1-r4} \n" /* Clear r1-r4. */
|
" clrm {r1-r4} \n" /* Clear r1-r4. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" \n"
|
" \n"
|
||||||
" ldm r0!, {r1-r2} \n" /* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */
|
" ldm r0!, {r1-r2} \n" /* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */
|
||||||
" msr psplim, r1 \n" /* Set this task's PSPLIM value. */
|
" msr psplim, r1 \n" /* Set this task's PSPLIM value. */
|
||||||
|
@ -278,15 +278,15 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" mrs r2, psp \n" /* r2 = PSP. */
|
" mrs r2, psp \n" /* r2 = PSP. */
|
||||||
" \n"
|
" \n"
|
||||||
" save_general_regs: \n"
|
" save_general_regs: \n"
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" add r2, r2, #0x20 \n" /* Move r2 to location where s0 is saved. */
|
" add r2, r2, #0x20 \n" /* Move r2 to location where s0 is saved. */
|
||||||
" tst lr, #0x10 \n"
|
" tst lr, #0x10 \n"
|
||||||
" ittt eq \n"
|
" ittt eq \n"
|
||||||
" vstmiaeq r1!, {s16-s31} \n" /* Store s16-s31. */
|
" vstmiaeq r1!, {s16-s31} \n" /* Store s16-s31. */
|
||||||
" vldmiaeq r2, {s0-s16} \n" /* Copy hardware saved FP context into s0-s16. */
|
" vldmiaeq r2, {s0-s16} \n" /* Copy hardware saved FP context into s0-s16. */
|
||||||
" vstmiaeq r1!, {s0-s16} \n" /* Store hardware saved FP context. */
|
" vstmiaeq r1!, {s0-s16} \n" /* Store hardware saved FP context. */
|
||||||
" sub r2, r2, #0x20 \n" /* Set r2 back to the location of hardware saved context. */
|
" sub r2, r2, #0x20 \n" /* Set r2 back to the location of hardware saved context. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" stmia r1!, {r4-r11} \n" /* Store r4-r11. */
|
" stmia r1!, {r4-r11} \n" /* Store r4-r11. */
|
||||||
" ldmia r2, {r4-r11} \n" /* Copy the hardware saved context into r4-r11. */
|
" ldmia r2, {r4-r11} \n" /* Copy the hardware saved context into r4-r11. */
|
||||||
" stmia r1!, {r4-r11} \n" /* Store the hardware saved context. */
|
" stmia r1!, {r4-r11} \n" /* Store the hardware saved context. */
|
||||||
|
@ -295,14 +295,14 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" mrs r3, psplim \n" /* r3 = PSPLIM. */
|
" mrs r3, psplim \n" /* r3 = PSPLIM. */
|
||||||
" mrs r4, control \n" /* r4 = CONTROL. */
|
" mrs r4, control \n" /* r4 = CONTROL. */
|
||||||
" stmia r1!, {r2-r4, lr} \n" /* Store original PSP (after hardware has saved context), PSPLIM, CONTROL and LR. */
|
" stmia r1!, {r2-r4, lr} \n" /* Store original PSP (after hardware has saved context), PSPLIM, CONTROL and LR. */
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" mrs r2, PAC_KEY_P_0 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
" mrs r2, PAC_KEY_P_0 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
||||||
" mrs r3, PAC_KEY_P_1 \n"
|
" mrs r3, PAC_KEY_P_1 \n"
|
||||||
" mrs r4, PAC_KEY_P_2 \n"
|
" mrs r4, PAC_KEY_P_2 \n"
|
||||||
" mrs r5, PAC_KEY_P_3 \n"
|
" mrs r5, PAC_KEY_P_3 \n"
|
||||||
" stmia r1!, {r2-r5} \n" /* Store the task's dedicated PAC key on the task's context. */
|
" stmia r1!, {r2-r5} \n" /* Store the task's dedicated PAC key on the task's context. */
|
||||||
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" str r1, [r0] \n" /* Save the location from where the context should be restored as the first member of TCB. */
|
" str r1, [r0] \n" /* Save the location from where the context should be restored as the first member of TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" select_next_task: \n"
|
" select_next_task: \n"
|
||||||
|
@ -338,16 +338,16 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configTOTAL_MPU_REGIONS == 16 )
|
#if ( configTOTAL_MPU_REGIONS == 16 )
|
||||||
" movs r3, #8 \n" /* r3 = 8. */
|
" movs r3, #8 \n" /* r3 = 8. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 8. */
|
" str r3, [r1] \n" /* Program RNR = 8. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" movs r3, #12 \n" /* r3 = 12. */
|
" movs r3, #12 \n" /* r3 = 12. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 12. */
|
" str r3, [r1] \n" /* Program RNR = 12. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
||||||
" \n"
|
" \n"
|
||||||
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
@ -361,14 +361,14 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldr r1, [r0] \n" /* r1 = Location of saved context in TCB. */
|
" ldr r1, [r0] \n" /* r1 = Location of saved context in TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_special_regs: \n"
|
" restore_special_regs: \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmdb r1!, {r2-r5} \n" /* Read task's dedicated PAC key from the task's context. */
|
" ldmdb r1!, {r2-r5} \n" /* Read task's dedicated PAC key from the task's context. */
|
||||||
" msr PAC_KEY_P_0, r2 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_0, r2 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_1, r3 \n"
|
" msr PAC_KEY_P_1, r3 \n"
|
||||||
" msr PAC_KEY_P_2, r4 \n"
|
" msr PAC_KEY_P_2, r4 \n"
|
||||||
" msr PAC_KEY_P_3, r5 \n"
|
" msr PAC_KEY_P_3, r5 \n"
|
||||||
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" ldmdb r1!, {r2-r4, lr} \n" /* r2 = original PSP, r3 = PSPLIM, r4 = CONTROL, LR restored. */
|
" ldmdb r1!, {r2-r4, lr} \n" /* r2 = original PSP, r3 = PSPLIM, r4 = CONTROL, LR restored. */
|
||||||
" msr psp, r2 \n"
|
" msr psp, r2 \n"
|
||||||
" msr psplim, r3 \n"
|
" msr psplim, r3 \n"
|
||||||
|
@ -378,13 +378,13 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldmdb r1!, {r4-r11} \n" /* r4-r11 contain hardware saved context. */
|
" ldmdb r1!, {r4-r11} \n" /* r4-r11 contain hardware saved context. */
|
||||||
" stmia r2!, {r4-r11} \n" /* Copy the hardware saved context on the task stack. */
|
" stmia r2!, {r4-r11} \n" /* Copy the hardware saved context on the task stack. */
|
||||||
" ldmdb r1!, {r4-r11} \n" /* r4-r11 restored. */
|
" ldmdb r1!, {r4-r11} \n" /* r4-r11 restored. */
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" tst lr, #0x10 \n"
|
" tst lr, #0x10 \n"
|
||||||
" ittt eq \n"
|
" ittt eq \n"
|
||||||
" vldmdbeq r1!, {s0-s16} \n" /* s0-s16 contain hardware saved FP context. */
|
" vldmdbeq r1!, {s0-s16} \n" /* s0-s16 contain hardware saved FP context. */
|
||||||
" vstmiaeq r2!, {s0-s16} \n" /* Copy hardware saved FP context on the task stack. */
|
" vstmiaeq r2!, {s0-s16} \n" /* Copy hardware saved FP context on the task stack. */
|
||||||
" vldmdbeq r1!, {s16-s31} \n" /* Restore s16-s31. */
|
" vldmdbeq r1!, {s16-s31} \n" /* Restore s16-s31. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_context_done: \n"
|
" restore_context_done: \n"
|
||||||
" str r1, [r0] \n" /* Save the location where the context should be saved next as the first member of TCB. */
|
" str r1, [r0] \n" /* Save the location where the context should be saved next as the first member of TCB. */
|
||||||
|
@ -403,24 +403,24 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" \n"
|
" \n"
|
||||||
" mrs r0, psp \n" /* Read PSP in r0. */
|
" mrs r0, psp \n" /* Read PSP in r0. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
||||||
" it eq \n"
|
" it eq \n"
|
||||||
" vstmdbeq r0!, {s16-s31} \n" /* Store the additional FP context registers which are not saved automatically. */
|
" vstmdbeq r0!, {s16-s31} \n" /* Store the additional FP context registers which are not saved automatically. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" \n"
|
" \n"
|
||||||
" mrs r2, psplim \n" /* r2 = PSPLIM. */
|
" mrs r2, psplim \n" /* r2 = PSPLIM. */
|
||||||
" mov r3, lr \n" /* r3 = LR/EXC_RETURN. */
|
" mov r3, lr \n" /* r3 = LR/EXC_RETURN. */
|
||||||
" stmdb r0!, {r2-r11} \n" /* Store on the stack - PSPLIM, LR and registers that are not automatically saved. */
|
" stmdb r0!, {r2-r11} \n" /* Store on the stack - PSPLIM, LR and registers that are not automatically saved. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" mrs r1, PAC_KEY_P_3 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
" mrs r1, PAC_KEY_P_3 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
||||||
" mrs r2, PAC_KEY_P_2 \n"
|
" mrs r2, PAC_KEY_P_2 \n"
|
||||||
" mrs r3, PAC_KEY_P_1 \n"
|
" mrs r3, PAC_KEY_P_1 \n"
|
||||||
" mrs r4, PAC_KEY_P_0 \n"
|
" mrs r4, PAC_KEY_P_0 \n"
|
||||||
" stmdb r0!, {r1-r4} \n" /* Store the task's dedicated PAC key on the stack. */
|
" stmdb r0!, {r1-r4} \n" /* Store the task's dedicated PAC key on the stack. */
|
||||||
" clrm {r1-r4} \n" /* Clear r1-r4. */
|
" clrm {r1-r4} \n" /* Clear r1-r4. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" \n"
|
" \n"
|
||||||
" ldr r2, =pxCurrentTCB \n" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
" ldr r2, =pxCurrentTCB \n" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
||||||
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
||||||
|
@ -438,22 +438,22 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
||||||
" ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */
|
" ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmia r0!, {r2-r5} \n" /* Read task's dedicated PAC key from stack. */
|
" ldmia r0!, {r2-r5} \n" /* Read task's dedicated PAC key from stack. */
|
||||||
" msr PAC_KEY_P_3, r2 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_3, r2 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_2, r3 \n"
|
" msr PAC_KEY_P_2, r3 \n"
|
||||||
" msr PAC_KEY_P_1, r4 \n"
|
" msr PAC_KEY_P_1, r4 \n"
|
||||||
" msr PAC_KEY_P_0, r5 \n"
|
" msr PAC_KEY_P_0, r5 \n"
|
||||||
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" \n"
|
" \n"
|
||||||
" ldmia r0!, {r2-r11} \n" /* Read from stack - r2 = PSPLIM, r3 = LR and r4-r11 restored. */
|
" ldmia r0!, {r2-r11} \n" /* Read from stack - r2 = PSPLIM, r3 = LR and r4-r11 restored. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" tst r3, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
" tst r3, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
||||||
" it eq \n"
|
" it eq \n"
|
||||||
" vldmiaeq r0!, {s16-s31} \n" /* Restore the additional FP context registers which are not restored automatically. */
|
" vldmiaeq r0!, {s16-s31} \n" /* Restore the additional FP context registers which are not restored automatically. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" \n"
|
" \n"
|
||||||
" msr psplim, r2 \n" /* Restore the PSPLIM register value for the task. */
|
" msr psplim, r2 \n" /* Restore the PSPLIM register value for the task. */
|
||||||
" msr psp, r0 \n" /* Remember the new top of stack for the task. */
|
" msr psp, r0 \n" /* Remember the new top of stack for the task. */
|
||||||
|
|
|
@ -60,7 +60,7 @@
|
||||||
|
|
||||||
#ifndef configENABLE_MVE
|
#ifndef configENABLE_MVE
|
||||||
#define configENABLE_MVE 0
|
#define configENABLE_MVE 0
|
||||||
#elif( configENABLE_MVE != 0 )
|
#elif ( configENABLE_MVE != 0 )
|
||||||
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M33.
|
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M33.
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
|
@ -60,7 +60,7 @@
|
||||||
|
|
||||||
#ifndef configENABLE_MVE
|
#ifndef configENABLE_MVE
|
||||||
#define configENABLE_MVE 0
|
#define configENABLE_MVE 0
|
||||||
#elif( configENABLE_MVE != 0 )
|
#elif ( configENABLE_MVE != 0 )
|
||||||
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M35.
|
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M35.
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
|
@ -64,7 +64,7 @@
|
||||||
|
|
||||||
#ifndef configENABLE_MVE
|
#ifndef configENABLE_MVE
|
||||||
#define configENABLE_MVE 0
|
#define configENABLE_MVE 0
|
||||||
#elif( configENABLE_MVE != 0 )
|
#elif ( configENABLE_MVE != 0 )
|
||||||
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M23.
|
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M23.
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
|
@ -64,7 +64,7 @@
|
||||||
|
|
||||||
#ifndef configENABLE_MVE
|
#ifndef configENABLE_MVE
|
||||||
#define configENABLE_MVE 0
|
#define configENABLE_MVE 0
|
||||||
#elif( configENABLE_MVE != 0 )
|
#elif ( configENABLE_MVE != 0 )
|
||||||
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M23.
|
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M23.
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
|
@ -60,7 +60,7 @@
|
||||||
|
|
||||||
#ifndef configENABLE_MVE
|
#ifndef configENABLE_MVE
|
||||||
#define configENABLE_MVE 0
|
#define configENABLE_MVE 0
|
||||||
#elif( configENABLE_MVE != 0 )
|
#elif ( configENABLE_MVE != 0 )
|
||||||
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M33.
|
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M33.
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
|
@ -60,7 +60,7 @@
|
||||||
|
|
||||||
#ifndef configENABLE_MVE
|
#ifndef configENABLE_MVE
|
||||||
#define configENABLE_MVE 0
|
#define configENABLE_MVE 0
|
||||||
#elif( configENABLE_MVE != 0 )
|
#elif ( configENABLE_MVE != 0 )
|
||||||
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M33.
|
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M33.
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
|
@ -60,7 +60,7 @@
|
||||||
|
|
||||||
#ifndef configENABLE_MVE
|
#ifndef configENABLE_MVE
|
||||||
#define configENABLE_MVE 0
|
#define configENABLE_MVE 0
|
||||||
#elif( configENABLE_MVE != 0 )
|
#elif ( configENABLE_MVE != 0 )
|
||||||
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M35.
|
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M35.
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
|
@ -243,54 +243,55 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
/*
|
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
/*
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
*
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
*
|
||||||
* 16 16 8 8 5 16 1
|
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
||||||
*/
|
* 16 16 8 8 5 16 1
|
||||||
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 70
|
#define MAX_CONTEXT_SIZE 70
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
||||||
* 16 16 8 8 5 1
|
* 16 16 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 54
|
#define MAX_CONTEXT_SIZE 54
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | | |
|
* | | | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
||||||
* 16 16 8 8 4 16 1
|
* 16 16 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 69
|
#define MAX_CONTEXT_SIZE 69
|
||||||
|
|
||||||
#else
|
#else /* if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | |
|
* | | | | PC, xPSR | EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><---->
|
* <-----------><--------------><---------><----------------><---------------------><---->
|
||||||
* 16 16 8 8 4 1
|
* 16 16 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 53
|
#define MAX_CONTEXT_SIZE 53
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
@ -299,54 +300,54 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><-----------><---->
|
* <---------><----------------><------------------------------><-----------><---->
|
||||||
* 8 8 5 16 1
|
* 8 8 5 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 38
|
#define MAX_CONTEXT_SIZE 38
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><---->
|
* <---------><----------------><------------------------------><---->
|
||||||
* 8 8 5 1
|
* 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 22
|
#define MAX_CONTEXT_SIZE 22
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | PC, xPSR | EXC_RETURN | | |
|
* | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><-----------><---->
|
* <---------><----------------><----------------------><-----------><---->
|
||||||
* 8 8 4 16 1
|
* 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 37
|
#define MAX_CONTEXT_SIZE 37
|
||||||
|
|
||||||
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | PC, xPSR | EXC_RETURN | |
|
* | | PC, xPSR | EXC_RETURN | |
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><---->
|
* <---------><----------------><----------------------><---->
|
||||||
* 8 8 4 1
|
* 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 21
|
#define MAX_CONTEXT_SIZE 21
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
|
@ -169,79 +169,80 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to manipulate the MPU.
|
* @brief Constants required to manipulate the MPU.
|
||||||
*/
|
*/
|
||||||
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
||||||
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
||||||
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
||||||
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
||||||
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
||||||
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
||||||
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
||||||
|
|
||||||
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
||||||
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
|
|
||||||
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
||||||
|
|
||||||
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
||||||
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
|
||||||
* region. */
|
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
||||||
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
* region. */
|
||||||
|
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
||||||
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
||||||
|
|
||||||
/* Enable privileged access to unmapped region. */
|
/* Enable privileged access to unmapped region. */
|
||||||
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
||||||
|
|
||||||
/* Enable MPU. */
|
/* Enable MPU. */
|
||||||
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
||||||
|
|
||||||
/* Expected value of the portMPU_TYPE register. */
|
/* Expected value of the portMPU_TYPE register. */
|
||||||
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
||||||
|
|
||||||
/* Extract first address of the MPU region as encoded in the
|
/* Extract first address of the MPU region as encoded in the
|
||||||
* RBAR (Region Base Address Register) value. */
|
* RBAR (Region Base Address Register) value. */
|
||||||
|
@ -380,14 +381,14 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to check and configure PACBTI security feature implementation.
|
* @brief Constants required to check and configure PACBTI security feature implementation.
|
||||||
*/
|
*/
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
||||||
|
|
||||||
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
||||||
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
||||||
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
||||||
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
||||||
|
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -427,7 +428,7 @@ static void prvTaskExitError( void );
|
||||||
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_FPU */
|
#endif /* configENABLE_FPU */
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Configures PACBTI features.
|
* @brief Configures PACBTI features.
|
||||||
|
@ -1212,6 +1213,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __syscalls_flash_start__;
|
extern uint32_t * __syscalls_flash_start__;
|
||||||
|
@ -1282,6 +1284,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
||||||
* when we exit from the system call. */
|
* when we exit from the system call. */
|
||||||
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
||||||
|
|
||||||
/* Store the value of the PSPLIM register before the SVC was raised.
|
/* Store the value of the PSPLIM register before the SVC was raised.
|
||||||
* We need to restore it when we exit from the system call. */
|
* We need to restore it when we exit from the system call. */
|
||||||
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
||||||
|
@ -1300,6 +1303,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
|
|
||||||
/* Start executing the system call upon returning from this handler. */
|
/* Start executing the system call upon returning from this handler. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
||||||
|
|
||||||
/* Raise a request to exit from the system call upon finishing the
|
/* Raise a request to exit from the system call upon finishing the
|
||||||
* system call. */
|
* system call. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
||||||
|
@ -1359,6 +1363,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __privileged_functions_start__;
|
extern uint32_t * __privileged_functions_start__;
|
||||||
|
@ -1541,7 +1546,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
||||||
ulIndex++;
|
ulIndex++;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Check PACBTI security feature configuration before pushing the
|
/* Check PACBTI security feature configuration before pushing the
|
||||||
* CONTROL register's value on task's TCB. */
|
* CONTROL register's value on task's TCB. */
|
||||||
|
@ -1814,11 +1819,11 @@ BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
||||||
portNVIC_SHPR2_REG = 0;
|
portNVIC_SHPR2_REG = 0;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Set the CONTROL register value based on PACBTI security feature
|
/* Set the CONTROL register value based on PACBTI security feature
|
||||||
* configuration before starting the first task. */
|
* configuration before starting the first task. */
|
||||||
( void) prvConfigurePACBTI( pdTRUE );
|
( void ) prvConfigurePACBTI( pdTRUE );
|
||||||
}
|
}
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
|
|
||||||
|
@ -2018,9 +2023,9 @@ void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
if( xSchedulerRunning == pdFALSE )
|
if( xSchedulerRunning == pdFALSE )
|
||||||
{
|
{
|
||||||
/* Grant access to all the kernel objects before the scheduler
|
/* Grant access to all the kernel objects before the scheduler
|
||||||
* is started. It is necessary because there is no task running
|
* is started. It is necessary because there is no task running
|
||||||
* yet and therefore, we cannot use the permissions of any
|
* yet and therefore, we cannot use the permissions of any
|
||||||
* task. */
|
* task. */
|
||||||
xAccessGranted = pdTRUE;
|
xAccessGranted = pdTRUE;
|
||||||
}
|
}
|
||||||
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
||||||
|
@ -2241,7 +2246,7 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
||||||
{
|
{
|
||||||
|
@ -2253,13 +2258,13 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
/* Enable UsageFault exception. */
|
/* Enable UsageFault exception. */
|
||||||
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
||||||
|
|
||||||
#if( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if( configENABLE_BTI == 1 )
|
#if ( configENABLE_BTI == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,7 +64,7 @@
|
||||||
|
|
||||||
#ifndef configENABLE_MVE
|
#ifndef configENABLE_MVE
|
||||||
#define configENABLE_MVE 0
|
#define configENABLE_MVE 0
|
||||||
#elif( configENABLE_MVE != 0 )
|
#elif ( configENABLE_MVE != 0 )
|
||||||
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M23.
|
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M23.
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
|
@ -243,54 +243,55 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
/*
|
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
/*
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
*
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
*
|
||||||
* 16 16 8 8 5 16 1
|
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
||||||
*/
|
* 16 16 8 8 5 16 1
|
||||||
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 70
|
#define MAX_CONTEXT_SIZE 70
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
||||||
* 16 16 8 8 5 1
|
* 16 16 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 54
|
#define MAX_CONTEXT_SIZE 54
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | | |
|
* | | | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
||||||
* 16 16 8 8 4 16 1
|
* 16 16 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 69
|
#define MAX_CONTEXT_SIZE 69
|
||||||
|
|
||||||
#else
|
#else /* if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | |
|
* | | | | PC, xPSR | EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><---->
|
* <-----------><--------------><---------><----------------><---------------------><---->
|
||||||
* 16 16 8 8 4 1
|
* 16 16 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 53
|
#define MAX_CONTEXT_SIZE 53
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
@ -299,54 +300,54 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><-----------><---->
|
* <---------><----------------><------------------------------><-----------><---->
|
||||||
* 8 8 5 16 1
|
* 8 8 5 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 38
|
#define MAX_CONTEXT_SIZE 38
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><---->
|
* <---------><----------------><------------------------------><---->
|
||||||
* 8 8 5 1
|
* 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 22
|
#define MAX_CONTEXT_SIZE 22
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | PC, xPSR | EXC_RETURN | | |
|
* | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><-----------><---->
|
* <---------><----------------><----------------------><-----------><---->
|
||||||
* 8 8 4 16 1
|
* 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 37
|
#define MAX_CONTEXT_SIZE 37
|
||||||
|
|
||||||
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | PC, xPSR | EXC_RETURN | |
|
* | | PC, xPSR | EXC_RETURN | |
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><---->
|
* <---------><----------------><----------------------><---->
|
||||||
* 8 8 4 1
|
* 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 21
|
#define MAX_CONTEXT_SIZE 21
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
|
@ -169,79 +169,80 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to manipulate the MPU.
|
* @brief Constants required to manipulate the MPU.
|
||||||
*/
|
*/
|
||||||
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
||||||
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
||||||
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
||||||
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
||||||
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
||||||
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
||||||
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
||||||
|
|
||||||
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
||||||
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
|
|
||||||
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
||||||
|
|
||||||
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
||||||
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
|
||||||
* region. */
|
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
||||||
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
* region. */
|
||||||
|
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
||||||
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
||||||
|
|
||||||
/* Enable privileged access to unmapped region. */
|
/* Enable privileged access to unmapped region. */
|
||||||
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
||||||
|
|
||||||
/* Enable MPU. */
|
/* Enable MPU. */
|
||||||
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
||||||
|
|
||||||
/* Expected value of the portMPU_TYPE register. */
|
/* Expected value of the portMPU_TYPE register. */
|
||||||
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
||||||
|
|
||||||
/* Extract first address of the MPU region as encoded in the
|
/* Extract first address of the MPU region as encoded in the
|
||||||
* RBAR (Region Base Address Register) value. */
|
* RBAR (Region Base Address Register) value. */
|
||||||
|
@ -380,14 +381,14 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to check and configure PACBTI security feature implementation.
|
* @brief Constants required to check and configure PACBTI security feature implementation.
|
||||||
*/
|
*/
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
||||||
|
|
||||||
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
||||||
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
||||||
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
||||||
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
||||||
|
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -427,7 +428,7 @@ static void prvTaskExitError( void );
|
||||||
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_FPU */
|
#endif /* configENABLE_FPU */
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Configures PACBTI features.
|
* @brief Configures PACBTI features.
|
||||||
|
@ -1212,6 +1213,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __syscalls_flash_start__;
|
extern uint32_t * __syscalls_flash_start__;
|
||||||
|
@ -1282,6 +1284,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
||||||
* when we exit from the system call. */
|
* when we exit from the system call. */
|
||||||
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
||||||
|
|
||||||
/* Store the value of the PSPLIM register before the SVC was raised.
|
/* Store the value of the PSPLIM register before the SVC was raised.
|
||||||
* We need to restore it when we exit from the system call. */
|
* We need to restore it when we exit from the system call. */
|
||||||
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
||||||
|
@ -1300,6 +1303,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
|
|
||||||
/* Start executing the system call upon returning from this handler. */
|
/* Start executing the system call upon returning from this handler. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
||||||
|
|
||||||
/* Raise a request to exit from the system call upon finishing the
|
/* Raise a request to exit from the system call upon finishing the
|
||||||
* system call. */
|
* system call. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
||||||
|
@ -1359,6 +1363,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __privileged_functions_start__;
|
extern uint32_t * __privileged_functions_start__;
|
||||||
|
@ -1541,7 +1546,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
||||||
ulIndex++;
|
ulIndex++;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Check PACBTI security feature configuration before pushing the
|
/* Check PACBTI security feature configuration before pushing the
|
||||||
* CONTROL register's value on task's TCB. */
|
* CONTROL register's value on task's TCB. */
|
||||||
|
@ -1814,11 +1819,11 @@ BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
||||||
portNVIC_SHPR2_REG = 0;
|
portNVIC_SHPR2_REG = 0;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Set the CONTROL register value based on PACBTI security feature
|
/* Set the CONTROL register value based on PACBTI security feature
|
||||||
* configuration before starting the first task. */
|
* configuration before starting the first task. */
|
||||||
( void) prvConfigurePACBTI( pdTRUE );
|
( void ) prvConfigurePACBTI( pdTRUE );
|
||||||
}
|
}
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
|
|
||||||
|
@ -2018,9 +2023,9 @@ void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
if( xSchedulerRunning == pdFALSE )
|
if( xSchedulerRunning == pdFALSE )
|
||||||
{
|
{
|
||||||
/* Grant access to all the kernel objects before the scheduler
|
/* Grant access to all the kernel objects before the scheduler
|
||||||
* is started. It is necessary because there is no task running
|
* is started. It is necessary because there is no task running
|
||||||
* yet and therefore, we cannot use the permissions of any
|
* yet and therefore, we cannot use the permissions of any
|
||||||
* task. */
|
* task. */
|
||||||
xAccessGranted = pdTRUE;
|
xAccessGranted = pdTRUE;
|
||||||
}
|
}
|
||||||
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
||||||
|
@ -2241,7 +2246,7 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
||||||
{
|
{
|
||||||
|
@ -2253,13 +2258,13 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
/* Enable UsageFault exception. */
|
/* Enable UsageFault exception. */
|
||||||
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
||||||
|
|
||||||
#if( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if( configENABLE_BTI == 1 )
|
#if ( configENABLE_BTI == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,7 +64,7 @@
|
||||||
|
|
||||||
#ifndef configENABLE_MVE
|
#ifndef configENABLE_MVE
|
||||||
#define configENABLE_MVE 0
|
#define configENABLE_MVE 0
|
||||||
#elif( configENABLE_MVE != 0 )
|
#elif ( configENABLE_MVE != 0 )
|
||||||
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M23.
|
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M23.
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
|
@ -243,54 +243,55 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
/*
|
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
/*
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
*
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
*
|
||||||
* 16 16 8 8 5 16 1
|
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
||||||
*/
|
* 16 16 8 8 5 16 1
|
||||||
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 70
|
#define MAX_CONTEXT_SIZE 70
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
||||||
* 16 16 8 8 5 1
|
* 16 16 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 54
|
#define MAX_CONTEXT_SIZE 54
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | | |
|
* | | | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
||||||
* 16 16 8 8 4 16 1
|
* 16 16 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 69
|
#define MAX_CONTEXT_SIZE 69
|
||||||
|
|
||||||
#else
|
#else /* if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | |
|
* | | | | PC, xPSR | EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><---->
|
* <-----------><--------------><---------><----------------><---------------------><---->
|
||||||
* 16 16 8 8 4 1
|
* 16 16 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 53
|
#define MAX_CONTEXT_SIZE 53
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
@ -299,54 +300,54 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><-----------><---->
|
* <---------><----------------><------------------------------><-----------><---->
|
||||||
* 8 8 5 16 1
|
* 8 8 5 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 38
|
#define MAX_CONTEXT_SIZE 38
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><---->
|
* <---------><----------------><------------------------------><---->
|
||||||
* 8 8 5 1
|
* 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 22
|
#define MAX_CONTEXT_SIZE 22
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | PC, xPSR | EXC_RETURN | | |
|
* | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><-----------><---->
|
* <---------><----------------><----------------------><-----------><---->
|
||||||
* 8 8 4 16 1
|
* 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 37
|
#define MAX_CONTEXT_SIZE 37
|
||||||
|
|
||||||
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | PC, xPSR | EXC_RETURN | |
|
* | | PC, xPSR | EXC_RETURN | |
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><---->
|
* <---------><----------------><----------------------><---->
|
||||||
* 8 8 4 1
|
* 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 21
|
#define MAX_CONTEXT_SIZE 21
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
|
@ -169,79 +169,80 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to manipulate the MPU.
|
* @brief Constants required to manipulate the MPU.
|
||||||
*/
|
*/
|
||||||
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
||||||
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
||||||
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
||||||
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
||||||
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
||||||
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
||||||
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
||||||
|
|
||||||
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
||||||
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
|
|
||||||
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
||||||
|
|
||||||
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
||||||
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
|
||||||
* region. */
|
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
||||||
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
* region. */
|
||||||
|
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
||||||
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
||||||
|
|
||||||
/* Enable privileged access to unmapped region. */
|
/* Enable privileged access to unmapped region. */
|
||||||
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
||||||
|
|
||||||
/* Enable MPU. */
|
/* Enable MPU. */
|
||||||
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
||||||
|
|
||||||
/* Expected value of the portMPU_TYPE register. */
|
/* Expected value of the portMPU_TYPE register. */
|
||||||
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
||||||
|
|
||||||
/* Extract first address of the MPU region as encoded in the
|
/* Extract first address of the MPU region as encoded in the
|
||||||
* RBAR (Region Base Address Register) value. */
|
* RBAR (Region Base Address Register) value. */
|
||||||
|
@ -380,14 +381,14 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to check and configure PACBTI security feature implementation.
|
* @brief Constants required to check and configure PACBTI security feature implementation.
|
||||||
*/
|
*/
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
||||||
|
|
||||||
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
||||||
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
||||||
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
||||||
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
||||||
|
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -409,7 +410,7 @@ static void prvTaskExitError( void );
|
||||||
* @return uint32_t Access permissions.
|
* @return uint32_t Access permissions.
|
||||||
*/
|
*/
|
||||||
static uint32_t prvGetRegionAccessPermissions( uint32_t ulRBARValue ) PRIVILEGED_FUNCTION;
|
static uint32_t prvGetRegionAccessPermissions( uint32_t ulRBARValue ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
|
||||||
|
@ -427,7 +428,7 @@ static void prvTaskExitError( void );
|
||||||
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_FPU */
|
#endif /* configENABLE_FPU */
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Configures PACBTI features.
|
* @brief Configures PACBTI features.
|
||||||
|
@ -890,7 +891,7 @@ static void prvTaskExitError( void )
|
||||||
return ulAccessPermissions;
|
return ulAccessPermissions;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
@ -1212,6 +1213,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __syscalls_flash_start__;
|
extern uint32_t * __syscalls_flash_start__;
|
||||||
|
@ -1282,6 +1284,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
||||||
* when we exit from the system call. */
|
* when we exit from the system call. */
|
||||||
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
||||||
|
|
||||||
/* Store the value of the PSPLIM register before the SVC was raised.
|
/* Store the value of the PSPLIM register before the SVC was raised.
|
||||||
* We need to restore it when we exit from the system call. */
|
* We need to restore it when we exit from the system call. */
|
||||||
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
||||||
|
@ -1300,6 +1303,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
|
|
||||||
/* Start executing the system call upon returning from this handler. */
|
/* Start executing the system call upon returning from this handler. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
||||||
|
|
||||||
/* Raise a request to exit from the system call upon finishing the
|
/* Raise a request to exit from the system call upon finishing the
|
||||||
* system call. */
|
* system call. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
||||||
|
@ -1359,6 +1363,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __privileged_functions_start__;
|
extern uint32_t * __privileged_functions_start__;
|
||||||
|
@ -1541,7 +1546,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
||||||
ulIndex++;
|
ulIndex++;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Check PACBTI security feature configuration before pushing the
|
/* Check PACBTI security feature configuration before pushing the
|
||||||
* CONTROL register's value on task's TCB. */
|
* CONTROL register's value on task's TCB. */
|
||||||
|
@ -1814,11 +1819,11 @@ BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
||||||
portNVIC_SHPR2_REG = 0;
|
portNVIC_SHPR2_REG = 0;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Set the CONTROL register value based on PACBTI security feature
|
/* Set the CONTROL register value based on PACBTI security feature
|
||||||
* configuration before starting the first task. */
|
* configuration before starting the first task. */
|
||||||
( void) prvConfigurePACBTI( pdTRUE );
|
( void ) prvConfigurePACBTI( pdTRUE );
|
||||||
}
|
}
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
|
|
||||||
|
@ -2018,9 +2023,9 @@ void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
if( xSchedulerRunning == pdFALSE )
|
if( xSchedulerRunning == pdFALSE )
|
||||||
{
|
{
|
||||||
/* Grant access to all the kernel objects before the scheduler
|
/* Grant access to all the kernel objects before the scheduler
|
||||||
* is started. It is necessary because there is no task running
|
* is started. It is necessary because there is no task running
|
||||||
* yet and therefore, we cannot use the permissions of any
|
* yet and therefore, we cannot use the permissions of any
|
||||||
* task. */
|
* task. */
|
||||||
xAccessGranted = pdTRUE;
|
xAccessGranted = pdTRUE;
|
||||||
}
|
}
|
||||||
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
||||||
|
@ -2241,7 +2246,7 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
||||||
{
|
{
|
||||||
|
@ -2253,13 +2258,13 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
/* Enable UsageFault exception. */
|
/* Enable UsageFault exception. */
|
||||||
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
||||||
|
|
||||||
#if( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if( configENABLE_BTI == 1 )
|
#if ( configENABLE_BTI == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,16 +77,16 @@
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configTOTAL_MPU_REGIONS == 16 )
|
#if ( configTOTAL_MPU_REGIONS == 16 )
|
||||||
" movs r3, #8 \n" /* r3 = 8. */
|
" movs r3, #8 \n" /* r3 = 8. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 8. */
|
" str r3, [r1] \n" /* Program RNR = 8. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" movs r3, #12 \n" /* r3 = 12. */
|
" movs r3, #12 \n" /* r3 = 12. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 12. */
|
" str r3, [r1] \n" /* Program RNR = 12. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
||||||
" \n"
|
" \n"
|
||||||
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
@ -100,14 +100,14 @@
|
||||||
" ldr r2, [r1] \n" /* r2 = Location of saved context in TCB. */
|
" ldr r2, [r1] \n" /* r2 = Location of saved context in TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_special_regs_first_task: \n"
|
" restore_special_regs_first_task: \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmdb r2!, {r3-r6} \n" /* Read task's dedicated PAC key from the task's context. */
|
" ldmdb r2!, {r3-r6} \n" /* Read task's dedicated PAC key from the task's context. */
|
||||||
" msr PAC_KEY_P_0, r3 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_0, r3 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_1, r4 \n"
|
" msr PAC_KEY_P_1, r4 \n"
|
||||||
" msr PAC_KEY_P_2, r5 \n"
|
" msr PAC_KEY_P_2, r5 \n"
|
||||||
" msr PAC_KEY_P_3, r6 \n"
|
" msr PAC_KEY_P_3, r6 \n"
|
||||||
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" ldmdb r2!, {r0, r3-r5, lr} \n" /* r0 = xSecureContext, r3 = original PSP, r4 = PSPLIM, r5 = CONTROL, LR restored. */
|
" ldmdb r2!, {r0, r3-r5, lr} \n" /* r0 = xSecureContext, r3 = original PSP, r4 = PSPLIM, r5 = CONTROL, LR restored. */
|
||||||
" msr psp, r3 \n"
|
" msr psp, r3 \n"
|
||||||
" msr psplim, r4 \n"
|
" msr psplim, r4 \n"
|
||||||
|
@ -140,14 +140,14 @@
|
||||||
" ldr r3, [r2] \n" /* Read pxCurrentTCB. */
|
" ldr r3, [r2] \n" /* Read pxCurrentTCB. */
|
||||||
" ldr r0, [r3] \n" /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
|
" ldr r0, [r3] \n" /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmia r0!, {r1-r4} \n" /* Read task's dedicated PAC key from stack. */
|
" ldmia r0!, {r1-r4} \n" /* Read task's dedicated PAC key from stack. */
|
||||||
" msr PAC_KEY_P_3, r1 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_3, r1 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_2, r2 \n"
|
" msr PAC_KEY_P_2, r2 \n"
|
||||||
" msr PAC_KEY_P_1, r3 \n"
|
" msr PAC_KEY_P_1, r3 \n"
|
||||||
" msr PAC_KEY_P_0, r4 \n"
|
" msr PAC_KEY_P_0, r4 \n"
|
||||||
" clrm {r1-r4} \n" /* Clear r1-r4. */
|
" clrm {r1-r4} \n" /* Clear r1-r4. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" \n"
|
" \n"
|
||||||
" ldm r0!, {r1-r3} \n" /* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */
|
" ldm r0!, {r1-r3} \n" /* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */
|
||||||
" ldr r4, =xSecureContext \n"
|
" ldr r4, =xSecureContext \n"
|
||||||
|
@ -297,15 +297,15 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" \n"
|
" \n"
|
||||||
" save_general_regs: \n"
|
" save_general_regs: \n"
|
||||||
" mrs r3, psp \n"
|
" mrs r3, psp \n"
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" add r3, r3, #0x20 \n" /* Move r3 to location where s0 is saved. */
|
" add r3, r3, #0x20 \n" /* Move r3 to location where s0 is saved. */
|
||||||
" tst lr, #0x10 \n"
|
" tst lr, #0x10 \n"
|
||||||
" ittt eq \n"
|
" ittt eq \n"
|
||||||
" vstmiaeq r2!, {s16-s31} \n" /* Store s16-s31. */
|
" vstmiaeq r2!, {s16-s31} \n" /* Store s16-s31. */
|
||||||
" vldmiaeq r3, {s0-s16} \n" /* Copy hardware saved FP context into s0-s16. */
|
" vldmiaeq r3, {s0-s16} \n" /* Copy hardware saved FP context into s0-s16. */
|
||||||
" vstmiaeq r2!, {s0-s16} \n" /* Store hardware saved FP context. */
|
" vstmiaeq r2!, {s0-s16} \n" /* Store hardware saved FP context. */
|
||||||
" sub r3, r3, #0x20 \n" /* Set r3 back to the location of hardware saved context. */
|
" sub r3, r3, #0x20 \n" /* Set r3 back to the location of hardware saved context. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" stmia r2!, {r4-r11} \n" /* Store r4-r11. */
|
" stmia r2!, {r4-r11} \n" /* Store r4-r11. */
|
||||||
" ldmia r3, {r4-r11} \n" /* Copy the hardware saved context into r4-r11. */
|
" ldmia r3, {r4-r11} \n" /* Copy the hardware saved context into r4-r11. */
|
||||||
" stmia r2!, {r4-r11} \n" /* Store the hardware saved context. */
|
" stmia r2!, {r4-r11} \n" /* Store the hardware saved context. */
|
||||||
|
@ -315,15 +315,15 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" mrs r4, psplim \n" /* r4 = PSPLIM. */
|
" mrs r4, psplim \n" /* r4 = PSPLIM. */
|
||||||
" mrs r5, control \n" /* r5 = CONTROL. */
|
" mrs r5, control \n" /* r5 = CONTROL. */
|
||||||
" stmia r2!, {r0, r3-r5, lr} \n" /* Store xSecureContext, original PSP (after hardware has saved context), PSPLIM, CONTROL and LR. */
|
" stmia r2!, {r0, r3-r5, lr} \n" /* Store xSecureContext, original PSP (after hardware has saved context), PSPLIM, CONTROL and LR. */
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" mrs r3, PAC_KEY_P_0 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
" mrs r3, PAC_KEY_P_0 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
||||||
" mrs r4, PAC_KEY_P_1 \n"
|
" mrs r4, PAC_KEY_P_1 \n"
|
||||||
" mrs r5, PAC_KEY_P_2 \n"
|
" mrs r5, PAC_KEY_P_2 \n"
|
||||||
" mrs r6, PAC_KEY_P_3 \n"
|
" mrs r6, PAC_KEY_P_3 \n"
|
||||||
" stmia r2!, {r3-r6} \n" /* Store the task's dedicated PAC key on the task's context. */
|
" stmia r2!, {r3-r6} \n" /* Store the task's dedicated PAC key on the task's context. */
|
||||||
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" str r2, [r1] \n" /* Save the location from where the context should be restored as the first member of TCB. */
|
" str r2, [r1] \n" /* Save the location from where the context should be restored as the first member of TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" select_next_task: \n"
|
" select_next_task: \n"
|
||||||
" mov r0, %0 \n" /* r0 = configMAX_SYSCALL_INTERRUPT_PRIORITY */
|
" mov r0, %0 \n" /* r0 = configMAX_SYSCALL_INTERRUPT_PRIORITY */
|
||||||
|
@ -358,16 +358,16 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configTOTAL_MPU_REGIONS == 16 )
|
#if ( configTOTAL_MPU_REGIONS == 16 )
|
||||||
" movs r3, #8 \n" /* r3 = 8. */
|
" movs r3, #8 \n" /* r3 = 8. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 8. */
|
" str r3, [r1] \n" /* Program RNR = 8. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" movs r3, #12 \n" /* r3 = 12. */
|
" movs r3, #12 \n" /* r3 = 12. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 12. */
|
" str r3, [r1] \n" /* Program RNR = 12. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
||||||
" \n"
|
" \n"
|
||||||
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
@ -381,14 +381,14 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldr r2, [r1] \n" /* r2 = Location of saved context in TCB. */
|
" ldr r2, [r1] \n" /* r2 = Location of saved context in TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_special_regs: \n"
|
" restore_special_regs: \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmdb r2!, {r3-r6} \n" /* Read task's dedicated PAC key from the task's context. */
|
" ldmdb r2!, {r3-r6} \n" /* Read task's dedicated PAC key from the task's context. */
|
||||||
" msr PAC_KEY_P_0, r3 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_0, r3 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_1, r4 \n"
|
" msr PAC_KEY_P_1, r4 \n"
|
||||||
" msr PAC_KEY_P_2, r5 \n"
|
" msr PAC_KEY_P_2, r5 \n"
|
||||||
" msr PAC_KEY_P_3, r6 \n"
|
" msr PAC_KEY_P_3, r6 \n"
|
||||||
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" ldmdb r2!, {r0, r3-r5, lr} \n" /* r0 = xSecureContext, r3 = original PSP, r4 = PSPLIM, r5 = CONTROL, LR restored. */
|
" ldmdb r2!, {r0, r3-r5, lr} \n" /* r0 = xSecureContext, r3 = original PSP, r4 = PSPLIM, r5 = CONTROL, LR restored. */
|
||||||
" msr psp, r3 \n"
|
" msr psp, r3 \n"
|
||||||
" msr psplim, r4 \n"
|
" msr psplim, r4 \n"
|
||||||
|
@ -411,13 +411,13 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldmdb r2!, {r4-r11} \n" /* r4-r11 contain hardware saved context. */
|
" ldmdb r2!, {r4-r11} \n" /* r4-r11 contain hardware saved context. */
|
||||||
" stmia r3!, {r4-r11} \n" /* Copy the hardware saved context on the task stack. */
|
" stmia r3!, {r4-r11} \n" /* Copy the hardware saved context on the task stack. */
|
||||||
" ldmdb r2!, {r4-r11} \n" /* r4-r11 restored. */
|
" ldmdb r2!, {r4-r11} \n" /* r4-r11 restored. */
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" tst lr, #0x10 \n"
|
" tst lr, #0x10 \n"
|
||||||
" ittt eq \n"
|
" ittt eq \n"
|
||||||
" vldmdbeq r2!, {s0-s16} \n" /* s0-s16 contain hardware saved FP context. */
|
" vldmdbeq r2!, {s0-s16} \n" /* s0-s16 contain hardware saved FP context. */
|
||||||
" vstmiaeq r3!, {s0-s16} \n" /* Copy hardware saved FP context on the task stack. */
|
" vstmiaeq r3!, {s0-s16} \n" /* Copy hardware saved FP context on the task stack. */
|
||||||
" vldmdbeq r2!, {s16-s31} \n" /* Restore s16-s31. */
|
" vldmdbeq r2!, {s16-s31} \n" /* Restore s16-s31. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_context_done: \n"
|
" restore_context_done: \n"
|
||||||
" str r2, [r1] \n" /* Save the location where the context should be saved next as the first member of TCB. */
|
" str r2, [r1] \n" /* Save the location where the context should be saved next as the first member of TCB. */
|
||||||
|
@ -454,24 +454,24 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" bmi save_special_regs \n" /* If r3 < 0 ==> Bit[6] in EXC_RETURN is 1 ==> secure stack was used. */
|
" bmi save_special_regs \n" /* If r3 < 0 ==> Bit[6] in EXC_RETURN is 1 ==> secure stack was used. */
|
||||||
" \n"
|
" \n"
|
||||||
" save_general_regs: \n"
|
" save_general_regs: \n"
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
||||||
" it eq \n"
|
" it eq \n"
|
||||||
" vstmdbeq r2!, {s16-s31} \n" /* Store the additional FP context registers which are not saved automatically. */
|
" vstmdbeq r2!, {s16-s31} \n" /* Store the additional FP context registers which are not saved automatically. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" stmdb r2!, {r4-r11} \n" /* Store the registers that are not saved automatically. */
|
" stmdb r2!, {r4-r11} \n" /* Store the registers that are not saved automatically. */
|
||||||
" \n"
|
" \n"
|
||||||
" save_special_regs: \n"
|
" save_special_regs: \n"
|
||||||
" mrs r3, psplim \n" /* r3 = PSPLIM. */
|
" mrs r3, psplim \n" /* r3 = PSPLIM. */
|
||||||
" stmdb r2!, {r0, r3, lr} \n" /* Store xSecureContext, PSPLIM and LR on the stack. */
|
" stmdb r2!, {r0, r3, lr} \n" /* Store xSecureContext, PSPLIM and LR on the stack. */
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" mrs r3, PAC_KEY_P_3 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
" mrs r3, PAC_KEY_P_3 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
||||||
" mrs r4, PAC_KEY_P_2 \n"
|
" mrs r4, PAC_KEY_P_2 \n"
|
||||||
" mrs r5, PAC_KEY_P_1 \n"
|
" mrs r5, PAC_KEY_P_1 \n"
|
||||||
" mrs r6, PAC_KEY_P_0 \n"
|
" mrs r6, PAC_KEY_P_0 \n"
|
||||||
" stmdb r2!, {r3-r6} \n" /* Store the task's dedicated PAC key on the stack. */
|
" stmdb r2!, {r3-r6} \n" /* Store the task's dedicated PAC key on the stack. */
|
||||||
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" \n"
|
" \n"
|
||||||
" str r2, [r1] \n" /* Save the new top of stack in TCB. */
|
" str r2, [r1] \n" /* Save the new top of stack in TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
|
@ -490,14 +490,14 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldr r2, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. r2 now points to the top of stack. */
|
" ldr r2, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. r2 now points to the top of stack. */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_special_regs: \n"
|
" restore_special_regs: \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmia r2!, {r3-r6} \n" /* Read task's dedicated PAC key from stack. */
|
" ldmia r2!, {r3-r6} \n" /* Read task's dedicated PAC key from stack. */
|
||||||
" msr PAC_KEY_P_3, r3 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_3, r3 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_2, r4 \n"
|
" msr PAC_KEY_P_2, r4 \n"
|
||||||
" msr PAC_KEY_P_1, r5 \n"
|
" msr PAC_KEY_P_1, r5 \n"
|
||||||
" msr PAC_KEY_P_0, r6 \n"
|
" msr PAC_KEY_P_0, r6 \n"
|
||||||
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" ldmia r2!, {r0, r3, lr} \n" /* Read from stack - r0 = xSecureContext, r3 = PSPLIM and LR restored. */
|
" ldmia r2!, {r0, r3, lr} \n" /* Read from stack - r0 = xSecureContext, r3 = PSPLIM and LR restored. */
|
||||||
" msr psplim, r3 \n" /* Restore the PSPLIM register value for the task. */
|
" msr psplim, r3 \n" /* Restore the PSPLIM register value for the task. */
|
||||||
" ldr r3, =xSecureContext \n" /* Read the location of xSecureContext i.e. &( xSecureContext ). */
|
" ldr r3, =xSecureContext \n" /* Read the location of xSecureContext i.e. &( xSecureContext ). */
|
||||||
|
@ -516,11 +516,11 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" \n"
|
" \n"
|
||||||
" restore_general_regs: \n"
|
" restore_general_regs: \n"
|
||||||
" ldmia r2!, {r4-r11} \n" /* Restore the registers that are not automatically restored. */
|
" ldmia r2!, {r4-r11} \n" /* Restore the registers that are not automatically restored. */
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
||||||
" it eq \n"
|
" it eq \n"
|
||||||
" vldmiaeq r2!, {s16-s31} \n" /* Restore the additional FP context registers which are not restored automatically. */
|
" vldmiaeq r2!, {s16-s31} \n" /* Restore the additional FP context registers which are not restored automatically. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_context_done: \n"
|
" restore_context_done: \n"
|
||||||
" msr psp, r2 \n" /* Remember the new top of stack for the task. */
|
" msr psp, r2 \n" /* Remember the new top of stack for the task. */
|
||||||
|
|
|
@ -60,7 +60,7 @@
|
||||||
|
|
||||||
#ifndef configENABLE_MVE
|
#ifndef configENABLE_MVE
|
||||||
#define configENABLE_MVE 0
|
#define configENABLE_MVE 0
|
||||||
#elif( configENABLE_MVE != 0 )
|
#elif ( configENABLE_MVE != 0 )
|
||||||
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M33.
|
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M33.
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
|
@ -243,54 +243,55 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
/*
|
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
/*
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
*
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
*
|
||||||
* 16 16 8 8 5 16 1
|
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
||||||
*/
|
* 16 16 8 8 5 16 1
|
||||||
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 70
|
#define MAX_CONTEXT_SIZE 70
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
||||||
* 16 16 8 8 5 1
|
* 16 16 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 54
|
#define MAX_CONTEXT_SIZE 54
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | | |
|
* | | | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
||||||
* 16 16 8 8 4 16 1
|
* 16 16 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 69
|
#define MAX_CONTEXT_SIZE 69
|
||||||
|
|
||||||
#else
|
#else /* if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | |
|
* | | | | PC, xPSR | EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><---->
|
* <-----------><--------------><---------><----------------><---------------------><---->
|
||||||
* 16 16 8 8 4 1
|
* 16 16 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 53
|
#define MAX_CONTEXT_SIZE 53
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
@ -299,54 +300,54 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><-----------><---->
|
* <---------><----------------><------------------------------><-----------><---->
|
||||||
* 8 8 5 16 1
|
* 8 8 5 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 38
|
#define MAX_CONTEXT_SIZE 38
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><---->
|
* <---------><----------------><------------------------------><---->
|
||||||
* 8 8 5 1
|
* 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 22
|
#define MAX_CONTEXT_SIZE 22
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | PC, xPSR | EXC_RETURN | | |
|
* | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><-----------><---->
|
* <---------><----------------><----------------------><-----------><---->
|
||||||
* 8 8 4 16 1
|
* 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 37
|
#define MAX_CONTEXT_SIZE 37
|
||||||
|
|
||||||
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | PC, xPSR | EXC_RETURN | |
|
* | | PC, xPSR | EXC_RETURN | |
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><---->
|
* <---------><----------------><----------------------><---->
|
||||||
* 8 8 4 1
|
* 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 21
|
#define MAX_CONTEXT_SIZE 21
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
|
@ -169,79 +169,80 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to manipulate the MPU.
|
* @brief Constants required to manipulate the MPU.
|
||||||
*/
|
*/
|
||||||
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
||||||
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
||||||
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
||||||
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
||||||
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
||||||
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
||||||
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
||||||
|
|
||||||
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
||||||
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
|
|
||||||
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
||||||
|
|
||||||
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
||||||
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
|
||||||
* region. */
|
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
||||||
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
* region. */
|
||||||
|
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
||||||
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
||||||
|
|
||||||
/* Enable privileged access to unmapped region. */
|
/* Enable privileged access to unmapped region. */
|
||||||
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
||||||
|
|
||||||
/* Enable MPU. */
|
/* Enable MPU. */
|
||||||
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
||||||
|
|
||||||
/* Expected value of the portMPU_TYPE register. */
|
/* Expected value of the portMPU_TYPE register. */
|
||||||
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
||||||
|
|
||||||
/* Extract first address of the MPU region as encoded in the
|
/* Extract first address of the MPU region as encoded in the
|
||||||
* RBAR (Region Base Address Register) value. */
|
* RBAR (Region Base Address Register) value. */
|
||||||
|
@ -380,14 +381,14 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to check and configure PACBTI security feature implementation.
|
* @brief Constants required to check and configure PACBTI security feature implementation.
|
||||||
*/
|
*/
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
||||||
|
|
||||||
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
||||||
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
||||||
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
||||||
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
||||||
|
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -409,7 +410,7 @@ static void prvTaskExitError( void );
|
||||||
* @return uint32_t Access permissions.
|
* @return uint32_t Access permissions.
|
||||||
*/
|
*/
|
||||||
static uint32_t prvGetRegionAccessPermissions( uint32_t ulRBARValue ) PRIVILEGED_FUNCTION;
|
static uint32_t prvGetRegionAccessPermissions( uint32_t ulRBARValue ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
|
||||||
|
@ -427,7 +428,7 @@ static void prvTaskExitError( void );
|
||||||
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_FPU */
|
#endif /* configENABLE_FPU */
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Configures PACBTI features.
|
* @brief Configures PACBTI features.
|
||||||
|
@ -890,7 +891,7 @@ static void prvTaskExitError( void )
|
||||||
return ulAccessPermissions;
|
return ulAccessPermissions;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
@ -1212,6 +1213,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __syscalls_flash_start__;
|
extern uint32_t * __syscalls_flash_start__;
|
||||||
|
@ -1282,6 +1284,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
||||||
* when we exit from the system call. */
|
* when we exit from the system call. */
|
||||||
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
||||||
|
|
||||||
/* Store the value of the PSPLIM register before the SVC was raised.
|
/* Store the value of the PSPLIM register before the SVC was raised.
|
||||||
* We need to restore it when we exit from the system call. */
|
* We need to restore it when we exit from the system call. */
|
||||||
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
||||||
|
@ -1300,6 +1303,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
|
|
||||||
/* Start executing the system call upon returning from this handler. */
|
/* Start executing the system call upon returning from this handler. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
||||||
|
|
||||||
/* Raise a request to exit from the system call upon finishing the
|
/* Raise a request to exit from the system call upon finishing the
|
||||||
* system call. */
|
* system call. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
||||||
|
@ -1359,6 +1363,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __privileged_functions_start__;
|
extern uint32_t * __privileged_functions_start__;
|
||||||
|
@ -1541,7 +1546,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
||||||
ulIndex++;
|
ulIndex++;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Check PACBTI security feature configuration before pushing the
|
/* Check PACBTI security feature configuration before pushing the
|
||||||
* CONTROL register's value on task's TCB. */
|
* CONTROL register's value on task's TCB. */
|
||||||
|
@ -1814,11 +1819,11 @@ BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
||||||
portNVIC_SHPR2_REG = 0;
|
portNVIC_SHPR2_REG = 0;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Set the CONTROL register value based on PACBTI security feature
|
/* Set the CONTROL register value based on PACBTI security feature
|
||||||
* configuration before starting the first task. */
|
* configuration before starting the first task. */
|
||||||
( void) prvConfigurePACBTI( pdTRUE );
|
( void ) prvConfigurePACBTI( pdTRUE );
|
||||||
}
|
}
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
|
|
||||||
|
@ -2018,9 +2023,9 @@ void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
if( xSchedulerRunning == pdFALSE )
|
if( xSchedulerRunning == pdFALSE )
|
||||||
{
|
{
|
||||||
/* Grant access to all the kernel objects before the scheduler
|
/* Grant access to all the kernel objects before the scheduler
|
||||||
* is started. It is necessary because there is no task running
|
* is started. It is necessary because there is no task running
|
||||||
* yet and therefore, we cannot use the permissions of any
|
* yet and therefore, we cannot use the permissions of any
|
||||||
* task. */
|
* task. */
|
||||||
xAccessGranted = pdTRUE;
|
xAccessGranted = pdTRUE;
|
||||||
}
|
}
|
||||||
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
||||||
|
@ -2241,7 +2246,7 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
||||||
{
|
{
|
||||||
|
@ -2253,13 +2258,13 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
/* Enable UsageFault exception. */
|
/* Enable UsageFault exception. */
|
||||||
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
||||||
|
|
||||||
#if( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if( configENABLE_BTI == 1 )
|
#if ( configENABLE_BTI == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,16 +77,16 @@
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configTOTAL_MPU_REGIONS == 16 )
|
#if ( configTOTAL_MPU_REGIONS == 16 )
|
||||||
" movs r3, #8 \n" /* r3 = 8. */
|
" movs r3, #8 \n" /* r3 = 8. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 8. */
|
" str r3, [r1] \n" /* Program RNR = 8. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" movs r3, #12 \n" /* r3 = 12. */
|
" movs r3, #12 \n" /* r3 = 12. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 12. */
|
" str r3, [r1] \n" /* Program RNR = 12. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
||||||
" \n"
|
" \n"
|
||||||
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
@ -100,14 +100,14 @@
|
||||||
" ldr r1, [r0] \n" /* r1 = Location of saved context in TCB. */
|
" ldr r1, [r0] \n" /* r1 = Location of saved context in TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_special_regs_first_task: \n"
|
" restore_special_regs_first_task: \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmdb r1!, {r2-r5} \n" /* Read task's dedicated PAC key from the task's context. */
|
" ldmdb r1!, {r2-r5} \n" /* Read task's dedicated PAC key from the task's context. */
|
||||||
" msr PAC_KEY_P_0, r2 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_0, r2 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_1, r3 \n"
|
" msr PAC_KEY_P_1, r3 \n"
|
||||||
" msr PAC_KEY_P_2, r4 \n"
|
" msr PAC_KEY_P_2, r4 \n"
|
||||||
" msr PAC_KEY_P_3, r5 \n"
|
" msr PAC_KEY_P_3, r5 \n"
|
||||||
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" ldmdb r1!, {r2-r4, lr} \n" /* r2 = original PSP, r3 = PSPLIM, r4 = CONTROL, LR restored. */
|
" ldmdb r1!, {r2-r4, lr} \n" /* r2 = original PSP, r3 = PSPLIM, r4 = CONTROL, LR restored. */
|
||||||
" msr psp, r2 \n"
|
" msr psp, r2 \n"
|
||||||
" msr psplim, r3 \n"
|
" msr psplim, r3 \n"
|
||||||
|
@ -138,14 +138,14 @@
|
||||||
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
||||||
" ldr r0, [r1] \n" /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
|
" ldr r0, [r1] \n" /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmia r0!, {r1-r4} \n" /* Read task's dedicated PAC key from stack. */
|
" ldmia r0!, {r1-r4} \n" /* Read task's dedicated PAC key from stack. */
|
||||||
" msr PAC_KEY_P_3, r1 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_3, r1 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_2, r2 \n"
|
" msr PAC_KEY_P_2, r2 \n"
|
||||||
" msr PAC_KEY_P_1, r3 \n"
|
" msr PAC_KEY_P_1, r3 \n"
|
||||||
" msr PAC_KEY_P_0, r4 \n"
|
" msr PAC_KEY_P_0, r4 \n"
|
||||||
" clrm {r1-r4} \n" /* Clear r1-r4. */
|
" clrm {r1-r4} \n" /* Clear r1-r4. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" \n"
|
" \n"
|
||||||
" ldm r0!, {r1-r2} \n" /* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */
|
" ldm r0!, {r1-r2} \n" /* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */
|
||||||
" msr psplim, r1 \n" /* Set this task's PSPLIM value. */
|
" msr psplim, r1 \n" /* Set this task's PSPLIM value. */
|
||||||
|
@ -278,15 +278,15 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" mrs r2, psp \n" /* r2 = PSP. */
|
" mrs r2, psp \n" /* r2 = PSP. */
|
||||||
" \n"
|
" \n"
|
||||||
" save_general_regs: \n"
|
" save_general_regs: \n"
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" add r2, r2, #0x20 \n" /* Move r2 to location where s0 is saved. */
|
" add r2, r2, #0x20 \n" /* Move r2 to location where s0 is saved. */
|
||||||
" tst lr, #0x10 \n"
|
" tst lr, #0x10 \n"
|
||||||
" ittt eq \n"
|
" ittt eq \n"
|
||||||
" vstmiaeq r1!, {s16-s31} \n" /* Store s16-s31. */
|
" vstmiaeq r1!, {s16-s31} \n" /* Store s16-s31. */
|
||||||
" vldmiaeq r2, {s0-s16} \n" /* Copy hardware saved FP context into s0-s16. */
|
" vldmiaeq r2, {s0-s16} \n" /* Copy hardware saved FP context into s0-s16. */
|
||||||
" vstmiaeq r1!, {s0-s16} \n" /* Store hardware saved FP context. */
|
" vstmiaeq r1!, {s0-s16} \n" /* Store hardware saved FP context. */
|
||||||
" sub r2, r2, #0x20 \n" /* Set r2 back to the location of hardware saved context. */
|
" sub r2, r2, #0x20 \n" /* Set r2 back to the location of hardware saved context. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" stmia r1!, {r4-r11} \n" /* Store r4-r11. */
|
" stmia r1!, {r4-r11} \n" /* Store r4-r11. */
|
||||||
" ldmia r2, {r4-r11} \n" /* Copy the hardware saved context into r4-r11. */
|
" ldmia r2, {r4-r11} \n" /* Copy the hardware saved context into r4-r11. */
|
||||||
" stmia r1!, {r4-r11} \n" /* Store the hardware saved context. */
|
" stmia r1!, {r4-r11} \n" /* Store the hardware saved context. */
|
||||||
|
@ -295,14 +295,14 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" mrs r3, psplim \n" /* r3 = PSPLIM. */
|
" mrs r3, psplim \n" /* r3 = PSPLIM. */
|
||||||
" mrs r4, control \n" /* r4 = CONTROL. */
|
" mrs r4, control \n" /* r4 = CONTROL. */
|
||||||
" stmia r1!, {r2-r4, lr} \n" /* Store original PSP (after hardware has saved context), PSPLIM, CONTROL and LR. */
|
" stmia r1!, {r2-r4, lr} \n" /* Store original PSP (after hardware has saved context), PSPLIM, CONTROL and LR. */
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" mrs r2, PAC_KEY_P_0 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
" mrs r2, PAC_KEY_P_0 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
||||||
" mrs r3, PAC_KEY_P_1 \n"
|
" mrs r3, PAC_KEY_P_1 \n"
|
||||||
" mrs r4, PAC_KEY_P_2 \n"
|
" mrs r4, PAC_KEY_P_2 \n"
|
||||||
" mrs r5, PAC_KEY_P_3 \n"
|
" mrs r5, PAC_KEY_P_3 \n"
|
||||||
" stmia r1!, {r2-r5} \n" /* Store the task's dedicated PAC key on the task's context. */
|
" stmia r1!, {r2-r5} \n" /* Store the task's dedicated PAC key on the task's context. */
|
||||||
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" str r1, [r0] \n" /* Save the location from where the context should be restored as the first member of TCB. */
|
" str r1, [r0] \n" /* Save the location from where the context should be restored as the first member of TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" select_next_task: \n"
|
" select_next_task: \n"
|
||||||
|
@ -338,16 +338,16 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configTOTAL_MPU_REGIONS == 16 )
|
#if ( configTOTAL_MPU_REGIONS == 16 )
|
||||||
" movs r3, #8 \n" /* r3 = 8. */
|
" movs r3, #8 \n" /* r3 = 8. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 8. */
|
" str r3, [r1] \n" /* Program RNR = 8. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" movs r3, #12 \n" /* r3 = 12. */
|
" movs r3, #12 \n" /* r3 = 12. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 12. */
|
" str r3, [r1] \n" /* Program RNR = 12. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
||||||
" \n"
|
" \n"
|
||||||
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
@ -361,14 +361,14 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldr r1, [r0] \n" /* r1 = Location of saved context in TCB. */
|
" ldr r1, [r0] \n" /* r1 = Location of saved context in TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_special_regs: \n"
|
" restore_special_regs: \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmdb r1!, {r2-r5} \n" /* Read task's dedicated PAC key from the task's context. */
|
" ldmdb r1!, {r2-r5} \n" /* Read task's dedicated PAC key from the task's context. */
|
||||||
" msr PAC_KEY_P_0, r2 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_0, r2 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_1, r3 \n"
|
" msr PAC_KEY_P_1, r3 \n"
|
||||||
" msr PAC_KEY_P_2, r4 \n"
|
" msr PAC_KEY_P_2, r4 \n"
|
||||||
" msr PAC_KEY_P_3, r5 \n"
|
" msr PAC_KEY_P_3, r5 \n"
|
||||||
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" ldmdb r1!, {r2-r4, lr} \n" /* r2 = original PSP, r3 = PSPLIM, r4 = CONTROL, LR restored. */
|
" ldmdb r1!, {r2-r4, lr} \n" /* r2 = original PSP, r3 = PSPLIM, r4 = CONTROL, LR restored. */
|
||||||
" msr psp, r2 \n"
|
" msr psp, r2 \n"
|
||||||
" msr psplim, r3 \n"
|
" msr psplim, r3 \n"
|
||||||
|
@ -378,13 +378,13 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldmdb r1!, {r4-r11} \n" /* r4-r11 contain hardware saved context. */
|
" ldmdb r1!, {r4-r11} \n" /* r4-r11 contain hardware saved context. */
|
||||||
" stmia r2!, {r4-r11} \n" /* Copy the hardware saved context on the task stack. */
|
" stmia r2!, {r4-r11} \n" /* Copy the hardware saved context on the task stack. */
|
||||||
" ldmdb r1!, {r4-r11} \n" /* r4-r11 restored. */
|
" ldmdb r1!, {r4-r11} \n" /* r4-r11 restored. */
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" tst lr, #0x10 \n"
|
" tst lr, #0x10 \n"
|
||||||
" ittt eq \n"
|
" ittt eq \n"
|
||||||
" vldmdbeq r1!, {s0-s16} \n" /* s0-s16 contain hardware saved FP context. */
|
" vldmdbeq r1!, {s0-s16} \n" /* s0-s16 contain hardware saved FP context. */
|
||||||
" vstmiaeq r2!, {s0-s16} \n" /* Copy hardware saved FP context on the task stack. */
|
" vstmiaeq r2!, {s0-s16} \n" /* Copy hardware saved FP context on the task stack. */
|
||||||
" vldmdbeq r1!, {s16-s31} \n" /* Restore s16-s31. */
|
" vldmdbeq r1!, {s16-s31} \n" /* Restore s16-s31. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_context_done: \n"
|
" restore_context_done: \n"
|
||||||
" str r1, [r0] \n" /* Save the location where the context should be saved next as the first member of TCB. */
|
" str r1, [r0] \n" /* Save the location where the context should be saved next as the first member of TCB. */
|
||||||
|
@ -403,24 +403,24 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" \n"
|
" \n"
|
||||||
" mrs r0, psp \n" /* Read PSP in r0. */
|
" mrs r0, psp \n" /* Read PSP in r0. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
||||||
" it eq \n"
|
" it eq \n"
|
||||||
" vstmdbeq r0!, {s16-s31} \n" /* Store the additional FP context registers which are not saved automatically. */
|
" vstmdbeq r0!, {s16-s31} \n" /* Store the additional FP context registers which are not saved automatically. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" \n"
|
" \n"
|
||||||
" mrs r2, psplim \n" /* r2 = PSPLIM. */
|
" mrs r2, psplim \n" /* r2 = PSPLIM. */
|
||||||
" mov r3, lr \n" /* r3 = LR/EXC_RETURN. */
|
" mov r3, lr \n" /* r3 = LR/EXC_RETURN. */
|
||||||
" stmdb r0!, {r2-r11} \n" /* Store on the stack - PSPLIM, LR and registers that are not automatically saved. */
|
" stmdb r0!, {r2-r11} \n" /* Store on the stack - PSPLIM, LR and registers that are not automatically saved. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" mrs r1, PAC_KEY_P_3 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
" mrs r1, PAC_KEY_P_3 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
||||||
" mrs r2, PAC_KEY_P_2 \n"
|
" mrs r2, PAC_KEY_P_2 \n"
|
||||||
" mrs r3, PAC_KEY_P_1 \n"
|
" mrs r3, PAC_KEY_P_1 \n"
|
||||||
" mrs r4, PAC_KEY_P_0 \n"
|
" mrs r4, PAC_KEY_P_0 \n"
|
||||||
" stmdb r0!, {r1-r4} \n" /* Store the task's dedicated PAC key on the stack. */
|
" stmdb r0!, {r1-r4} \n" /* Store the task's dedicated PAC key on the stack. */
|
||||||
" clrm {r1-r4} \n" /* Clear r1-r4. */
|
" clrm {r1-r4} \n" /* Clear r1-r4. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" \n"
|
" \n"
|
||||||
" ldr r2, =pxCurrentTCB \n" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
" ldr r2, =pxCurrentTCB \n" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
||||||
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
||||||
|
@ -438,22 +438,22 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
||||||
" ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */
|
" ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmia r0!, {r2-r5} \n" /* Read task's dedicated PAC key from stack. */
|
" ldmia r0!, {r2-r5} \n" /* Read task's dedicated PAC key from stack. */
|
||||||
" msr PAC_KEY_P_3, r2 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_3, r2 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_2, r3 \n"
|
" msr PAC_KEY_P_2, r3 \n"
|
||||||
" msr PAC_KEY_P_1, r4 \n"
|
" msr PAC_KEY_P_1, r4 \n"
|
||||||
" msr PAC_KEY_P_0, r5 \n"
|
" msr PAC_KEY_P_0, r5 \n"
|
||||||
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" \n"
|
" \n"
|
||||||
" ldmia r0!, {r2-r11} \n" /* Read from stack - r2 = PSPLIM, r3 = LR and r4-r11 restored. */
|
" ldmia r0!, {r2-r11} \n" /* Read from stack - r2 = PSPLIM, r3 = LR and r4-r11 restored. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" tst r3, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
" tst r3, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
||||||
" it eq \n"
|
" it eq \n"
|
||||||
" vldmiaeq r0!, {s16-s31} \n" /* Restore the additional FP context registers which are not restored automatically. */
|
" vldmiaeq r0!, {s16-s31} \n" /* Restore the additional FP context registers which are not restored automatically. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" \n"
|
" \n"
|
||||||
" msr psplim, r2 \n" /* Restore the PSPLIM register value for the task. */
|
" msr psplim, r2 \n" /* Restore the PSPLIM register value for the task. */
|
||||||
" msr psp, r0 \n" /* Remember the new top of stack for the task. */
|
" msr psp, r0 \n" /* Remember the new top of stack for the task. */
|
||||||
|
|
|
@ -60,7 +60,7 @@
|
||||||
|
|
||||||
#ifndef configENABLE_MVE
|
#ifndef configENABLE_MVE
|
||||||
#define configENABLE_MVE 0
|
#define configENABLE_MVE 0
|
||||||
#elif( configENABLE_MVE != 0 )
|
#elif ( configENABLE_MVE != 0 )
|
||||||
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M33.
|
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M33.
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
|
@ -243,54 +243,55 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
/*
|
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
/*
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
*
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
*
|
||||||
* 16 16 8 8 5 16 1
|
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
||||||
*/
|
* 16 16 8 8 5 16 1
|
||||||
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 70
|
#define MAX_CONTEXT_SIZE 70
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
||||||
* 16 16 8 8 5 1
|
* 16 16 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 54
|
#define MAX_CONTEXT_SIZE 54
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | | |
|
* | | | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
||||||
* 16 16 8 8 4 16 1
|
* 16 16 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 69
|
#define MAX_CONTEXT_SIZE 69
|
||||||
|
|
||||||
#else
|
#else /* if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | |
|
* | | | | PC, xPSR | EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><---->
|
* <-----------><--------------><---------><----------------><---------------------><---->
|
||||||
* 16 16 8 8 4 1
|
* 16 16 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 53
|
#define MAX_CONTEXT_SIZE 53
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
@ -299,54 +300,54 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><-----------><---->
|
* <---------><----------------><------------------------------><-----------><---->
|
||||||
* 8 8 5 16 1
|
* 8 8 5 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 38
|
#define MAX_CONTEXT_SIZE 38
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><---->
|
* <---------><----------------><------------------------------><---->
|
||||||
* 8 8 5 1
|
* 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 22
|
#define MAX_CONTEXT_SIZE 22
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | PC, xPSR | EXC_RETURN | | |
|
* | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><-----------><---->
|
* <---------><----------------><----------------------><-----------><---->
|
||||||
* 8 8 4 16 1
|
* 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 37
|
#define MAX_CONTEXT_SIZE 37
|
||||||
|
|
||||||
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | PC, xPSR | EXC_RETURN | |
|
* | | PC, xPSR | EXC_RETURN | |
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><---->
|
* <---------><----------------><----------------------><---->
|
||||||
* 8 8 4 1
|
* 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 21
|
#define MAX_CONTEXT_SIZE 21
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
|
@ -169,79 +169,80 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to manipulate the MPU.
|
* @brief Constants required to manipulate the MPU.
|
||||||
*/
|
*/
|
||||||
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
||||||
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
||||||
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
||||||
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
||||||
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
||||||
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
||||||
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
||||||
|
|
||||||
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
||||||
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
|
|
||||||
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
||||||
|
|
||||||
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
||||||
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
|
||||||
* region. */
|
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
||||||
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
* region. */
|
||||||
|
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
||||||
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
||||||
|
|
||||||
/* Enable privileged access to unmapped region. */
|
/* Enable privileged access to unmapped region. */
|
||||||
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
||||||
|
|
||||||
/* Enable MPU. */
|
/* Enable MPU. */
|
||||||
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
||||||
|
|
||||||
/* Expected value of the portMPU_TYPE register. */
|
/* Expected value of the portMPU_TYPE register. */
|
||||||
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
||||||
|
|
||||||
/* Extract first address of the MPU region as encoded in the
|
/* Extract first address of the MPU region as encoded in the
|
||||||
* RBAR (Region Base Address Register) value. */
|
* RBAR (Region Base Address Register) value. */
|
||||||
|
@ -380,14 +381,14 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to check and configure PACBTI security feature implementation.
|
* @brief Constants required to check and configure PACBTI security feature implementation.
|
||||||
*/
|
*/
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
||||||
|
|
||||||
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
||||||
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
||||||
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
||||||
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
||||||
|
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -409,7 +410,7 @@ static void prvTaskExitError( void );
|
||||||
* @return uint32_t Access permissions.
|
* @return uint32_t Access permissions.
|
||||||
*/
|
*/
|
||||||
static uint32_t prvGetRegionAccessPermissions( uint32_t ulRBARValue ) PRIVILEGED_FUNCTION;
|
static uint32_t prvGetRegionAccessPermissions( uint32_t ulRBARValue ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
|
||||||
|
@ -427,7 +428,7 @@ static void prvTaskExitError( void );
|
||||||
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_FPU */
|
#endif /* configENABLE_FPU */
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Configures PACBTI features.
|
* @brief Configures PACBTI features.
|
||||||
|
@ -890,7 +891,7 @@ static void prvTaskExitError( void )
|
||||||
return ulAccessPermissions;
|
return ulAccessPermissions;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
@ -1212,6 +1213,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __syscalls_flash_start__;
|
extern uint32_t * __syscalls_flash_start__;
|
||||||
|
@ -1282,6 +1284,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
||||||
* when we exit from the system call. */
|
* when we exit from the system call. */
|
||||||
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
||||||
|
|
||||||
/* Store the value of the PSPLIM register before the SVC was raised.
|
/* Store the value of the PSPLIM register before the SVC was raised.
|
||||||
* We need to restore it when we exit from the system call. */
|
* We need to restore it when we exit from the system call. */
|
||||||
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
||||||
|
@ -1300,6 +1303,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
|
|
||||||
/* Start executing the system call upon returning from this handler. */
|
/* Start executing the system call upon returning from this handler. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
||||||
|
|
||||||
/* Raise a request to exit from the system call upon finishing the
|
/* Raise a request to exit from the system call upon finishing the
|
||||||
* system call. */
|
* system call. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
||||||
|
@ -1359,6 +1363,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __privileged_functions_start__;
|
extern uint32_t * __privileged_functions_start__;
|
||||||
|
@ -1541,7 +1546,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
||||||
ulIndex++;
|
ulIndex++;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Check PACBTI security feature configuration before pushing the
|
/* Check PACBTI security feature configuration before pushing the
|
||||||
* CONTROL register's value on task's TCB. */
|
* CONTROL register's value on task's TCB. */
|
||||||
|
@ -1814,11 +1819,11 @@ BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
||||||
portNVIC_SHPR2_REG = 0;
|
portNVIC_SHPR2_REG = 0;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Set the CONTROL register value based on PACBTI security feature
|
/* Set the CONTROL register value based on PACBTI security feature
|
||||||
* configuration before starting the first task. */
|
* configuration before starting the first task. */
|
||||||
( void) prvConfigurePACBTI( pdTRUE );
|
( void ) prvConfigurePACBTI( pdTRUE );
|
||||||
}
|
}
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
|
|
||||||
|
@ -2018,9 +2023,9 @@ void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
if( xSchedulerRunning == pdFALSE )
|
if( xSchedulerRunning == pdFALSE )
|
||||||
{
|
{
|
||||||
/* Grant access to all the kernel objects before the scheduler
|
/* Grant access to all the kernel objects before the scheduler
|
||||||
* is started. It is necessary because there is no task running
|
* is started. It is necessary because there is no task running
|
||||||
* yet and therefore, we cannot use the permissions of any
|
* yet and therefore, we cannot use the permissions of any
|
||||||
* task. */
|
* task. */
|
||||||
xAccessGranted = pdTRUE;
|
xAccessGranted = pdTRUE;
|
||||||
}
|
}
|
||||||
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
||||||
|
@ -2241,7 +2246,7 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
||||||
{
|
{
|
||||||
|
@ -2253,13 +2258,13 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
/* Enable UsageFault exception. */
|
/* Enable UsageFault exception. */
|
||||||
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
||||||
|
|
||||||
#if( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if( configENABLE_BTI == 1 )
|
#if ( configENABLE_BTI == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,16 +77,16 @@
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configTOTAL_MPU_REGIONS == 16 )
|
#if ( configTOTAL_MPU_REGIONS == 16 )
|
||||||
" movs r3, #8 \n" /* r3 = 8. */
|
" movs r3, #8 \n" /* r3 = 8. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 8. */
|
" str r3, [r1] \n" /* Program RNR = 8. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" movs r3, #12 \n" /* r3 = 12. */
|
" movs r3, #12 \n" /* r3 = 12. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 12. */
|
" str r3, [r1] \n" /* Program RNR = 12. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
||||||
" \n"
|
" \n"
|
||||||
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
@ -100,14 +100,14 @@
|
||||||
" ldr r2, [r1] \n" /* r2 = Location of saved context in TCB. */
|
" ldr r2, [r1] \n" /* r2 = Location of saved context in TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_special_regs_first_task: \n"
|
" restore_special_regs_first_task: \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmdb r2!, {r3-r6} \n" /* Read task's dedicated PAC key from the task's context. */
|
" ldmdb r2!, {r3-r6} \n" /* Read task's dedicated PAC key from the task's context. */
|
||||||
" msr PAC_KEY_P_0, r3 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_0, r3 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_1, r4 \n"
|
" msr PAC_KEY_P_1, r4 \n"
|
||||||
" msr PAC_KEY_P_2, r5 \n"
|
" msr PAC_KEY_P_2, r5 \n"
|
||||||
" msr PAC_KEY_P_3, r6 \n"
|
" msr PAC_KEY_P_3, r6 \n"
|
||||||
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" ldmdb r2!, {r0, r3-r5, lr} \n" /* r0 = xSecureContext, r3 = original PSP, r4 = PSPLIM, r5 = CONTROL, LR restored. */
|
" ldmdb r2!, {r0, r3-r5, lr} \n" /* r0 = xSecureContext, r3 = original PSP, r4 = PSPLIM, r5 = CONTROL, LR restored. */
|
||||||
" msr psp, r3 \n"
|
" msr psp, r3 \n"
|
||||||
" msr psplim, r4 \n"
|
" msr psplim, r4 \n"
|
||||||
|
@ -140,14 +140,14 @@
|
||||||
" ldr r3, [r2] \n" /* Read pxCurrentTCB. */
|
" ldr r3, [r2] \n" /* Read pxCurrentTCB. */
|
||||||
" ldr r0, [r3] \n" /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
|
" ldr r0, [r3] \n" /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmia r0!, {r1-r4} \n" /* Read task's dedicated PAC key from stack. */
|
" ldmia r0!, {r1-r4} \n" /* Read task's dedicated PAC key from stack. */
|
||||||
" msr PAC_KEY_P_3, r1 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_3, r1 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_2, r2 \n"
|
" msr PAC_KEY_P_2, r2 \n"
|
||||||
" msr PAC_KEY_P_1, r3 \n"
|
" msr PAC_KEY_P_1, r3 \n"
|
||||||
" msr PAC_KEY_P_0, r4 \n"
|
" msr PAC_KEY_P_0, r4 \n"
|
||||||
" clrm {r1-r4} \n" /* Clear r1-r4. */
|
" clrm {r1-r4} \n" /* Clear r1-r4. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" \n"
|
" \n"
|
||||||
" ldm r0!, {r1-r3} \n" /* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */
|
" ldm r0!, {r1-r3} \n" /* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */
|
||||||
" ldr r4, =xSecureContext \n"
|
" ldr r4, =xSecureContext \n"
|
||||||
|
@ -297,15 +297,15 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" \n"
|
" \n"
|
||||||
" save_general_regs: \n"
|
" save_general_regs: \n"
|
||||||
" mrs r3, psp \n"
|
" mrs r3, psp \n"
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" add r3, r3, #0x20 \n" /* Move r3 to location where s0 is saved. */
|
" add r3, r3, #0x20 \n" /* Move r3 to location where s0 is saved. */
|
||||||
" tst lr, #0x10 \n"
|
" tst lr, #0x10 \n"
|
||||||
" ittt eq \n"
|
" ittt eq \n"
|
||||||
" vstmiaeq r2!, {s16-s31} \n" /* Store s16-s31. */
|
" vstmiaeq r2!, {s16-s31} \n" /* Store s16-s31. */
|
||||||
" vldmiaeq r3, {s0-s16} \n" /* Copy hardware saved FP context into s0-s16. */
|
" vldmiaeq r3, {s0-s16} \n" /* Copy hardware saved FP context into s0-s16. */
|
||||||
" vstmiaeq r2!, {s0-s16} \n" /* Store hardware saved FP context. */
|
" vstmiaeq r2!, {s0-s16} \n" /* Store hardware saved FP context. */
|
||||||
" sub r3, r3, #0x20 \n" /* Set r3 back to the location of hardware saved context. */
|
" sub r3, r3, #0x20 \n" /* Set r3 back to the location of hardware saved context. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" stmia r2!, {r4-r11} \n" /* Store r4-r11. */
|
" stmia r2!, {r4-r11} \n" /* Store r4-r11. */
|
||||||
" ldmia r3, {r4-r11} \n" /* Copy the hardware saved context into r4-r11. */
|
" ldmia r3, {r4-r11} \n" /* Copy the hardware saved context into r4-r11. */
|
||||||
" stmia r2!, {r4-r11} \n" /* Store the hardware saved context. */
|
" stmia r2!, {r4-r11} \n" /* Store the hardware saved context. */
|
||||||
|
@ -315,15 +315,15 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" mrs r4, psplim \n" /* r4 = PSPLIM. */
|
" mrs r4, psplim \n" /* r4 = PSPLIM. */
|
||||||
" mrs r5, control \n" /* r5 = CONTROL. */
|
" mrs r5, control \n" /* r5 = CONTROL. */
|
||||||
" stmia r2!, {r0, r3-r5, lr} \n" /* Store xSecureContext, original PSP (after hardware has saved context), PSPLIM, CONTROL and LR. */
|
" stmia r2!, {r0, r3-r5, lr} \n" /* Store xSecureContext, original PSP (after hardware has saved context), PSPLIM, CONTROL and LR. */
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" mrs r3, PAC_KEY_P_0 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
" mrs r3, PAC_KEY_P_0 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
||||||
" mrs r4, PAC_KEY_P_1 \n"
|
" mrs r4, PAC_KEY_P_1 \n"
|
||||||
" mrs r5, PAC_KEY_P_2 \n"
|
" mrs r5, PAC_KEY_P_2 \n"
|
||||||
" mrs r6, PAC_KEY_P_3 \n"
|
" mrs r6, PAC_KEY_P_3 \n"
|
||||||
" stmia r2!, {r3-r6} \n" /* Store the task's dedicated PAC key on the task's context. */
|
" stmia r2!, {r3-r6} \n" /* Store the task's dedicated PAC key on the task's context. */
|
||||||
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" str r2, [r1] \n" /* Save the location from where the context should be restored as the first member of TCB. */
|
" str r2, [r1] \n" /* Save the location from where the context should be restored as the first member of TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" select_next_task: \n"
|
" select_next_task: \n"
|
||||||
" mov r0, %0 \n" /* r0 = configMAX_SYSCALL_INTERRUPT_PRIORITY */
|
" mov r0, %0 \n" /* r0 = configMAX_SYSCALL_INTERRUPT_PRIORITY */
|
||||||
|
@ -358,16 +358,16 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configTOTAL_MPU_REGIONS == 16 )
|
#if ( configTOTAL_MPU_REGIONS == 16 )
|
||||||
" movs r3, #8 \n" /* r3 = 8. */
|
" movs r3, #8 \n" /* r3 = 8. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 8. */
|
" str r3, [r1] \n" /* Program RNR = 8. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" movs r3, #12 \n" /* r3 = 12. */
|
" movs r3, #12 \n" /* r3 = 12. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 12. */
|
" str r3, [r1] \n" /* Program RNR = 12. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
||||||
" \n"
|
" \n"
|
||||||
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
@ -381,14 +381,14 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldr r2, [r1] \n" /* r2 = Location of saved context in TCB. */
|
" ldr r2, [r1] \n" /* r2 = Location of saved context in TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_special_regs: \n"
|
" restore_special_regs: \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmdb r2!, {r3-r6} \n" /* Read task's dedicated PAC key from the task's context. */
|
" ldmdb r2!, {r3-r6} \n" /* Read task's dedicated PAC key from the task's context. */
|
||||||
" msr PAC_KEY_P_0, r3 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_0, r3 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_1, r4 \n"
|
" msr PAC_KEY_P_1, r4 \n"
|
||||||
" msr PAC_KEY_P_2, r5 \n"
|
" msr PAC_KEY_P_2, r5 \n"
|
||||||
" msr PAC_KEY_P_3, r6 \n"
|
" msr PAC_KEY_P_3, r6 \n"
|
||||||
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" ldmdb r2!, {r0, r3-r5, lr} \n" /* r0 = xSecureContext, r3 = original PSP, r4 = PSPLIM, r5 = CONTROL, LR restored. */
|
" ldmdb r2!, {r0, r3-r5, lr} \n" /* r0 = xSecureContext, r3 = original PSP, r4 = PSPLIM, r5 = CONTROL, LR restored. */
|
||||||
" msr psp, r3 \n"
|
" msr psp, r3 \n"
|
||||||
" msr psplim, r4 \n"
|
" msr psplim, r4 \n"
|
||||||
|
@ -411,13 +411,13 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldmdb r2!, {r4-r11} \n" /* r4-r11 contain hardware saved context. */
|
" ldmdb r2!, {r4-r11} \n" /* r4-r11 contain hardware saved context. */
|
||||||
" stmia r3!, {r4-r11} \n" /* Copy the hardware saved context on the task stack. */
|
" stmia r3!, {r4-r11} \n" /* Copy the hardware saved context on the task stack. */
|
||||||
" ldmdb r2!, {r4-r11} \n" /* r4-r11 restored. */
|
" ldmdb r2!, {r4-r11} \n" /* r4-r11 restored. */
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" tst lr, #0x10 \n"
|
" tst lr, #0x10 \n"
|
||||||
" ittt eq \n"
|
" ittt eq \n"
|
||||||
" vldmdbeq r2!, {s0-s16} \n" /* s0-s16 contain hardware saved FP context. */
|
" vldmdbeq r2!, {s0-s16} \n" /* s0-s16 contain hardware saved FP context. */
|
||||||
" vstmiaeq r3!, {s0-s16} \n" /* Copy hardware saved FP context on the task stack. */
|
" vstmiaeq r3!, {s0-s16} \n" /* Copy hardware saved FP context on the task stack. */
|
||||||
" vldmdbeq r2!, {s16-s31} \n" /* Restore s16-s31. */
|
" vldmdbeq r2!, {s16-s31} \n" /* Restore s16-s31. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_context_done: \n"
|
" restore_context_done: \n"
|
||||||
" str r2, [r1] \n" /* Save the location where the context should be saved next as the first member of TCB. */
|
" str r2, [r1] \n" /* Save the location where the context should be saved next as the first member of TCB. */
|
||||||
|
@ -454,24 +454,24 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" bmi save_special_regs \n" /* If r3 < 0 ==> Bit[6] in EXC_RETURN is 1 ==> secure stack was used. */
|
" bmi save_special_regs \n" /* If r3 < 0 ==> Bit[6] in EXC_RETURN is 1 ==> secure stack was used. */
|
||||||
" \n"
|
" \n"
|
||||||
" save_general_regs: \n"
|
" save_general_regs: \n"
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
||||||
" it eq \n"
|
" it eq \n"
|
||||||
" vstmdbeq r2!, {s16-s31} \n" /* Store the additional FP context registers which are not saved automatically. */
|
" vstmdbeq r2!, {s16-s31} \n" /* Store the additional FP context registers which are not saved automatically. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" stmdb r2!, {r4-r11} \n" /* Store the registers that are not saved automatically. */
|
" stmdb r2!, {r4-r11} \n" /* Store the registers that are not saved automatically. */
|
||||||
" \n"
|
" \n"
|
||||||
" save_special_regs: \n"
|
" save_special_regs: \n"
|
||||||
" mrs r3, psplim \n" /* r3 = PSPLIM. */
|
" mrs r3, psplim \n" /* r3 = PSPLIM. */
|
||||||
" stmdb r2!, {r0, r3, lr} \n" /* Store xSecureContext, PSPLIM and LR on the stack. */
|
" stmdb r2!, {r0, r3, lr} \n" /* Store xSecureContext, PSPLIM and LR on the stack. */
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" mrs r3, PAC_KEY_P_3 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
" mrs r3, PAC_KEY_P_3 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
||||||
" mrs r4, PAC_KEY_P_2 \n"
|
" mrs r4, PAC_KEY_P_2 \n"
|
||||||
" mrs r5, PAC_KEY_P_1 \n"
|
" mrs r5, PAC_KEY_P_1 \n"
|
||||||
" mrs r6, PAC_KEY_P_0 \n"
|
" mrs r6, PAC_KEY_P_0 \n"
|
||||||
" stmdb r2!, {r3-r6} \n" /* Store the task's dedicated PAC key on the stack. */
|
" stmdb r2!, {r3-r6} \n" /* Store the task's dedicated PAC key on the stack. */
|
||||||
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" \n"
|
" \n"
|
||||||
" str r2, [r1] \n" /* Save the new top of stack in TCB. */
|
" str r2, [r1] \n" /* Save the new top of stack in TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
|
@ -490,14 +490,14 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldr r2, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. r2 now points to the top of stack. */
|
" ldr r2, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. r2 now points to the top of stack. */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_special_regs: \n"
|
" restore_special_regs: \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmia r2!, {r3-r6} \n" /* Read task's dedicated PAC key from stack. */
|
" ldmia r2!, {r3-r6} \n" /* Read task's dedicated PAC key from stack. */
|
||||||
" msr PAC_KEY_P_3, r3 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_3, r3 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_2, r4 \n"
|
" msr PAC_KEY_P_2, r4 \n"
|
||||||
" msr PAC_KEY_P_1, r5 \n"
|
" msr PAC_KEY_P_1, r5 \n"
|
||||||
" msr PAC_KEY_P_0, r6 \n"
|
" msr PAC_KEY_P_0, r6 \n"
|
||||||
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" ldmia r2!, {r0, r3, lr} \n" /* Read from stack - r0 = xSecureContext, r3 = PSPLIM and LR restored. */
|
" ldmia r2!, {r0, r3, lr} \n" /* Read from stack - r0 = xSecureContext, r3 = PSPLIM and LR restored. */
|
||||||
" msr psplim, r3 \n" /* Restore the PSPLIM register value for the task. */
|
" msr psplim, r3 \n" /* Restore the PSPLIM register value for the task. */
|
||||||
" ldr r3, =xSecureContext \n" /* Read the location of xSecureContext i.e. &( xSecureContext ). */
|
" ldr r3, =xSecureContext \n" /* Read the location of xSecureContext i.e. &( xSecureContext ). */
|
||||||
|
@ -516,11 +516,11 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" \n"
|
" \n"
|
||||||
" restore_general_regs: \n"
|
" restore_general_regs: \n"
|
||||||
" ldmia r2!, {r4-r11} \n" /* Restore the registers that are not automatically restored. */
|
" ldmia r2!, {r4-r11} \n" /* Restore the registers that are not automatically restored. */
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
||||||
" it eq \n"
|
" it eq \n"
|
||||||
" vldmiaeq r2!, {s16-s31} \n" /* Restore the additional FP context registers which are not restored automatically. */
|
" vldmiaeq r2!, {s16-s31} \n" /* Restore the additional FP context registers which are not restored automatically. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_context_done: \n"
|
" restore_context_done: \n"
|
||||||
" msr psp, r2 \n" /* Remember the new top of stack for the task. */
|
" msr psp, r2 \n" /* Remember the new top of stack for the task. */
|
||||||
|
|
|
@ -60,7 +60,7 @@
|
||||||
|
|
||||||
#ifndef configENABLE_MVE
|
#ifndef configENABLE_MVE
|
||||||
#define configENABLE_MVE 0
|
#define configENABLE_MVE 0
|
||||||
#elif( configENABLE_MVE != 0 )
|
#elif ( configENABLE_MVE != 0 )
|
||||||
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M35.
|
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M35.
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
|
@ -243,54 +243,55 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
/*
|
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
/*
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
*
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
*
|
||||||
* 16 16 8 8 5 16 1
|
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
||||||
*/
|
* 16 16 8 8 5 16 1
|
||||||
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 70
|
#define MAX_CONTEXT_SIZE 70
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
||||||
* 16 16 8 8 5 1
|
* 16 16 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 54
|
#define MAX_CONTEXT_SIZE 54
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | | |
|
* | | | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
||||||
* 16 16 8 8 4 16 1
|
* 16 16 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 69
|
#define MAX_CONTEXT_SIZE 69
|
||||||
|
|
||||||
#else
|
#else /* if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | |
|
* | | | | PC, xPSR | EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><---->
|
* <-----------><--------------><---------><----------------><---------------------><---->
|
||||||
* 16 16 8 8 4 1
|
* 16 16 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 53
|
#define MAX_CONTEXT_SIZE 53
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
@ -299,54 +300,54 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><-----------><---->
|
* <---------><----------------><------------------------------><-----------><---->
|
||||||
* 8 8 5 16 1
|
* 8 8 5 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 38
|
#define MAX_CONTEXT_SIZE 38
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><---->
|
* <---------><----------------><------------------------------><---->
|
||||||
* 8 8 5 1
|
* 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 22
|
#define MAX_CONTEXT_SIZE 22
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | PC, xPSR | EXC_RETURN | | |
|
* | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><-----------><---->
|
* <---------><----------------><----------------------><-----------><---->
|
||||||
* 8 8 4 16 1
|
* 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 37
|
#define MAX_CONTEXT_SIZE 37
|
||||||
|
|
||||||
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | PC, xPSR | EXC_RETURN | |
|
* | | PC, xPSR | EXC_RETURN | |
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><---->
|
* <---------><----------------><----------------------><---->
|
||||||
* 8 8 4 1
|
* 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 21
|
#define MAX_CONTEXT_SIZE 21
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
|
@ -169,79 +169,80 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to manipulate the MPU.
|
* @brief Constants required to manipulate the MPU.
|
||||||
*/
|
*/
|
||||||
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
||||||
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
||||||
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
||||||
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
||||||
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
||||||
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
||||||
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
||||||
|
|
||||||
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
||||||
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
|
|
||||||
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
||||||
|
|
||||||
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
||||||
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
|
||||||
* region. */
|
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
||||||
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
* region. */
|
||||||
|
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
||||||
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
||||||
|
|
||||||
/* Enable privileged access to unmapped region. */
|
/* Enable privileged access to unmapped region. */
|
||||||
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
||||||
|
|
||||||
/* Enable MPU. */
|
/* Enable MPU. */
|
||||||
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
||||||
|
|
||||||
/* Expected value of the portMPU_TYPE register. */
|
/* Expected value of the portMPU_TYPE register. */
|
||||||
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
||||||
|
|
||||||
/* Extract first address of the MPU region as encoded in the
|
/* Extract first address of the MPU region as encoded in the
|
||||||
* RBAR (Region Base Address Register) value. */
|
* RBAR (Region Base Address Register) value. */
|
||||||
|
@ -380,14 +381,14 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to check and configure PACBTI security feature implementation.
|
* @brief Constants required to check and configure PACBTI security feature implementation.
|
||||||
*/
|
*/
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
||||||
|
|
||||||
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
||||||
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
||||||
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
||||||
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
||||||
|
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -409,7 +410,7 @@ static void prvTaskExitError( void );
|
||||||
* @return uint32_t Access permissions.
|
* @return uint32_t Access permissions.
|
||||||
*/
|
*/
|
||||||
static uint32_t prvGetRegionAccessPermissions( uint32_t ulRBARValue ) PRIVILEGED_FUNCTION;
|
static uint32_t prvGetRegionAccessPermissions( uint32_t ulRBARValue ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
|
||||||
|
@ -427,7 +428,7 @@ static void prvTaskExitError( void );
|
||||||
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_FPU */
|
#endif /* configENABLE_FPU */
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Configures PACBTI features.
|
* @brief Configures PACBTI features.
|
||||||
|
@ -890,7 +891,7 @@ static void prvTaskExitError( void )
|
||||||
return ulAccessPermissions;
|
return ulAccessPermissions;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
@ -1212,6 +1213,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __syscalls_flash_start__;
|
extern uint32_t * __syscalls_flash_start__;
|
||||||
|
@ -1282,6 +1284,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
||||||
* when we exit from the system call. */
|
* when we exit from the system call. */
|
||||||
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
||||||
|
|
||||||
/* Store the value of the PSPLIM register before the SVC was raised.
|
/* Store the value of the PSPLIM register before the SVC was raised.
|
||||||
* We need to restore it when we exit from the system call. */
|
* We need to restore it when we exit from the system call. */
|
||||||
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
||||||
|
@ -1300,6 +1303,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
|
|
||||||
/* Start executing the system call upon returning from this handler. */
|
/* Start executing the system call upon returning from this handler. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
||||||
|
|
||||||
/* Raise a request to exit from the system call upon finishing the
|
/* Raise a request to exit from the system call upon finishing the
|
||||||
* system call. */
|
* system call. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
||||||
|
@ -1359,6 +1363,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __privileged_functions_start__;
|
extern uint32_t * __privileged_functions_start__;
|
||||||
|
@ -1541,7 +1546,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
||||||
ulIndex++;
|
ulIndex++;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Check PACBTI security feature configuration before pushing the
|
/* Check PACBTI security feature configuration before pushing the
|
||||||
* CONTROL register's value on task's TCB. */
|
* CONTROL register's value on task's TCB. */
|
||||||
|
@ -1814,11 +1819,11 @@ BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
||||||
portNVIC_SHPR2_REG = 0;
|
portNVIC_SHPR2_REG = 0;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Set the CONTROL register value based on PACBTI security feature
|
/* Set the CONTROL register value based on PACBTI security feature
|
||||||
* configuration before starting the first task. */
|
* configuration before starting the first task. */
|
||||||
( void) prvConfigurePACBTI( pdTRUE );
|
( void ) prvConfigurePACBTI( pdTRUE );
|
||||||
}
|
}
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
|
|
||||||
|
@ -2018,9 +2023,9 @@ void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
if( xSchedulerRunning == pdFALSE )
|
if( xSchedulerRunning == pdFALSE )
|
||||||
{
|
{
|
||||||
/* Grant access to all the kernel objects before the scheduler
|
/* Grant access to all the kernel objects before the scheduler
|
||||||
* is started. It is necessary because there is no task running
|
* is started. It is necessary because there is no task running
|
||||||
* yet and therefore, we cannot use the permissions of any
|
* yet and therefore, we cannot use the permissions of any
|
||||||
* task. */
|
* task. */
|
||||||
xAccessGranted = pdTRUE;
|
xAccessGranted = pdTRUE;
|
||||||
}
|
}
|
||||||
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
||||||
|
@ -2241,7 +2246,7 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
||||||
{
|
{
|
||||||
|
@ -2253,13 +2258,13 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
/* Enable UsageFault exception. */
|
/* Enable UsageFault exception. */
|
||||||
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
||||||
|
|
||||||
#if( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if( configENABLE_BTI == 1 )
|
#if ( configENABLE_BTI == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,16 +77,16 @@
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configTOTAL_MPU_REGIONS == 16 )
|
#if ( configTOTAL_MPU_REGIONS == 16 )
|
||||||
" movs r3, #8 \n" /* r3 = 8. */
|
" movs r3, #8 \n" /* r3 = 8. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 8. */
|
" str r3, [r1] \n" /* Program RNR = 8. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" movs r3, #12 \n" /* r3 = 12. */
|
" movs r3, #12 \n" /* r3 = 12. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 12. */
|
" str r3, [r1] \n" /* Program RNR = 12. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
||||||
" \n"
|
" \n"
|
||||||
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
@ -100,14 +100,14 @@
|
||||||
" ldr r1, [r0] \n" /* r1 = Location of saved context in TCB. */
|
" ldr r1, [r0] \n" /* r1 = Location of saved context in TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_special_regs_first_task: \n"
|
" restore_special_regs_first_task: \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmdb r1!, {r2-r5} \n" /* Read task's dedicated PAC key from the task's context. */
|
" ldmdb r1!, {r2-r5} \n" /* Read task's dedicated PAC key from the task's context. */
|
||||||
" msr PAC_KEY_P_0, r2 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_0, r2 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_1, r3 \n"
|
" msr PAC_KEY_P_1, r3 \n"
|
||||||
" msr PAC_KEY_P_2, r4 \n"
|
" msr PAC_KEY_P_2, r4 \n"
|
||||||
" msr PAC_KEY_P_3, r5 \n"
|
" msr PAC_KEY_P_3, r5 \n"
|
||||||
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" ldmdb r1!, {r2-r4, lr} \n" /* r2 = original PSP, r3 = PSPLIM, r4 = CONTROL, LR restored. */
|
" ldmdb r1!, {r2-r4, lr} \n" /* r2 = original PSP, r3 = PSPLIM, r4 = CONTROL, LR restored. */
|
||||||
" msr psp, r2 \n"
|
" msr psp, r2 \n"
|
||||||
" msr psplim, r3 \n"
|
" msr psplim, r3 \n"
|
||||||
|
@ -138,14 +138,14 @@
|
||||||
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
||||||
" ldr r0, [r1] \n" /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
|
" ldr r0, [r1] \n" /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmia r0!, {r1-r4} \n" /* Read task's dedicated PAC key from stack. */
|
" ldmia r0!, {r1-r4} \n" /* Read task's dedicated PAC key from stack. */
|
||||||
" msr PAC_KEY_P_3, r1 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_3, r1 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_2, r2 \n"
|
" msr PAC_KEY_P_2, r2 \n"
|
||||||
" msr PAC_KEY_P_1, r3 \n"
|
" msr PAC_KEY_P_1, r3 \n"
|
||||||
" msr PAC_KEY_P_0, r4 \n"
|
" msr PAC_KEY_P_0, r4 \n"
|
||||||
" clrm {r1-r4} \n" /* Clear r1-r4. */
|
" clrm {r1-r4} \n" /* Clear r1-r4. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" \n"
|
" \n"
|
||||||
" ldm r0!, {r1-r2} \n" /* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */
|
" ldm r0!, {r1-r2} \n" /* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */
|
||||||
" msr psplim, r1 \n" /* Set this task's PSPLIM value. */
|
" msr psplim, r1 \n" /* Set this task's PSPLIM value. */
|
||||||
|
@ -278,15 +278,15 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" mrs r2, psp \n" /* r2 = PSP. */
|
" mrs r2, psp \n" /* r2 = PSP. */
|
||||||
" \n"
|
" \n"
|
||||||
" save_general_regs: \n"
|
" save_general_regs: \n"
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" add r2, r2, #0x20 \n" /* Move r2 to location where s0 is saved. */
|
" add r2, r2, #0x20 \n" /* Move r2 to location where s0 is saved. */
|
||||||
" tst lr, #0x10 \n"
|
" tst lr, #0x10 \n"
|
||||||
" ittt eq \n"
|
" ittt eq \n"
|
||||||
" vstmiaeq r1!, {s16-s31} \n" /* Store s16-s31. */
|
" vstmiaeq r1!, {s16-s31} \n" /* Store s16-s31. */
|
||||||
" vldmiaeq r2, {s0-s16} \n" /* Copy hardware saved FP context into s0-s16. */
|
" vldmiaeq r2, {s0-s16} \n" /* Copy hardware saved FP context into s0-s16. */
|
||||||
" vstmiaeq r1!, {s0-s16} \n" /* Store hardware saved FP context. */
|
" vstmiaeq r1!, {s0-s16} \n" /* Store hardware saved FP context. */
|
||||||
" sub r2, r2, #0x20 \n" /* Set r2 back to the location of hardware saved context. */
|
" sub r2, r2, #0x20 \n" /* Set r2 back to the location of hardware saved context. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" stmia r1!, {r4-r11} \n" /* Store r4-r11. */
|
" stmia r1!, {r4-r11} \n" /* Store r4-r11. */
|
||||||
" ldmia r2, {r4-r11} \n" /* Copy the hardware saved context into r4-r11. */
|
" ldmia r2, {r4-r11} \n" /* Copy the hardware saved context into r4-r11. */
|
||||||
" stmia r1!, {r4-r11} \n" /* Store the hardware saved context. */
|
" stmia r1!, {r4-r11} \n" /* Store the hardware saved context. */
|
||||||
|
@ -295,14 +295,14 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" mrs r3, psplim \n" /* r3 = PSPLIM. */
|
" mrs r3, psplim \n" /* r3 = PSPLIM. */
|
||||||
" mrs r4, control \n" /* r4 = CONTROL. */
|
" mrs r4, control \n" /* r4 = CONTROL. */
|
||||||
" stmia r1!, {r2-r4, lr} \n" /* Store original PSP (after hardware has saved context), PSPLIM, CONTROL and LR. */
|
" stmia r1!, {r2-r4, lr} \n" /* Store original PSP (after hardware has saved context), PSPLIM, CONTROL and LR. */
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" mrs r2, PAC_KEY_P_0 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
" mrs r2, PAC_KEY_P_0 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
||||||
" mrs r3, PAC_KEY_P_1 \n"
|
" mrs r3, PAC_KEY_P_1 \n"
|
||||||
" mrs r4, PAC_KEY_P_2 \n"
|
" mrs r4, PAC_KEY_P_2 \n"
|
||||||
" mrs r5, PAC_KEY_P_3 \n"
|
" mrs r5, PAC_KEY_P_3 \n"
|
||||||
" stmia r1!, {r2-r5} \n" /* Store the task's dedicated PAC key on the task's context. */
|
" stmia r1!, {r2-r5} \n" /* Store the task's dedicated PAC key on the task's context. */
|
||||||
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" str r1, [r0] \n" /* Save the location from where the context should be restored as the first member of TCB. */
|
" str r1, [r0] \n" /* Save the location from where the context should be restored as the first member of TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" select_next_task: \n"
|
" select_next_task: \n"
|
||||||
|
@ -338,16 +338,16 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configTOTAL_MPU_REGIONS == 16 )
|
#if ( configTOTAL_MPU_REGIONS == 16 )
|
||||||
" movs r3, #8 \n" /* r3 = 8. */
|
" movs r3, #8 \n" /* r3 = 8. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 8. */
|
" str r3, [r1] \n" /* Program RNR = 8. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" movs r3, #12 \n" /* r3 = 12. */
|
" movs r3, #12 \n" /* r3 = 12. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 12. */
|
" str r3, [r1] \n" /* Program RNR = 12. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
||||||
" \n"
|
" \n"
|
||||||
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
@ -361,14 +361,14 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldr r1, [r0] \n" /* r1 = Location of saved context in TCB. */
|
" ldr r1, [r0] \n" /* r1 = Location of saved context in TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_special_regs: \n"
|
" restore_special_regs: \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmdb r1!, {r2-r5} \n" /* Read task's dedicated PAC key from the task's context. */
|
" ldmdb r1!, {r2-r5} \n" /* Read task's dedicated PAC key from the task's context. */
|
||||||
" msr PAC_KEY_P_0, r2 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_0, r2 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_1, r3 \n"
|
" msr PAC_KEY_P_1, r3 \n"
|
||||||
" msr PAC_KEY_P_2, r4 \n"
|
" msr PAC_KEY_P_2, r4 \n"
|
||||||
" msr PAC_KEY_P_3, r5 \n"
|
" msr PAC_KEY_P_3, r5 \n"
|
||||||
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" ldmdb r1!, {r2-r4, lr} \n" /* r2 = original PSP, r3 = PSPLIM, r4 = CONTROL, LR restored. */
|
" ldmdb r1!, {r2-r4, lr} \n" /* r2 = original PSP, r3 = PSPLIM, r4 = CONTROL, LR restored. */
|
||||||
" msr psp, r2 \n"
|
" msr psp, r2 \n"
|
||||||
" msr psplim, r3 \n"
|
" msr psplim, r3 \n"
|
||||||
|
@ -378,13 +378,13 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldmdb r1!, {r4-r11} \n" /* r4-r11 contain hardware saved context. */
|
" ldmdb r1!, {r4-r11} \n" /* r4-r11 contain hardware saved context. */
|
||||||
" stmia r2!, {r4-r11} \n" /* Copy the hardware saved context on the task stack. */
|
" stmia r2!, {r4-r11} \n" /* Copy the hardware saved context on the task stack. */
|
||||||
" ldmdb r1!, {r4-r11} \n" /* r4-r11 restored. */
|
" ldmdb r1!, {r4-r11} \n" /* r4-r11 restored. */
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" tst lr, #0x10 \n"
|
" tst lr, #0x10 \n"
|
||||||
" ittt eq \n"
|
" ittt eq \n"
|
||||||
" vldmdbeq r1!, {s0-s16} \n" /* s0-s16 contain hardware saved FP context. */
|
" vldmdbeq r1!, {s0-s16} \n" /* s0-s16 contain hardware saved FP context. */
|
||||||
" vstmiaeq r2!, {s0-s16} \n" /* Copy hardware saved FP context on the task stack. */
|
" vstmiaeq r2!, {s0-s16} \n" /* Copy hardware saved FP context on the task stack. */
|
||||||
" vldmdbeq r1!, {s16-s31} \n" /* Restore s16-s31. */
|
" vldmdbeq r1!, {s16-s31} \n" /* Restore s16-s31. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_context_done: \n"
|
" restore_context_done: \n"
|
||||||
" str r1, [r0] \n" /* Save the location where the context should be saved next as the first member of TCB. */
|
" str r1, [r0] \n" /* Save the location where the context should be saved next as the first member of TCB. */
|
||||||
|
@ -403,24 +403,24 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" \n"
|
" \n"
|
||||||
" mrs r0, psp \n" /* Read PSP in r0. */
|
" mrs r0, psp \n" /* Read PSP in r0. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
||||||
" it eq \n"
|
" it eq \n"
|
||||||
" vstmdbeq r0!, {s16-s31} \n" /* Store the additional FP context registers which are not saved automatically. */
|
" vstmdbeq r0!, {s16-s31} \n" /* Store the additional FP context registers which are not saved automatically. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" \n"
|
" \n"
|
||||||
" mrs r2, psplim \n" /* r2 = PSPLIM. */
|
" mrs r2, psplim \n" /* r2 = PSPLIM. */
|
||||||
" mov r3, lr \n" /* r3 = LR/EXC_RETURN. */
|
" mov r3, lr \n" /* r3 = LR/EXC_RETURN. */
|
||||||
" stmdb r0!, {r2-r11} \n" /* Store on the stack - PSPLIM, LR and registers that are not automatically saved. */
|
" stmdb r0!, {r2-r11} \n" /* Store on the stack - PSPLIM, LR and registers that are not automatically saved. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" mrs r1, PAC_KEY_P_3 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
" mrs r1, PAC_KEY_P_3 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
||||||
" mrs r2, PAC_KEY_P_2 \n"
|
" mrs r2, PAC_KEY_P_2 \n"
|
||||||
" mrs r3, PAC_KEY_P_1 \n"
|
" mrs r3, PAC_KEY_P_1 \n"
|
||||||
" mrs r4, PAC_KEY_P_0 \n"
|
" mrs r4, PAC_KEY_P_0 \n"
|
||||||
" stmdb r0!, {r1-r4} \n" /* Store the task's dedicated PAC key on the stack. */
|
" stmdb r0!, {r1-r4} \n" /* Store the task's dedicated PAC key on the stack. */
|
||||||
" clrm {r1-r4} \n" /* Clear r1-r4. */
|
" clrm {r1-r4} \n" /* Clear r1-r4. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" \n"
|
" \n"
|
||||||
" ldr r2, =pxCurrentTCB \n" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
" ldr r2, =pxCurrentTCB \n" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
||||||
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
||||||
|
@ -438,22 +438,22 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
||||||
" ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */
|
" ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmia r0!, {r2-r5} \n" /* Read task's dedicated PAC key from stack. */
|
" ldmia r0!, {r2-r5} \n" /* Read task's dedicated PAC key from stack. */
|
||||||
" msr PAC_KEY_P_3, r2 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_3, r2 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_2, r3 \n"
|
" msr PAC_KEY_P_2, r3 \n"
|
||||||
" msr PAC_KEY_P_1, r4 \n"
|
" msr PAC_KEY_P_1, r4 \n"
|
||||||
" msr PAC_KEY_P_0, r5 \n"
|
" msr PAC_KEY_P_0, r5 \n"
|
||||||
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" \n"
|
" \n"
|
||||||
" ldmia r0!, {r2-r11} \n" /* Read from stack - r2 = PSPLIM, r3 = LR and r4-r11 restored. */
|
" ldmia r0!, {r2-r11} \n" /* Read from stack - r2 = PSPLIM, r3 = LR and r4-r11 restored. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" tst r3, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
" tst r3, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
||||||
" it eq \n"
|
" it eq \n"
|
||||||
" vldmiaeq r0!, {s16-s31} \n" /* Restore the additional FP context registers which are not restored automatically. */
|
" vldmiaeq r0!, {s16-s31} \n" /* Restore the additional FP context registers which are not restored automatically. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" \n"
|
" \n"
|
||||||
" msr psplim, r2 \n" /* Restore the PSPLIM register value for the task. */
|
" msr psplim, r2 \n" /* Restore the PSPLIM register value for the task. */
|
||||||
" msr psp, r0 \n" /* Remember the new top of stack for the task. */
|
" msr psp, r0 \n" /* Remember the new top of stack for the task. */
|
||||||
|
|
|
@ -60,7 +60,7 @@
|
||||||
|
|
||||||
#ifndef configENABLE_MVE
|
#ifndef configENABLE_MVE
|
||||||
#define configENABLE_MVE 0
|
#define configENABLE_MVE 0
|
||||||
#elif( configENABLE_MVE != 0 )
|
#elif ( configENABLE_MVE != 0 )
|
||||||
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M35.
|
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M35.
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
|
@ -243,54 +243,55 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
/*
|
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
/*
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
*
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
*
|
||||||
* 16 16 8 8 5 16 1
|
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
||||||
*/
|
* 16 16 8 8 5 16 1
|
||||||
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 70
|
#define MAX_CONTEXT_SIZE 70
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
||||||
* 16 16 8 8 5 1
|
* 16 16 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 54
|
#define MAX_CONTEXT_SIZE 54
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | | |
|
* | | | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
||||||
* 16 16 8 8 4 16 1
|
* 16 16 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 69
|
#define MAX_CONTEXT_SIZE 69
|
||||||
|
|
||||||
#else
|
#else /* if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | |
|
* | | | | PC, xPSR | EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><---->
|
* <-----------><--------------><---------><----------------><---------------------><---->
|
||||||
* 16 16 8 8 4 1
|
* 16 16 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 53
|
#define MAX_CONTEXT_SIZE 53
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
@ -299,54 +300,54 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><-----------><---->
|
* <---------><----------------><------------------------------><-----------><---->
|
||||||
* 8 8 5 16 1
|
* 8 8 5 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 38
|
#define MAX_CONTEXT_SIZE 38
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><---->
|
* <---------><----------------><------------------------------><---->
|
||||||
* 8 8 5 1
|
* 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 22
|
#define MAX_CONTEXT_SIZE 22
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | PC, xPSR | EXC_RETURN | | |
|
* | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><-----------><---->
|
* <---------><----------------><----------------------><-----------><---->
|
||||||
* 8 8 4 16 1
|
* 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 37
|
#define MAX_CONTEXT_SIZE 37
|
||||||
|
|
||||||
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | PC, xPSR | EXC_RETURN | |
|
* | | PC, xPSR | EXC_RETURN | |
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><---->
|
* <---------><----------------><----------------------><---->
|
||||||
* 8 8 4 1
|
* 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 21
|
#define MAX_CONTEXT_SIZE 21
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
|
@ -169,79 +169,80 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to manipulate the MPU.
|
* @brief Constants required to manipulate the MPU.
|
||||||
*/
|
*/
|
||||||
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
||||||
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
||||||
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
||||||
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
||||||
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
||||||
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
||||||
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
||||||
|
|
||||||
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
||||||
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
|
|
||||||
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
||||||
|
|
||||||
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
||||||
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
|
||||||
* region. */
|
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
||||||
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
* region. */
|
||||||
|
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
||||||
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
||||||
|
|
||||||
/* Enable privileged access to unmapped region. */
|
/* Enable privileged access to unmapped region. */
|
||||||
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
||||||
|
|
||||||
/* Enable MPU. */
|
/* Enable MPU. */
|
||||||
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
||||||
|
|
||||||
/* Expected value of the portMPU_TYPE register. */
|
/* Expected value of the portMPU_TYPE register. */
|
||||||
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
||||||
|
|
||||||
/* Extract first address of the MPU region as encoded in the
|
/* Extract first address of the MPU region as encoded in the
|
||||||
* RBAR (Region Base Address Register) value. */
|
* RBAR (Region Base Address Register) value. */
|
||||||
|
@ -380,14 +381,14 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to check and configure PACBTI security feature implementation.
|
* @brief Constants required to check and configure PACBTI security feature implementation.
|
||||||
*/
|
*/
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
||||||
|
|
||||||
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
||||||
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
||||||
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
||||||
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
||||||
|
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -409,7 +410,7 @@ static void prvTaskExitError( void );
|
||||||
* @return uint32_t Access permissions.
|
* @return uint32_t Access permissions.
|
||||||
*/
|
*/
|
||||||
static uint32_t prvGetRegionAccessPermissions( uint32_t ulRBARValue ) PRIVILEGED_FUNCTION;
|
static uint32_t prvGetRegionAccessPermissions( uint32_t ulRBARValue ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
|
||||||
|
@ -427,7 +428,7 @@ static void prvTaskExitError( void );
|
||||||
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_FPU */
|
#endif /* configENABLE_FPU */
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Configures PACBTI features.
|
* @brief Configures PACBTI features.
|
||||||
|
@ -890,7 +891,7 @@ static void prvTaskExitError( void )
|
||||||
return ulAccessPermissions;
|
return ulAccessPermissions;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
@ -1212,6 +1213,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __syscalls_flash_start__;
|
extern uint32_t * __syscalls_flash_start__;
|
||||||
|
@ -1282,6 +1284,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
||||||
* when we exit from the system call. */
|
* when we exit from the system call. */
|
||||||
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
||||||
|
|
||||||
/* Store the value of the PSPLIM register before the SVC was raised.
|
/* Store the value of the PSPLIM register before the SVC was raised.
|
||||||
* We need to restore it when we exit from the system call. */
|
* We need to restore it when we exit from the system call. */
|
||||||
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
||||||
|
@ -1300,6 +1303,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
|
|
||||||
/* Start executing the system call upon returning from this handler. */
|
/* Start executing the system call upon returning from this handler. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
||||||
|
|
||||||
/* Raise a request to exit from the system call upon finishing the
|
/* Raise a request to exit from the system call upon finishing the
|
||||||
* system call. */
|
* system call. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
||||||
|
@ -1359,6 +1363,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __privileged_functions_start__;
|
extern uint32_t * __privileged_functions_start__;
|
||||||
|
@ -1541,7 +1546,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
||||||
ulIndex++;
|
ulIndex++;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Check PACBTI security feature configuration before pushing the
|
/* Check PACBTI security feature configuration before pushing the
|
||||||
* CONTROL register's value on task's TCB. */
|
* CONTROL register's value on task's TCB. */
|
||||||
|
@ -1814,11 +1819,11 @@ BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
||||||
portNVIC_SHPR2_REG = 0;
|
portNVIC_SHPR2_REG = 0;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Set the CONTROL register value based on PACBTI security feature
|
/* Set the CONTROL register value based on PACBTI security feature
|
||||||
* configuration before starting the first task. */
|
* configuration before starting the first task. */
|
||||||
( void) prvConfigurePACBTI( pdTRUE );
|
( void ) prvConfigurePACBTI( pdTRUE );
|
||||||
}
|
}
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
|
|
||||||
|
@ -2018,9 +2023,9 @@ void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
if( xSchedulerRunning == pdFALSE )
|
if( xSchedulerRunning == pdFALSE )
|
||||||
{
|
{
|
||||||
/* Grant access to all the kernel objects before the scheduler
|
/* Grant access to all the kernel objects before the scheduler
|
||||||
* is started. It is necessary because there is no task running
|
* is started. It is necessary because there is no task running
|
||||||
* yet and therefore, we cannot use the permissions of any
|
* yet and therefore, we cannot use the permissions of any
|
||||||
* task. */
|
* task. */
|
||||||
xAccessGranted = pdTRUE;
|
xAccessGranted = pdTRUE;
|
||||||
}
|
}
|
||||||
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
||||||
|
@ -2241,7 +2246,7 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
||||||
{
|
{
|
||||||
|
@ -2253,13 +2258,13 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
/* Enable UsageFault exception. */
|
/* Enable UsageFault exception. */
|
||||||
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
||||||
|
|
||||||
#if( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if( configENABLE_BTI == 1 )
|
#if ( configENABLE_BTI == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,16 +77,16 @@
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configTOTAL_MPU_REGIONS == 16 )
|
#if ( configTOTAL_MPU_REGIONS == 16 )
|
||||||
" movs r3, #8 \n" /* r3 = 8. */
|
" movs r3, #8 \n" /* r3 = 8. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 8. */
|
" str r3, [r1] \n" /* Program RNR = 8. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" movs r3, #12 \n" /* r3 = 12. */
|
" movs r3, #12 \n" /* r3 = 12. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 12. */
|
" str r3, [r1] \n" /* Program RNR = 12. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
||||||
" \n"
|
" \n"
|
||||||
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
@ -100,14 +100,14 @@
|
||||||
" ldr r2, [r1] \n" /* r2 = Location of saved context in TCB. */
|
" ldr r2, [r1] \n" /* r2 = Location of saved context in TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_special_regs_first_task: \n"
|
" restore_special_regs_first_task: \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmdb r2!, {r3-r6} \n" /* Read task's dedicated PAC key from the task's context. */
|
" ldmdb r2!, {r3-r6} \n" /* Read task's dedicated PAC key from the task's context. */
|
||||||
" msr PAC_KEY_P_0, r3 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_0, r3 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_1, r4 \n"
|
" msr PAC_KEY_P_1, r4 \n"
|
||||||
" msr PAC_KEY_P_2, r5 \n"
|
" msr PAC_KEY_P_2, r5 \n"
|
||||||
" msr PAC_KEY_P_3, r6 \n"
|
" msr PAC_KEY_P_3, r6 \n"
|
||||||
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" ldmdb r2!, {r0, r3-r5, lr} \n" /* r0 = xSecureContext, r3 = original PSP, r4 = PSPLIM, r5 = CONTROL, LR restored. */
|
" ldmdb r2!, {r0, r3-r5, lr} \n" /* r0 = xSecureContext, r3 = original PSP, r4 = PSPLIM, r5 = CONTROL, LR restored. */
|
||||||
" msr psp, r3 \n"
|
" msr psp, r3 \n"
|
||||||
" msr psplim, r4 \n"
|
" msr psplim, r4 \n"
|
||||||
|
@ -140,14 +140,14 @@
|
||||||
" ldr r3, [r2] \n" /* Read pxCurrentTCB. */
|
" ldr r3, [r2] \n" /* Read pxCurrentTCB. */
|
||||||
" ldr r0, [r3] \n" /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
|
" ldr r0, [r3] \n" /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmia r0!, {r1-r4} \n" /* Read task's dedicated PAC key from stack. */
|
" ldmia r0!, {r1-r4} \n" /* Read task's dedicated PAC key from stack. */
|
||||||
" msr PAC_KEY_P_3, r1 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_3, r1 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_2, r2 \n"
|
" msr PAC_KEY_P_2, r2 \n"
|
||||||
" msr PAC_KEY_P_1, r3 \n"
|
" msr PAC_KEY_P_1, r3 \n"
|
||||||
" msr PAC_KEY_P_0, r4 \n"
|
" msr PAC_KEY_P_0, r4 \n"
|
||||||
" clrm {r1-r4} \n" /* Clear r1-r4. */
|
" clrm {r1-r4} \n" /* Clear r1-r4. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" \n"
|
" \n"
|
||||||
" ldm r0!, {r1-r3} \n" /* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */
|
" ldm r0!, {r1-r3} \n" /* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */
|
||||||
" ldr r4, =xSecureContext \n"
|
" ldr r4, =xSecureContext \n"
|
||||||
|
@ -297,15 +297,15 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" \n"
|
" \n"
|
||||||
" save_general_regs: \n"
|
" save_general_regs: \n"
|
||||||
" mrs r3, psp \n"
|
" mrs r3, psp \n"
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" add r3, r3, #0x20 \n" /* Move r3 to location where s0 is saved. */
|
" add r3, r3, #0x20 \n" /* Move r3 to location where s0 is saved. */
|
||||||
" tst lr, #0x10 \n"
|
" tst lr, #0x10 \n"
|
||||||
" ittt eq \n"
|
" ittt eq \n"
|
||||||
" vstmiaeq r2!, {s16-s31} \n" /* Store s16-s31. */
|
" vstmiaeq r2!, {s16-s31} \n" /* Store s16-s31. */
|
||||||
" vldmiaeq r3, {s0-s16} \n" /* Copy hardware saved FP context into s0-s16. */
|
" vldmiaeq r3, {s0-s16} \n" /* Copy hardware saved FP context into s0-s16. */
|
||||||
" vstmiaeq r2!, {s0-s16} \n" /* Store hardware saved FP context. */
|
" vstmiaeq r2!, {s0-s16} \n" /* Store hardware saved FP context. */
|
||||||
" sub r3, r3, #0x20 \n" /* Set r3 back to the location of hardware saved context. */
|
" sub r3, r3, #0x20 \n" /* Set r3 back to the location of hardware saved context. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" stmia r2!, {r4-r11} \n" /* Store r4-r11. */
|
" stmia r2!, {r4-r11} \n" /* Store r4-r11. */
|
||||||
" ldmia r3, {r4-r11} \n" /* Copy the hardware saved context into r4-r11. */
|
" ldmia r3, {r4-r11} \n" /* Copy the hardware saved context into r4-r11. */
|
||||||
" stmia r2!, {r4-r11} \n" /* Store the hardware saved context. */
|
" stmia r2!, {r4-r11} \n" /* Store the hardware saved context. */
|
||||||
|
@ -315,15 +315,15 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" mrs r4, psplim \n" /* r4 = PSPLIM. */
|
" mrs r4, psplim \n" /* r4 = PSPLIM. */
|
||||||
" mrs r5, control \n" /* r5 = CONTROL. */
|
" mrs r5, control \n" /* r5 = CONTROL. */
|
||||||
" stmia r2!, {r0, r3-r5, lr} \n" /* Store xSecureContext, original PSP (after hardware has saved context), PSPLIM, CONTROL and LR. */
|
" stmia r2!, {r0, r3-r5, lr} \n" /* Store xSecureContext, original PSP (after hardware has saved context), PSPLIM, CONTROL and LR. */
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" mrs r3, PAC_KEY_P_0 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
" mrs r3, PAC_KEY_P_0 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
||||||
" mrs r4, PAC_KEY_P_1 \n"
|
" mrs r4, PAC_KEY_P_1 \n"
|
||||||
" mrs r5, PAC_KEY_P_2 \n"
|
" mrs r5, PAC_KEY_P_2 \n"
|
||||||
" mrs r6, PAC_KEY_P_3 \n"
|
" mrs r6, PAC_KEY_P_3 \n"
|
||||||
" stmia r2!, {r3-r6} \n" /* Store the task's dedicated PAC key on the task's context. */
|
" stmia r2!, {r3-r6} \n" /* Store the task's dedicated PAC key on the task's context. */
|
||||||
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" str r2, [r1] \n" /* Save the location from where the context should be restored as the first member of TCB. */
|
" str r2, [r1] \n" /* Save the location from where the context should be restored as the first member of TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" select_next_task: \n"
|
" select_next_task: \n"
|
||||||
" mov r0, %0 \n" /* r0 = configMAX_SYSCALL_INTERRUPT_PRIORITY */
|
" mov r0, %0 \n" /* r0 = configMAX_SYSCALL_INTERRUPT_PRIORITY */
|
||||||
|
@ -358,16 +358,16 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configTOTAL_MPU_REGIONS == 16 )
|
#if ( configTOTAL_MPU_REGIONS == 16 )
|
||||||
" movs r3, #8 \n" /* r3 = 8. */
|
" movs r3, #8 \n" /* r3 = 8. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 8. */
|
" str r3, [r1] \n" /* Program RNR = 8. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" movs r3, #12 \n" /* r3 = 12. */
|
" movs r3, #12 \n" /* r3 = 12. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 12. */
|
" str r3, [r1] \n" /* Program RNR = 12. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
||||||
" \n"
|
" \n"
|
||||||
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
@ -381,14 +381,14 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldr r2, [r1] \n" /* r2 = Location of saved context in TCB. */
|
" ldr r2, [r1] \n" /* r2 = Location of saved context in TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_special_regs: \n"
|
" restore_special_regs: \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmdb r2!, {r3-r6} \n" /* Read task's dedicated PAC key from the task's context. */
|
" ldmdb r2!, {r3-r6} \n" /* Read task's dedicated PAC key from the task's context. */
|
||||||
" msr PAC_KEY_P_0, r3 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_0, r3 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_1, r4 \n"
|
" msr PAC_KEY_P_1, r4 \n"
|
||||||
" msr PAC_KEY_P_2, r5 \n"
|
" msr PAC_KEY_P_2, r5 \n"
|
||||||
" msr PAC_KEY_P_3, r6 \n"
|
" msr PAC_KEY_P_3, r6 \n"
|
||||||
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" ldmdb r2!, {r0, r3-r5, lr} \n" /* r0 = xSecureContext, r3 = original PSP, r4 = PSPLIM, r5 = CONTROL, LR restored. */
|
" ldmdb r2!, {r0, r3-r5, lr} \n" /* r0 = xSecureContext, r3 = original PSP, r4 = PSPLIM, r5 = CONTROL, LR restored. */
|
||||||
" msr psp, r3 \n"
|
" msr psp, r3 \n"
|
||||||
" msr psplim, r4 \n"
|
" msr psplim, r4 \n"
|
||||||
|
@ -411,13 +411,13 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldmdb r2!, {r4-r11} \n" /* r4-r11 contain hardware saved context. */
|
" ldmdb r2!, {r4-r11} \n" /* r4-r11 contain hardware saved context. */
|
||||||
" stmia r3!, {r4-r11} \n" /* Copy the hardware saved context on the task stack. */
|
" stmia r3!, {r4-r11} \n" /* Copy the hardware saved context on the task stack. */
|
||||||
" ldmdb r2!, {r4-r11} \n" /* r4-r11 restored. */
|
" ldmdb r2!, {r4-r11} \n" /* r4-r11 restored. */
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" tst lr, #0x10 \n"
|
" tst lr, #0x10 \n"
|
||||||
" ittt eq \n"
|
" ittt eq \n"
|
||||||
" vldmdbeq r2!, {s0-s16} \n" /* s0-s16 contain hardware saved FP context. */
|
" vldmdbeq r2!, {s0-s16} \n" /* s0-s16 contain hardware saved FP context. */
|
||||||
" vstmiaeq r3!, {s0-s16} \n" /* Copy hardware saved FP context on the task stack. */
|
" vstmiaeq r3!, {s0-s16} \n" /* Copy hardware saved FP context on the task stack. */
|
||||||
" vldmdbeq r2!, {s16-s31} \n" /* Restore s16-s31. */
|
" vldmdbeq r2!, {s16-s31} \n" /* Restore s16-s31. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_context_done: \n"
|
" restore_context_done: \n"
|
||||||
" str r2, [r1] \n" /* Save the location where the context should be saved next as the first member of TCB. */
|
" str r2, [r1] \n" /* Save the location where the context should be saved next as the first member of TCB. */
|
||||||
|
@ -454,24 +454,24 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" bmi save_special_regs \n" /* If r3 < 0 ==> Bit[6] in EXC_RETURN is 1 ==> secure stack was used. */
|
" bmi save_special_regs \n" /* If r3 < 0 ==> Bit[6] in EXC_RETURN is 1 ==> secure stack was used. */
|
||||||
" \n"
|
" \n"
|
||||||
" save_general_regs: \n"
|
" save_general_regs: \n"
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
||||||
" it eq \n"
|
" it eq \n"
|
||||||
" vstmdbeq r2!, {s16-s31} \n" /* Store the additional FP context registers which are not saved automatically. */
|
" vstmdbeq r2!, {s16-s31} \n" /* Store the additional FP context registers which are not saved automatically. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" stmdb r2!, {r4-r11} \n" /* Store the registers that are not saved automatically. */
|
" stmdb r2!, {r4-r11} \n" /* Store the registers that are not saved automatically. */
|
||||||
" \n"
|
" \n"
|
||||||
" save_special_regs: \n"
|
" save_special_regs: \n"
|
||||||
" mrs r3, psplim \n" /* r3 = PSPLIM. */
|
" mrs r3, psplim \n" /* r3 = PSPLIM. */
|
||||||
" stmdb r2!, {r0, r3, lr} \n" /* Store xSecureContext, PSPLIM and LR on the stack. */
|
" stmdb r2!, {r0, r3, lr} \n" /* Store xSecureContext, PSPLIM and LR on the stack. */
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" mrs r3, PAC_KEY_P_3 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
" mrs r3, PAC_KEY_P_3 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
||||||
" mrs r4, PAC_KEY_P_2 \n"
|
" mrs r4, PAC_KEY_P_2 \n"
|
||||||
" mrs r5, PAC_KEY_P_1 \n"
|
" mrs r5, PAC_KEY_P_1 \n"
|
||||||
" mrs r6, PAC_KEY_P_0 \n"
|
" mrs r6, PAC_KEY_P_0 \n"
|
||||||
" stmdb r2!, {r3-r6} \n" /* Store the task's dedicated PAC key on the stack. */
|
" stmdb r2!, {r3-r6} \n" /* Store the task's dedicated PAC key on the stack. */
|
||||||
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" \n"
|
" \n"
|
||||||
" str r2, [r1] \n" /* Save the new top of stack in TCB. */
|
" str r2, [r1] \n" /* Save the new top of stack in TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
|
@ -490,14 +490,14 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldr r2, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. r2 now points to the top of stack. */
|
" ldr r2, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. r2 now points to the top of stack. */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_special_regs: \n"
|
" restore_special_regs: \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmia r2!, {r3-r6} \n" /* Read task's dedicated PAC key from stack. */
|
" ldmia r2!, {r3-r6} \n" /* Read task's dedicated PAC key from stack. */
|
||||||
" msr PAC_KEY_P_3, r3 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_3, r3 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_2, r4 \n"
|
" msr PAC_KEY_P_2, r4 \n"
|
||||||
" msr PAC_KEY_P_1, r5 \n"
|
" msr PAC_KEY_P_1, r5 \n"
|
||||||
" msr PAC_KEY_P_0, r6 \n"
|
" msr PAC_KEY_P_0, r6 \n"
|
||||||
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" ldmia r2!, {r0, r3, lr} \n" /* Read from stack - r0 = xSecureContext, r3 = PSPLIM and LR restored. */
|
" ldmia r2!, {r0, r3, lr} \n" /* Read from stack - r0 = xSecureContext, r3 = PSPLIM and LR restored. */
|
||||||
" msr psplim, r3 \n" /* Restore the PSPLIM register value for the task. */
|
" msr psplim, r3 \n" /* Restore the PSPLIM register value for the task. */
|
||||||
" ldr r3, =xSecureContext \n" /* Read the location of xSecureContext i.e. &( xSecureContext ). */
|
" ldr r3, =xSecureContext \n" /* Read the location of xSecureContext i.e. &( xSecureContext ). */
|
||||||
|
@ -516,11 +516,11 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" \n"
|
" \n"
|
||||||
" restore_general_regs: \n"
|
" restore_general_regs: \n"
|
||||||
" ldmia r2!, {r4-r11} \n" /* Restore the registers that are not automatically restored. */
|
" ldmia r2!, {r4-r11} \n" /* Restore the registers that are not automatically restored. */
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
||||||
" it eq \n"
|
" it eq \n"
|
||||||
" vldmiaeq r2!, {s16-s31} \n" /* Restore the additional FP context registers which are not restored automatically. */
|
" vldmiaeq r2!, {s16-s31} \n" /* Restore the additional FP context registers which are not restored automatically. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_context_done: \n"
|
" restore_context_done: \n"
|
||||||
" msr psp, r2 \n" /* Remember the new top of stack for the task. */
|
" msr psp, r2 \n" /* Remember the new top of stack for the task. */
|
||||||
|
|
|
@ -243,54 +243,55 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
/*
|
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
/*
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
*
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
*
|
||||||
* 16 16 8 8 5 16 1
|
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
||||||
*/
|
* 16 16 8 8 5 16 1
|
||||||
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 70
|
#define MAX_CONTEXT_SIZE 70
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
||||||
* 16 16 8 8 5 1
|
* 16 16 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 54
|
#define MAX_CONTEXT_SIZE 54
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | | |
|
* | | | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
||||||
* 16 16 8 8 4 16 1
|
* 16 16 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 69
|
#define MAX_CONTEXT_SIZE 69
|
||||||
|
|
||||||
#else
|
#else /* if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | |
|
* | | | | PC, xPSR | EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><---->
|
* <-----------><--------------><---------><----------------><---------------------><---->
|
||||||
* 16 16 8 8 4 1
|
* 16 16 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 53
|
#define MAX_CONTEXT_SIZE 53
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
@ -299,54 +300,54 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><-----------><---->
|
* <---------><----------------><------------------------------><-----------><---->
|
||||||
* 8 8 5 16 1
|
* 8 8 5 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 38
|
#define MAX_CONTEXT_SIZE 38
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><---->
|
* <---------><----------------><------------------------------><---->
|
||||||
* 8 8 5 1
|
* 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 22
|
#define MAX_CONTEXT_SIZE 22
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | PC, xPSR | EXC_RETURN | | |
|
* | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><-----------><---->
|
* <---------><----------------><----------------------><-----------><---->
|
||||||
* 8 8 4 16 1
|
* 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 37
|
#define MAX_CONTEXT_SIZE 37
|
||||||
|
|
||||||
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | PC, xPSR | EXC_RETURN | |
|
* | | PC, xPSR | EXC_RETURN | |
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><---->
|
* <---------><----------------><----------------------><---->
|
||||||
* 8 8 4 1
|
* 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 21
|
#define MAX_CONTEXT_SIZE 21
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
|
@ -169,79 +169,80 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to manipulate the MPU.
|
* @brief Constants required to manipulate the MPU.
|
||||||
*/
|
*/
|
||||||
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
||||||
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
||||||
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
||||||
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
||||||
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
||||||
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
||||||
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
||||||
|
|
||||||
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
||||||
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
|
|
||||||
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
||||||
|
|
||||||
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
||||||
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
|
||||||
* region. */
|
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
||||||
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
* region. */
|
||||||
|
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
||||||
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
||||||
|
|
||||||
/* Enable privileged access to unmapped region. */
|
/* Enable privileged access to unmapped region. */
|
||||||
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
||||||
|
|
||||||
/* Enable MPU. */
|
/* Enable MPU. */
|
||||||
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
||||||
|
|
||||||
/* Expected value of the portMPU_TYPE register. */
|
/* Expected value of the portMPU_TYPE register. */
|
||||||
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
||||||
|
|
||||||
/* Extract first address of the MPU region as encoded in the
|
/* Extract first address of the MPU region as encoded in the
|
||||||
* RBAR (Region Base Address Register) value. */
|
* RBAR (Region Base Address Register) value. */
|
||||||
|
@ -380,14 +381,14 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to check and configure PACBTI security feature implementation.
|
* @brief Constants required to check and configure PACBTI security feature implementation.
|
||||||
*/
|
*/
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
||||||
|
|
||||||
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
||||||
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
||||||
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
||||||
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
||||||
|
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -409,7 +410,7 @@ static void prvTaskExitError( void );
|
||||||
* @return uint32_t Access permissions.
|
* @return uint32_t Access permissions.
|
||||||
*/
|
*/
|
||||||
static uint32_t prvGetRegionAccessPermissions( uint32_t ulRBARValue ) PRIVILEGED_FUNCTION;
|
static uint32_t prvGetRegionAccessPermissions( uint32_t ulRBARValue ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
|
||||||
|
@ -427,7 +428,7 @@ static void prvTaskExitError( void );
|
||||||
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_FPU */
|
#endif /* configENABLE_FPU */
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Configures PACBTI features.
|
* @brief Configures PACBTI features.
|
||||||
|
@ -890,7 +891,7 @@ static void prvTaskExitError( void )
|
||||||
return ulAccessPermissions;
|
return ulAccessPermissions;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
@ -1212,6 +1213,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __syscalls_flash_start__;
|
extern uint32_t * __syscalls_flash_start__;
|
||||||
|
@ -1282,6 +1284,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
||||||
* when we exit from the system call. */
|
* when we exit from the system call. */
|
||||||
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
||||||
|
|
||||||
/* Store the value of the PSPLIM register before the SVC was raised.
|
/* Store the value of the PSPLIM register before the SVC was raised.
|
||||||
* We need to restore it when we exit from the system call. */
|
* We need to restore it when we exit from the system call. */
|
||||||
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
||||||
|
@ -1300,6 +1303,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
|
|
||||||
/* Start executing the system call upon returning from this handler. */
|
/* Start executing the system call upon returning from this handler. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
||||||
|
|
||||||
/* Raise a request to exit from the system call upon finishing the
|
/* Raise a request to exit from the system call upon finishing the
|
||||||
* system call. */
|
* system call. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
||||||
|
@ -1359,6 +1363,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __privileged_functions_start__;
|
extern uint32_t * __privileged_functions_start__;
|
||||||
|
@ -1541,7 +1546,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
||||||
ulIndex++;
|
ulIndex++;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Check PACBTI security feature configuration before pushing the
|
/* Check PACBTI security feature configuration before pushing the
|
||||||
* CONTROL register's value on task's TCB. */
|
* CONTROL register's value on task's TCB. */
|
||||||
|
@ -1814,11 +1819,11 @@ BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
||||||
portNVIC_SHPR2_REG = 0;
|
portNVIC_SHPR2_REG = 0;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Set the CONTROL register value based on PACBTI security feature
|
/* Set the CONTROL register value based on PACBTI security feature
|
||||||
* configuration before starting the first task. */
|
* configuration before starting the first task. */
|
||||||
( void) prvConfigurePACBTI( pdTRUE );
|
( void ) prvConfigurePACBTI( pdTRUE );
|
||||||
}
|
}
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
|
|
||||||
|
@ -2018,9 +2023,9 @@ void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
if( xSchedulerRunning == pdFALSE )
|
if( xSchedulerRunning == pdFALSE )
|
||||||
{
|
{
|
||||||
/* Grant access to all the kernel objects before the scheduler
|
/* Grant access to all the kernel objects before the scheduler
|
||||||
* is started. It is necessary because there is no task running
|
* is started. It is necessary because there is no task running
|
||||||
* yet and therefore, we cannot use the permissions of any
|
* yet and therefore, we cannot use the permissions of any
|
||||||
* task. */
|
* task. */
|
||||||
xAccessGranted = pdTRUE;
|
xAccessGranted = pdTRUE;
|
||||||
}
|
}
|
||||||
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
||||||
|
@ -2241,7 +2246,7 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
||||||
{
|
{
|
||||||
|
@ -2253,13 +2258,13 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
/* Enable UsageFault exception. */
|
/* Enable UsageFault exception. */
|
||||||
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
||||||
|
|
||||||
#if( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if( configENABLE_BTI == 1 )
|
#if ( configENABLE_BTI == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,16 +77,16 @@
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configTOTAL_MPU_REGIONS == 16 )
|
#if ( configTOTAL_MPU_REGIONS == 16 )
|
||||||
" movs r3, #8 \n" /* r3 = 8. */
|
" movs r3, #8 \n" /* r3 = 8. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 8. */
|
" str r3, [r1] \n" /* Program RNR = 8. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" movs r3, #12 \n" /* r3 = 12. */
|
" movs r3, #12 \n" /* r3 = 12. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 12. */
|
" str r3, [r1] \n" /* Program RNR = 12. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
||||||
" \n"
|
" \n"
|
||||||
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
@ -100,14 +100,14 @@
|
||||||
" ldr r1, [r0] \n" /* r1 = Location of saved context in TCB. */
|
" ldr r1, [r0] \n" /* r1 = Location of saved context in TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_special_regs_first_task: \n"
|
" restore_special_regs_first_task: \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmdb r1!, {r2-r5} \n" /* Read task's dedicated PAC key from the task's context. */
|
" ldmdb r1!, {r2-r5} \n" /* Read task's dedicated PAC key from the task's context. */
|
||||||
" msr PAC_KEY_P_0, r2 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_0, r2 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_1, r3 \n"
|
" msr PAC_KEY_P_1, r3 \n"
|
||||||
" msr PAC_KEY_P_2, r4 \n"
|
" msr PAC_KEY_P_2, r4 \n"
|
||||||
" msr PAC_KEY_P_3, r5 \n"
|
" msr PAC_KEY_P_3, r5 \n"
|
||||||
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" ldmdb r1!, {r2-r4, lr} \n" /* r2 = original PSP, r3 = PSPLIM, r4 = CONTROL, LR restored. */
|
" ldmdb r1!, {r2-r4, lr} \n" /* r2 = original PSP, r3 = PSPLIM, r4 = CONTROL, LR restored. */
|
||||||
" msr psp, r2 \n"
|
" msr psp, r2 \n"
|
||||||
" msr psplim, r3 \n"
|
" msr psplim, r3 \n"
|
||||||
|
@ -138,14 +138,14 @@
|
||||||
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
||||||
" ldr r0, [r1] \n" /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
|
" ldr r0, [r1] \n" /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmia r0!, {r1-r4} \n" /* Read task's dedicated PAC key from stack. */
|
" ldmia r0!, {r1-r4} \n" /* Read task's dedicated PAC key from stack. */
|
||||||
" msr PAC_KEY_P_3, r1 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_3, r1 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_2, r2 \n"
|
" msr PAC_KEY_P_2, r2 \n"
|
||||||
" msr PAC_KEY_P_1, r3 \n"
|
" msr PAC_KEY_P_1, r3 \n"
|
||||||
" msr PAC_KEY_P_0, r4 \n"
|
" msr PAC_KEY_P_0, r4 \n"
|
||||||
" clrm {r1-r4} \n" /* Clear r1-r4. */
|
" clrm {r1-r4} \n" /* Clear r1-r4. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" \n"
|
" \n"
|
||||||
" ldm r0!, {r1-r2} \n" /* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */
|
" ldm r0!, {r1-r2} \n" /* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */
|
||||||
" msr psplim, r1 \n" /* Set this task's PSPLIM value. */
|
" msr psplim, r1 \n" /* Set this task's PSPLIM value. */
|
||||||
|
@ -278,15 +278,15 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" mrs r2, psp \n" /* r2 = PSP. */
|
" mrs r2, psp \n" /* r2 = PSP. */
|
||||||
" \n"
|
" \n"
|
||||||
" save_general_regs: \n"
|
" save_general_regs: \n"
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" add r2, r2, #0x20 \n" /* Move r2 to location where s0 is saved. */
|
" add r2, r2, #0x20 \n" /* Move r2 to location where s0 is saved. */
|
||||||
" tst lr, #0x10 \n"
|
" tst lr, #0x10 \n"
|
||||||
" ittt eq \n"
|
" ittt eq \n"
|
||||||
" vstmiaeq r1!, {s16-s31} \n" /* Store s16-s31. */
|
" vstmiaeq r1!, {s16-s31} \n" /* Store s16-s31. */
|
||||||
" vldmiaeq r2, {s0-s16} \n" /* Copy hardware saved FP context into s0-s16. */
|
" vldmiaeq r2, {s0-s16} \n" /* Copy hardware saved FP context into s0-s16. */
|
||||||
" vstmiaeq r1!, {s0-s16} \n" /* Store hardware saved FP context. */
|
" vstmiaeq r1!, {s0-s16} \n" /* Store hardware saved FP context. */
|
||||||
" sub r2, r2, #0x20 \n" /* Set r2 back to the location of hardware saved context. */
|
" sub r2, r2, #0x20 \n" /* Set r2 back to the location of hardware saved context. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" stmia r1!, {r4-r11} \n" /* Store r4-r11. */
|
" stmia r1!, {r4-r11} \n" /* Store r4-r11. */
|
||||||
" ldmia r2, {r4-r11} \n" /* Copy the hardware saved context into r4-r11. */
|
" ldmia r2, {r4-r11} \n" /* Copy the hardware saved context into r4-r11. */
|
||||||
" stmia r1!, {r4-r11} \n" /* Store the hardware saved context. */
|
" stmia r1!, {r4-r11} \n" /* Store the hardware saved context. */
|
||||||
|
@ -295,14 +295,14 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" mrs r3, psplim \n" /* r3 = PSPLIM. */
|
" mrs r3, psplim \n" /* r3 = PSPLIM. */
|
||||||
" mrs r4, control \n" /* r4 = CONTROL. */
|
" mrs r4, control \n" /* r4 = CONTROL. */
|
||||||
" stmia r1!, {r2-r4, lr} \n" /* Store original PSP (after hardware has saved context), PSPLIM, CONTROL and LR. */
|
" stmia r1!, {r2-r4, lr} \n" /* Store original PSP (after hardware has saved context), PSPLIM, CONTROL and LR. */
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" mrs r2, PAC_KEY_P_0 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
" mrs r2, PAC_KEY_P_0 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
||||||
" mrs r3, PAC_KEY_P_1 \n"
|
" mrs r3, PAC_KEY_P_1 \n"
|
||||||
" mrs r4, PAC_KEY_P_2 \n"
|
" mrs r4, PAC_KEY_P_2 \n"
|
||||||
" mrs r5, PAC_KEY_P_3 \n"
|
" mrs r5, PAC_KEY_P_3 \n"
|
||||||
" stmia r1!, {r2-r5} \n" /* Store the task's dedicated PAC key on the task's context. */
|
" stmia r1!, {r2-r5} \n" /* Store the task's dedicated PAC key on the task's context. */
|
||||||
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" str r1, [r0] \n" /* Save the location from where the context should be restored as the first member of TCB. */
|
" str r1, [r0] \n" /* Save the location from where the context should be restored as the first member of TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" select_next_task: \n"
|
" select_next_task: \n"
|
||||||
|
@ -338,16 +338,16 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configTOTAL_MPU_REGIONS == 16 )
|
#if ( configTOTAL_MPU_REGIONS == 16 )
|
||||||
" movs r3, #8 \n" /* r3 = 8. */
|
" movs r3, #8 \n" /* r3 = 8. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 8. */
|
" str r3, [r1] \n" /* Program RNR = 8. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" movs r3, #12 \n" /* r3 = 12. */
|
" movs r3, #12 \n" /* r3 = 12. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 12. */
|
" str r3, [r1] \n" /* Program RNR = 12. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
||||||
" \n"
|
" \n"
|
||||||
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
@ -361,14 +361,14 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldr r1, [r0] \n" /* r1 = Location of saved context in TCB. */
|
" ldr r1, [r0] \n" /* r1 = Location of saved context in TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_special_regs: \n"
|
" restore_special_regs: \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmdb r1!, {r2-r5} \n" /* Read task's dedicated PAC key from the task's context. */
|
" ldmdb r1!, {r2-r5} \n" /* Read task's dedicated PAC key from the task's context. */
|
||||||
" msr PAC_KEY_P_0, r2 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_0, r2 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_1, r3 \n"
|
" msr PAC_KEY_P_1, r3 \n"
|
||||||
" msr PAC_KEY_P_2, r4 \n"
|
" msr PAC_KEY_P_2, r4 \n"
|
||||||
" msr PAC_KEY_P_3, r5 \n"
|
" msr PAC_KEY_P_3, r5 \n"
|
||||||
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" ldmdb r1!, {r2-r4, lr} \n" /* r2 = original PSP, r3 = PSPLIM, r4 = CONTROL, LR restored. */
|
" ldmdb r1!, {r2-r4, lr} \n" /* r2 = original PSP, r3 = PSPLIM, r4 = CONTROL, LR restored. */
|
||||||
" msr psp, r2 \n"
|
" msr psp, r2 \n"
|
||||||
" msr psplim, r3 \n"
|
" msr psplim, r3 \n"
|
||||||
|
@ -378,13 +378,13 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldmdb r1!, {r4-r11} \n" /* r4-r11 contain hardware saved context. */
|
" ldmdb r1!, {r4-r11} \n" /* r4-r11 contain hardware saved context. */
|
||||||
" stmia r2!, {r4-r11} \n" /* Copy the hardware saved context on the task stack. */
|
" stmia r2!, {r4-r11} \n" /* Copy the hardware saved context on the task stack. */
|
||||||
" ldmdb r1!, {r4-r11} \n" /* r4-r11 restored. */
|
" ldmdb r1!, {r4-r11} \n" /* r4-r11 restored. */
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" tst lr, #0x10 \n"
|
" tst lr, #0x10 \n"
|
||||||
" ittt eq \n"
|
" ittt eq \n"
|
||||||
" vldmdbeq r1!, {s0-s16} \n" /* s0-s16 contain hardware saved FP context. */
|
" vldmdbeq r1!, {s0-s16} \n" /* s0-s16 contain hardware saved FP context. */
|
||||||
" vstmiaeq r2!, {s0-s16} \n" /* Copy hardware saved FP context on the task stack. */
|
" vstmiaeq r2!, {s0-s16} \n" /* Copy hardware saved FP context on the task stack. */
|
||||||
" vldmdbeq r1!, {s16-s31} \n" /* Restore s16-s31. */
|
" vldmdbeq r1!, {s16-s31} \n" /* Restore s16-s31. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_context_done: \n"
|
" restore_context_done: \n"
|
||||||
" str r1, [r0] \n" /* Save the location where the context should be saved next as the first member of TCB. */
|
" str r1, [r0] \n" /* Save the location where the context should be saved next as the first member of TCB. */
|
||||||
|
@ -403,24 +403,24 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" \n"
|
" \n"
|
||||||
" mrs r0, psp \n" /* Read PSP in r0. */
|
" mrs r0, psp \n" /* Read PSP in r0. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
||||||
" it eq \n"
|
" it eq \n"
|
||||||
" vstmdbeq r0!, {s16-s31} \n" /* Store the additional FP context registers which are not saved automatically. */
|
" vstmdbeq r0!, {s16-s31} \n" /* Store the additional FP context registers which are not saved automatically. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" \n"
|
" \n"
|
||||||
" mrs r2, psplim \n" /* r2 = PSPLIM. */
|
" mrs r2, psplim \n" /* r2 = PSPLIM. */
|
||||||
" mov r3, lr \n" /* r3 = LR/EXC_RETURN. */
|
" mov r3, lr \n" /* r3 = LR/EXC_RETURN. */
|
||||||
" stmdb r0!, {r2-r11} \n" /* Store on the stack - PSPLIM, LR and registers that are not automatically saved. */
|
" stmdb r0!, {r2-r11} \n" /* Store on the stack - PSPLIM, LR and registers that are not automatically saved. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" mrs r1, PAC_KEY_P_3 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
" mrs r1, PAC_KEY_P_3 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
||||||
" mrs r2, PAC_KEY_P_2 \n"
|
" mrs r2, PAC_KEY_P_2 \n"
|
||||||
" mrs r3, PAC_KEY_P_1 \n"
|
" mrs r3, PAC_KEY_P_1 \n"
|
||||||
" mrs r4, PAC_KEY_P_0 \n"
|
" mrs r4, PAC_KEY_P_0 \n"
|
||||||
" stmdb r0!, {r1-r4} \n" /* Store the task's dedicated PAC key on the stack. */
|
" stmdb r0!, {r1-r4} \n" /* Store the task's dedicated PAC key on the stack. */
|
||||||
" clrm {r1-r4} \n" /* Clear r1-r4. */
|
" clrm {r1-r4} \n" /* Clear r1-r4. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" \n"
|
" \n"
|
||||||
" ldr r2, =pxCurrentTCB \n" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
" ldr r2, =pxCurrentTCB \n" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
||||||
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
||||||
|
@ -438,22 +438,22 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
||||||
" ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */
|
" ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmia r0!, {r2-r5} \n" /* Read task's dedicated PAC key from stack. */
|
" ldmia r0!, {r2-r5} \n" /* Read task's dedicated PAC key from stack. */
|
||||||
" msr PAC_KEY_P_3, r2 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_3, r2 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_2, r3 \n"
|
" msr PAC_KEY_P_2, r3 \n"
|
||||||
" msr PAC_KEY_P_1, r4 \n"
|
" msr PAC_KEY_P_1, r4 \n"
|
||||||
" msr PAC_KEY_P_0, r5 \n"
|
" msr PAC_KEY_P_0, r5 \n"
|
||||||
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" \n"
|
" \n"
|
||||||
" ldmia r0!, {r2-r11} \n" /* Read from stack - r2 = PSPLIM, r3 = LR and r4-r11 restored. */
|
" ldmia r0!, {r2-r11} \n" /* Read from stack - r2 = PSPLIM, r3 = LR and r4-r11 restored. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" tst r3, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
" tst r3, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
||||||
" it eq \n"
|
" it eq \n"
|
||||||
" vldmiaeq r0!, {s16-s31} \n" /* Restore the additional FP context registers which are not restored automatically. */
|
" vldmiaeq r0!, {s16-s31} \n" /* Restore the additional FP context registers which are not restored automatically. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" \n"
|
" \n"
|
||||||
" msr psplim, r2 \n" /* Restore the PSPLIM register value for the task. */
|
" msr psplim, r2 \n" /* Restore the PSPLIM register value for the task. */
|
||||||
" msr psp, r0 \n" /* Remember the new top of stack for the task. */
|
" msr psp, r0 \n" /* Remember the new top of stack for the task. */
|
||||||
|
|
|
@ -243,54 +243,55 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
/*
|
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
/*
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
*
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
*
|
||||||
* 16 16 8 8 5 16 1
|
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
||||||
*/
|
* 16 16 8 8 5 16 1
|
||||||
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 70
|
#define MAX_CONTEXT_SIZE 70
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
||||||
* 16 16 8 8 5 1
|
* 16 16 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 54
|
#define MAX_CONTEXT_SIZE 54
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | | |
|
* | | | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
||||||
* 16 16 8 8 4 16 1
|
* 16 16 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 69
|
#define MAX_CONTEXT_SIZE 69
|
||||||
|
|
||||||
#else
|
#else /* if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | |
|
* | | | | PC, xPSR | EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><---->
|
* <-----------><--------------><---------><----------------><---------------------><---->
|
||||||
* 16 16 8 8 4 1
|
* 16 16 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 53
|
#define MAX_CONTEXT_SIZE 53
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
@ -299,54 +300,54 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><-----------><---->
|
* <---------><----------------><------------------------------><-----------><---->
|
||||||
* 8 8 5 16 1
|
* 8 8 5 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 38
|
#define MAX_CONTEXT_SIZE 38
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><---->
|
* <---------><----------------><------------------------------><---->
|
||||||
* 8 8 5 1
|
* 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 22
|
#define MAX_CONTEXT_SIZE 22
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | PC, xPSR | EXC_RETURN | | |
|
* | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><-----------><---->
|
* <---------><----------------><----------------------><-----------><---->
|
||||||
* 8 8 4 16 1
|
* 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 37
|
#define MAX_CONTEXT_SIZE 37
|
||||||
|
|
||||||
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | PC, xPSR | EXC_RETURN | |
|
* | | PC, xPSR | EXC_RETURN | |
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><---->
|
* <---------><----------------><----------------------><---->
|
||||||
* 8 8 4 1
|
* 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 21
|
#define MAX_CONTEXT_SIZE 21
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
|
@ -169,79 +169,80 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to manipulate the MPU.
|
* @brief Constants required to manipulate the MPU.
|
||||||
*/
|
*/
|
||||||
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
||||||
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
||||||
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
||||||
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
||||||
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
||||||
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
||||||
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
||||||
|
|
||||||
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
||||||
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
|
|
||||||
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
||||||
|
|
||||||
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
||||||
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
|
||||||
* region. */
|
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
||||||
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
* region. */
|
||||||
|
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
||||||
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
||||||
|
|
||||||
/* Enable privileged access to unmapped region. */
|
/* Enable privileged access to unmapped region. */
|
||||||
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
||||||
|
|
||||||
/* Enable MPU. */
|
/* Enable MPU. */
|
||||||
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
||||||
|
|
||||||
/* Expected value of the portMPU_TYPE register. */
|
/* Expected value of the portMPU_TYPE register. */
|
||||||
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
||||||
|
|
||||||
/* Extract first address of the MPU region as encoded in the
|
/* Extract first address of the MPU region as encoded in the
|
||||||
* RBAR (Region Base Address Register) value. */
|
* RBAR (Region Base Address Register) value. */
|
||||||
|
@ -380,14 +381,14 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to check and configure PACBTI security feature implementation.
|
* @brief Constants required to check and configure PACBTI security feature implementation.
|
||||||
*/
|
*/
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
||||||
|
|
||||||
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
||||||
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
||||||
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
||||||
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
||||||
|
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -409,7 +410,7 @@ static void prvTaskExitError( void );
|
||||||
* @return uint32_t Access permissions.
|
* @return uint32_t Access permissions.
|
||||||
*/
|
*/
|
||||||
static uint32_t prvGetRegionAccessPermissions( uint32_t ulRBARValue ) PRIVILEGED_FUNCTION;
|
static uint32_t prvGetRegionAccessPermissions( uint32_t ulRBARValue ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
|
||||||
|
@ -427,7 +428,7 @@ static void prvTaskExitError( void );
|
||||||
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_FPU */
|
#endif /* configENABLE_FPU */
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Configures PACBTI features.
|
* @brief Configures PACBTI features.
|
||||||
|
@ -890,7 +891,7 @@ static void prvTaskExitError( void )
|
||||||
return ulAccessPermissions;
|
return ulAccessPermissions;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
@ -1212,6 +1213,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __syscalls_flash_start__;
|
extern uint32_t * __syscalls_flash_start__;
|
||||||
|
@ -1282,6 +1284,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
||||||
* when we exit from the system call. */
|
* when we exit from the system call. */
|
||||||
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
||||||
|
|
||||||
/* Store the value of the PSPLIM register before the SVC was raised.
|
/* Store the value of the PSPLIM register before the SVC was raised.
|
||||||
* We need to restore it when we exit from the system call. */
|
* We need to restore it when we exit from the system call. */
|
||||||
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
||||||
|
@ -1300,6 +1303,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
|
|
||||||
/* Start executing the system call upon returning from this handler. */
|
/* Start executing the system call upon returning from this handler. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
||||||
|
|
||||||
/* Raise a request to exit from the system call upon finishing the
|
/* Raise a request to exit from the system call upon finishing the
|
||||||
* system call. */
|
* system call. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
||||||
|
@ -1359,6 +1363,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __privileged_functions_start__;
|
extern uint32_t * __privileged_functions_start__;
|
||||||
|
@ -1541,7 +1546,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
||||||
ulIndex++;
|
ulIndex++;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Check PACBTI security feature configuration before pushing the
|
/* Check PACBTI security feature configuration before pushing the
|
||||||
* CONTROL register's value on task's TCB. */
|
* CONTROL register's value on task's TCB. */
|
||||||
|
@ -1814,11 +1819,11 @@ BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
||||||
portNVIC_SHPR2_REG = 0;
|
portNVIC_SHPR2_REG = 0;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Set the CONTROL register value based on PACBTI security feature
|
/* Set the CONTROL register value based on PACBTI security feature
|
||||||
* configuration before starting the first task. */
|
* configuration before starting the first task. */
|
||||||
( void) prvConfigurePACBTI( pdTRUE );
|
( void ) prvConfigurePACBTI( pdTRUE );
|
||||||
}
|
}
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
|
|
||||||
|
@ -2018,9 +2023,9 @@ void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
if( xSchedulerRunning == pdFALSE )
|
if( xSchedulerRunning == pdFALSE )
|
||||||
{
|
{
|
||||||
/* Grant access to all the kernel objects before the scheduler
|
/* Grant access to all the kernel objects before the scheduler
|
||||||
* is started. It is necessary because there is no task running
|
* is started. It is necessary because there is no task running
|
||||||
* yet and therefore, we cannot use the permissions of any
|
* yet and therefore, we cannot use the permissions of any
|
||||||
* task. */
|
* task. */
|
||||||
xAccessGranted = pdTRUE;
|
xAccessGranted = pdTRUE;
|
||||||
}
|
}
|
||||||
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
||||||
|
@ -2241,7 +2246,7 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
||||||
{
|
{
|
||||||
|
@ -2253,13 +2258,13 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
/* Enable UsageFault exception. */
|
/* Enable UsageFault exception. */
|
||||||
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
||||||
|
|
||||||
#if( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if( configENABLE_BTI == 1 )
|
#if ( configENABLE_BTI == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,16 +77,16 @@
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configTOTAL_MPU_REGIONS == 16 )
|
#if ( configTOTAL_MPU_REGIONS == 16 )
|
||||||
" movs r3, #8 \n" /* r3 = 8. */
|
" movs r3, #8 \n" /* r3 = 8. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 8. */
|
" str r3, [r1] \n" /* Program RNR = 8. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" movs r3, #12 \n" /* r3 = 12. */
|
" movs r3, #12 \n" /* r3 = 12. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 12. */
|
" str r3, [r1] \n" /* Program RNR = 12. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 set of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
||||||
" \n"
|
" \n"
|
||||||
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
@ -100,14 +100,14 @@
|
||||||
" ldr r2, [r1] \n" /* r2 = Location of saved context in TCB. */
|
" ldr r2, [r1] \n" /* r2 = Location of saved context in TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_special_regs_first_task: \n"
|
" restore_special_regs_first_task: \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmdb r2!, {r3-r6} \n" /* Read task's dedicated PAC key from the task's context. */
|
" ldmdb r2!, {r3-r6} \n" /* Read task's dedicated PAC key from the task's context. */
|
||||||
" msr PAC_KEY_P_0, r3 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_0, r3 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_1, r4 \n"
|
" msr PAC_KEY_P_1, r4 \n"
|
||||||
" msr PAC_KEY_P_2, r5 \n"
|
" msr PAC_KEY_P_2, r5 \n"
|
||||||
" msr PAC_KEY_P_3, r6 \n"
|
" msr PAC_KEY_P_3, r6 \n"
|
||||||
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" ldmdb r2!, {r0, r3-r5, lr} \n" /* r0 = xSecureContext, r3 = original PSP, r4 = PSPLIM, r5 = CONTROL, LR restored. */
|
" ldmdb r2!, {r0, r3-r5, lr} \n" /* r0 = xSecureContext, r3 = original PSP, r4 = PSPLIM, r5 = CONTROL, LR restored. */
|
||||||
" msr psp, r3 \n"
|
" msr psp, r3 \n"
|
||||||
" msr psplim, r4 \n"
|
" msr psplim, r4 \n"
|
||||||
|
@ -140,14 +140,14 @@
|
||||||
" ldr r3, [r2] \n" /* Read pxCurrentTCB. */
|
" ldr r3, [r2] \n" /* Read pxCurrentTCB. */
|
||||||
" ldr r0, [r3] \n" /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
|
" ldr r0, [r3] \n" /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmia r0!, {r1-r4} \n" /* Read task's dedicated PAC key from stack. */
|
" ldmia r0!, {r1-r4} \n" /* Read task's dedicated PAC key from stack. */
|
||||||
" msr PAC_KEY_P_3, r1 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_3, r1 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_2, r2 \n"
|
" msr PAC_KEY_P_2, r2 \n"
|
||||||
" msr PAC_KEY_P_1, r3 \n"
|
" msr PAC_KEY_P_1, r3 \n"
|
||||||
" msr PAC_KEY_P_0, r4 \n"
|
" msr PAC_KEY_P_0, r4 \n"
|
||||||
" clrm {r1-r4} \n" /* Clear r1-r4. */
|
" clrm {r1-r4} \n" /* Clear r1-r4. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" \n"
|
" \n"
|
||||||
" ldm r0!, {r1-r3} \n" /* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */
|
" ldm r0!, {r1-r3} \n" /* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */
|
||||||
" ldr r4, =xSecureContext \n"
|
" ldr r4, =xSecureContext \n"
|
||||||
|
@ -297,15 +297,15 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" \n"
|
" \n"
|
||||||
" save_general_regs: \n"
|
" save_general_regs: \n"
|
||||||
" mrs r3, psp \n"
|
" mrs r3, psp \n"
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" add r3, r3, #0x20 \n" /* Move r3 to location where s0 is saved. */
|
" add r3, r3, #0x20 \n" /* Move r3 to location where s0 is saved. */
|
||||||
" tst lr, #0x10 \n"
|
" tst lr, #0x10 \n"
|
||||||
" ittt eq \n"
|
" ittt eq \n"
|
||||||
" vstmiaeq r2!, {s16-s31} \n" /* Store s16-s31. */
|
" vstmiaeq r2!, {s16-s31} \n" /* Store s16-s31. */
|
||||||
" vldmiaeq r3, {s0-s16} \n" /* Copy hardware saved FP context into s0-s16. */
|
" vldmiaeq r3, {s0-s16} \n" /* Copy hardware saved FP context into s0-s16. */
|
||||||
" vstmiaeq r2!, {s0-s16} \n" /* Store hardware saved FP context. */
|
" vstmiaeq r2!, {s0-s16} \n" /* Store hardware saved FP context. */
|
||||||
" sub r3, r3, #0x20 \n" /* Set r3 back to the location of hardware saved context. */
|
" sub r3, r3, #0x20 \n" /* Set r3 back to the location of hardware saved context. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" stmia r2!, {r4-r11} \n" /* Store r4-r11. */
|
" stmia r2!, {r4-r11} \n" /* Store r4-r11. */
|
||||||
" ldmia r3, {r4-r11} \n" /* Copy the hardware saved context into r4-r11. */
|
" ldmia r3, {r4-r11} \n" /* Copy the hardware saved context into r4-r11. */
|
||||||
" stmia r2!, {r4-r11} \n" /* Store the hardware saved context. */
|
" stmia r2!, {r4-r11} \n" /* Store the hardware saved context. */
|
||||||
|
@ -315,15 +315,15 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" mrs r4, psplim \n" /* r4 = PSPLIM. */
|
" mrs r4, psplim \n" /* r4 = PSPLIM. */
|
||||||
" mrs r5, control \n" /* r5 = CONTROL. */
|
" mrs r5, control \n" /* r5 = CONTROL. */
|
||||||
" stmia r2!, {r0, r3-r5, lr} \n" /* Store xSecureContext, original PSP (after hardware has saved context), PSPLIM, CONTROL and LR. */
|
" stmia r2!, {r0, r3-r5, lr} \n" /* Store xSecureContext, original PSP (after hardware has saved context), PSPLIM, CONTROL and LR. */
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" mrs r3, PAC_KEY_P_0 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
" mrs r3, PAC_KEY_P_0 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
||||||
" mrs r4, PAC_KEY_P_1 \n"
|
" mrs r4, PAC_KEY_P_1 \n"
|
||||||
" mrs r5, PAC_KEY_P_2 \n"
|
" mrs r5, PAC_KEY_P_2 \n"
|
||||||
" mrs r6, PAC_KEY_P_3 \n"
|
" mrs r6, PAC_KEY_P_3 \n"
|
||||||
" stmia r2!, {r3-r6} \n" /* Store the task's dedicated PAC key on the task's context. */
|
" stmia r2!, {r3-r6} \n" /* Store the task's dedicated PAC key on the task's context. */
|
||||||
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" str r2, [r1] \n" /* Save the location from where the context should be restored as the first member of TCB. */
|
" str r2, [r1] \n" /* Save the location from where the context should be restored as the first member of TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" select_next_task: \n"
|
" select_next_task: \n"
|
||||||
" mov r0, %0 \n" /* r0 = configMAX_SYSCALL_INTERRUPT_PRIORITY */
|
" mov r0, %0 \n" /* r0 = configMAX_SYSCALL_INTERRUPT_PRIORITY */
|
||||||
|
@ -358,16 +358,16 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configTOTAL_MPU_REGIONS == 16 )
|
#if ( configTOTAL_MPU_REGIONS == 16 )
|
||||||
" movs r3, #8 \n" /* r3 = 8. */
|
" movs r3, #8 \n" /* r3 = 8. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 8. */
|
" str r3, [r1] \n" /* Program RNR = 8. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" movs r3, #12 \n" /* r3 = 12. */
|
" movs r3, #12 \n" /* r3 = 12. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 12. */
|
" str r3, [r1] \n" /* Program RNR = 12. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
||||||
" \n"
|
" \n"
|
||||||
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
@ -381,14 +381,14 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldr r2, [r1] \n" /* r2 = Location of saved context in TCB. */
|
" ldr r2, [r1] \n" /* r2 = Location of saved context in TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_special_regs: \n"
|
" restore_special_regs: \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmdb r2!, {r3-r6} \n" /* Read task's dedicated PAC key from the task's context. */
|
" ldmdb r2!, {r3-r6} \n" /* Read task's dedicated PAC key from the task's context. */
|
||||||
" msr PAC_KEY_P_0, r3 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_0, r3 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_1, r4 \n"
|
" msr PAC_KEY_P_1, r4 \n"
|
||||||
" msr PAC_KEY_P_2, r5 \n"
|
" msr PAC_KEY_P_2, r5 \n"
|
||||||
" msr PAC_KEY_P_3, r6 \n"
|
" msr PAC_KEY_P_3, r6 \n"
|
||||||
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" ldmdb r2!, {r0, r3-r5, lr} \n" /* r0 = xSecureContext, r3 = original PSP, r4 = PSPLIM, r5 = CONTROL, LR restored. */
|
" ldmdb r2!, {r0, r3-r5, lr} \n" /* r0 = xSecureContext, r3 = original PSP, r4 = PSPLIM, r5 = CONTROL, LR restored. */
|
||||||
" msr psp, r3 \n"
|
" msr psp, r3 \n"
|
||||||
" msr psplim, r4 \n"
|
" msr psplim, r4 \n"
|
||||||
|
@ -411,13 +411,13 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldmdb r2!, {r4-r11} \n" /* r4-r11 contain hardware saved context. */
|
" ldmdb r2!, {r4-r11} \n" /* r4-r11 contain hardware saved context. */
|
||||||
" stmia r3!, {r4-r11} \n" /* Copy the hardware saved context on the task stack. */
|
" stmia r3!, {r4-r11} \n" /* Copy the hardware saved context on the task stack. */
|
||||||
" ldmdb r2!, {r4-r11} \n" /* r4-r11 restored. */
|
" ldmdb r2!, {r4-r11} \n" /* r4-r11 restored. */
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" tst lr, #0x10 \n"
|
" tst lr, #0x10 \n"
|
||||||
" ittt eq \n"
|
" ittt eq \n"
|
||||||
" vldmdbeq r2!, {s0-s16} \n" /* s0-s16 contain hardware saved FP context. */
|
" vldmdbeq r2!, {s0-s16} \n" /* s0-s16 contain hardware saved FP context. */
|
||||||
" vstmiaeq r3!, {s0-s16} \n" /* Copy hardware saved FP context on the task stack. */
|
" vstmiaeq r3!, {s0-s16} \n" /* Copy hardware saved FP context on the task stack. */
|
||||||
" vldmdbeq r2!, {s16-s31} \n" /* Restore s16-s31. */
|
" vldmdbeq r2!, {s16-s31} \n" /* Restore s16-s31. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_context_done: \n"
|
" restore_context_done: \n"
|
||||||
" str r2, [r1] \n" /* Save the location where the context should be saved next as the first member of TCB. */
|
" str r2, [r1] \n" /* Save the location where the context should be saved next as the first member of TCB. */
|
||||||
|
@ -454,24 +454,24 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" bmi save_special_regs \n" /* If r3 < 0 ==> Bit[6] in EXC_RETURN is 1 ==> secure stack was used. */
|
" bmi save_special_regs \n" /* If r3 < 0 ==> Bit[6] in EXC_RETURN is 1 ==> secure stack was used. */
|
||||||
" \n"
|
" \n"
|
||||||
" save_general_regs: \n"
|
" save_general_regs: \n"
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
||||||
" it eq \n"
|
" it eq \n"
|
||||||
" vstmdbeq r2!, {s16-s31} \n" /* Store the additional FP context registers which are not saved automatically. */
|
" vstmdbeq r2!, {s16-s31} \n" /* Store the additional FP context registers which are not saved automatically. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" stmdb r2!, {r4-r11} \n" /* Store the registers that are not saved automatically. */
|
" stmdb r2!, {r4-r11} \n" /* Store the registers that are not saved automatically. */
|
||||||
" \n"
|
" \n"
|
||||||
" save_special_regs: \n"
|
" save_special_regs: \n"
|
||||||
" mrs r3, psplim \n" /* r3 = PSPLIM. */
|
" mrs r3, psplim \n" /* r3 = PSPLIM. */
|
||||||
" stmdb r2!, {r0, r3, lr} \n" /* Store xSecureContext, PSPLIM and LR on the stack. */
|
" stmdb r2!, {r0, r3, lr} \n" /* Store xSecureContext, PSPLIM and LR on the stack. */
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" mrs r3, PAC_KEY_P_3 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
" mrs r3, PAC_KEY_P_3 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
||||||
" mrs r4, PAC_KEY_P_2 \n"
|
" mrs r4, PAC_KEY_P_2 \n"
|
||||||
" mrs r5, PAC_KEY_P_1 \n"
|
" mrs r5, PAC_KEY_P_1 \n"
|
||||||
" mrs r6, PAC_KEY_P_0 \n"
|
" mrs r6, PAC_KEY_P_0 \n"
|
||||||
" stmdb r2!, {r3-r6} \n" /* Store the task's dedicated PAC key on the stack. */
|
" stmdb r2!, {r3-r6} \n" /* Store the task's dedicated PAC key on the stack. */
|
||||||
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" \n"
|
" \n"
|
||||||
" str r2, [r1] \n" /* Save the new top of stack in TCB. */
|
" str r2, [r1] \n" /* Save the new top of stack in TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
|
@ -490,14 +490,14 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldr r2, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. r2 now points to the top of stack. */
|
" ldr r2, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. r2 now points to the top of stack. */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_special_regs: \n"
|
" restore_special_regs: \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmia r2!, {r3-r6} \n" /* Read task's dedicated PAC key from stack. */
|
" ldmia r2!, {r3-r6} \n" /* Read task's dedicated PAC key from stack. */
|
||||||
" msr PAC_KEY_P_3, r3 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_3, r3 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_2, r4 \n"
|
" msr PAC_KEY_P_2, r4 \n"
|
||||||
" msr PAC_KEY_P_1, r5 \n"
|
" msr PAC_KEY_P_1, r5 \n"
|
||||||
" msr PAC_KEY_P_0, r6 \n"
|
" msr PAC_KEY_P_0, r6 \n"
|
||||||
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
" clrm {r3-r6} \n" /* Clear r3-r6. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" ldmia r2!, {r0, r3, lr} \n" /* Read from stack - r0 = xSecureContext, r3 = PSPLIM and LR restored. */
|
" ldmia r2!, {r0, r3, lr} \n" /* Read from stack - r0 = xSecureContext, r3 = PSPLIM and LR restored. */
|
||||||
" msr psplim, r3 \n" /* Restore the PSPLIM register value for the task. */
|
" msr psplim, r3 \n" /* Restore the PSPLIM register value for the task. */
|
||||||
" ldr r3, =xSecureContext \n" /* Read the location of xSecureContext i.e. &( xSecureContext ). */
|
" ldr r3, =xSecureContext \n" /* Read the location of xSecureContext i.e. &( xSecureContext ). */
|
||||||
|
@ -516,11 +516,11 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" \n"
|
" \n"
|
||||||
" restore_general_regs: \n"
|
" restore_general_regs: \n"
|
||||||
" ldmia r2!, {r4-r11} \n" /* Restore the registers that are not automatically restored. */
|
" ldmia r2!, {r4-r11} \n" /* Restore the registers that are not automatically restored. */
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
||||||
" it eq \n"
|
" it eq \n"
|
||||||
" vldmiaeq r2!, {s16-s31} \n" /* Restore the additional FP context registers which are not restored automatically. */
|
" vldmiaeq r2!, {s16-s31} \n" /* Restore the additional FP context registers which are not restored automatically. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_context_done: \n"
|
" restore_context_done: \n"
|
||||||
" msr psp, r2 \n" /* Remember the new top of stack for the task. */
|
" msr psp, r2 \n" /* Remember the new top of stack for the task. */
|
||||||
|
|
|
@ -243,54 +243,55 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
/*
|
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
/*
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
*
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
*
|
||||||
* 16 16 8 8 5 16 1
|
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
||||||
*/
|
* 16 16 8 8 5 16 1
|
||||||
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 70
|
#define MAX_CONTEXT_SIZE 70
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
||||||
* 16 16 8 8 5 1
|
* 16 16 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 54
|
#define MAX_CONTEXT_SIZE 54
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | | |
|
* | | | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
||||||
* 16 16 8 8 4 16 1
|
* 16 16 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 69
|
#define MAX_CONTEXT_SIZE 69
|
||||||
|
|
||||||
#else
|
#else /* if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | |
|
* | | | | PC, xPSR | EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><---->
|
* <-----------><--------------><---------><----------------><---------------------><---->
|
||||||
* 16 16 8 8 4 1
|
* 16 16 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 53
|
#define MAX_CONTEXT_SIZE 53
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
@ -299,54 +300,54 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><-----------><---->
|
* <---------><----------------><------------------------------><-----------><---->
|
||||||
* 8 8 5 16 1
|
* 8 8 5 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 38
|
#define MAX_CONTEXT_SIZE 38
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><---->
|
* <---------><----------------><------------------------------><---->
|
||||||
* 8 8 5 1
|
* 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 22
|
#define MAX_CONTEXT_SIZE 22
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | PC, xPSR | EXC_RETURN | | |
|
* | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><-----------><---->
|
* <---------><----------------><----------------------><-----------><---->
|
||||||
* 8 8 4 16 1
|
* 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 37
|
#define MAX_CONTEXT_SIZE 37
|
||||||
|
|
||||||
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | PC, xPSR | EXC_RETURN | |
|
* | | PC, xPSR | EXC_RETURN | |
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><---->
|
* <---------><----------------><----------------------><---->
|
||||||
* 8 8 4 1
|
* 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 21
|
#define MAX_CONTEXT_SIZE 21
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
|
@ -169,79 +169,80 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to manipulate the MPU.
|
* @brief Constants required to manipulate the MPU.
|
||||||
*/
|
*/
|
||||||
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
||||||
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
||||||
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
||||||
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
||||||
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
||||||
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
||||||
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
||||||
|
|
||||||
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
||||||
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
|
|
||||||
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
||||||
|
|
||||||
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
||||||
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
|
||||||
* region. */
|
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
||||||
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
* region. */
|
||||||
|
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
||||||
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
||||||
|
|
||||||
/* Enable privileged access to unmapped region. */
|
/* Enable privileged access to unmapped region. */
|
||||||
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
||||||
|
|
||||||
/* Enable MPU. */
|
/* Enable MPU. */
|
||||||
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
||||||
|
|
||||||
/* Expected value of the portMPU_TYPE register. */
|
/* Expected value of the portMPU_TYPE register. */
|
||||||
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
||||||
|
|
||||||
/* Extract first address of the MPU region as encoded in the
|
/* Extract first address of the MPU region as encoded in the
|
||||||
* RBAR (Region Base Address Register) value. */
|
* RBAR (Region Base Address Register) value. */
|
||||||
|
@ -380,14 +381,14 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to check and configure PACBTI security feature implementation.
|
* @brief Constants required to check and configure PACBTI security feature implementation.
|
||||||
*/
|
*/
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
||||||
|
|
||||||
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
||||||
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
||||||
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
||||||
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
||||||
|
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -409,7 +410,7 @@ static void prvTaskExitError( void );
|
||||||
* @return uint32_t Access permissions.
|
* @return uint32_t Access permissions.
|
||||||
*/
|
*/
|
||||||
static uint32_t prvGetRegionAccessPermissions( uint32_t ulRBARValue ) PRIVILEGED_FUNCTION;
|
static uint32_t prvGetRegionAccessPermissions( uint32_t ulRBARValue ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
|
||||||
|
@ -427,7 +428,7 @@ static void prvTaskExitError( void );
|
||||||
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_FPU */
|
#endif /* configENABLE_FPU */
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Configures PACBTI features.
|
* @brief Configures PACBTI features.
|
||||||
|
@ -890,7 +891,7 @@ static void prvTaskExitError( void )
|
||||||
return ulAccessPermissions;
|
return ulAccessPermissions;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
@ -1212,6 +1213,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __syscalls_flash_start__;
|
extern uint32_t * __syscalls_flash_start__;
|
||||||
|
@ -1282,6 +1284,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
||||||
* when we exit from the system call. */
|
* when we exit from the system call. */
|
||||||
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
||||||
|
|
||||||
/* Store the value of the PSPLIM register before the SVC was raised.
|
/* Store the value of the PSPLIM register before the SVC was raised.
|
||||||
* We need to restore it when we exit from the system call. */
|
* We need to restore it when we exit from the system call. */
|
||||||
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
||||||
|
@ -1300,6 +1303,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
|
|
||||||
/* Start executing the system call upon returning from this handler. */
|
/* Start executing the system call upon returning from this handler. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
||||||
|
|
||||||
/* Raise a request to exit from the system call upon finishing the
|
/* Raise a request to exit from the system call upon finishing the
|
||||||
* system call. */
|
* system call. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
||||||
|
@ -1359,6 +1363,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __privileged_functions_start__;
|
extern uint32_t * __privileged_functions_start__;
|
||||||
|
@ -1541,7 +1546,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
||||||
ulIndex++;
|
ulIndex++;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Check PACBTI security feature configuration before pushing the
|
/* Check PACBTI security feature configuration before pushing the
|
||||||
* CONTROL register's value on task's TCB. */
|
* CONTROL register's value on task's TCB. */
|
||||||
|
@ -1814,11 +1819,11 @@ BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
||||||
portNVIC_SHPR2_REG = 0;
|
portNVIC_SHPR2_REG = 0;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Set the CONTROL register value based on PACBTI security feature
|
/* Set the CONTROL register value based on PACBTI security feature
|
||||||
* configuration before starting the first task. */
|
* configuration before starting the first task. */
|
||||||
( void) prvConfigurePACBTI( pdTRUE );
|
( void ) prvConfigurePACBTI( pdTRUE );
|
||||||
}
|
}
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
|
|
||||||
|
@ -2018,9 +2023,9 @@ void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
if( xSchedulerRunning == pdFALSE )
|
if( xSchedulerRunning == pdFALSE )
|
||||||
{
|
{
|
||||||
/* Grant access to all the kernel objects before the scheduler
|
/* Grant access to all the kernel objects before the scheduler
|
||||||
* is started. It is necessary because there is no task running
|
* is started. It is necessary because there is no task running
|
||||||
* yet and therefore, we cannot use the permissions of any
|
* yet and therefore, we cannot use the permissions of any
|
||||||
* task. */
|
* task. */
|
||||||
xAccessGranted = pdTRUE;
|
xAccessGranted = pdTRUE;
|
||||||
}
|
}
|
||||||
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
||||||
|
@ -2241,7 +2246,7 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
||||||
{
|
{
|
||||||
|
@ -2253,13 +2258,13 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
/* Enable UsageFault exception. */
|
/* Enable UsageFault exception. */
|
||||||
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
||||||
|
|
||||||
#if( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if( configENABLE_BTI == 1 )
|
#if ( configENABLE_BTI == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,16 +77,16 @@
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configTOTAL_MPU_REGIONS == 16 )
|
#if ( configTOTAL_MPU_REGIONS == 16 )
|
||||||
" movs r3, #8 \n" /* r3 = 8. */
|
" movs r3, #8 \n" /* r3 = 8. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 8. */
|
" str r3, [r1] \n" /* Program RNR = 8. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" movs r3, #12 \n" /* r3 = 12. */
|
" movs r3, #12 \n" /* r3 = 12. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 12. */
|
" str r3, [r1] \n" /* Program RNR = 12. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
||||||
" \n"
|
" \n"
|
||||||
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
@ -100,14 +100,14 @@
|
||||||
" ldr r1, [r0] \n" /* r1 = Location of saved context in TCB. */
|
" ldr r1, [r0] \n" /* r1 = Location of saved context in TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_special_regs_first_task: \n"
|
" restore_special_regs_first_task: \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmdb r1!, {r2-r5} \n" /* Read task's dedicated PAC key from the task's context. */
|
" ldmdb r1!, {r2-r5} \n" /* Read task's dedicated PAC key from the task's context. */
|
||||||
" msr PAC_KEY_P_0, r2 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_0, r2 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_1, r3 \n"
|
" msr PAC_KEY_P_1, r3 \n"
|
||||||
" msr PAC_KEY_P_2, r4 \n"
|
" msr PAC_KEY_P_2, r4 \n"
|
||||||
" msr PAC_KEY_P_3, r5 \n"
|
" msr PAC_KEY_P_3, r5 \n"
|
||||||
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" ldmdb r1!, {r2-r4, lr} \n" /* r2 = original PSP, r3 = PSPLIM, r4 = CONTROL, LR restored. */
|
" ldmdb r1!, {r2-r4, lr} \n" /* r2 = original PSP, r3 = PSPLIM, r4 = CONTROL, LR restored. */
|
||||||
" msr psp, r2 \n"
|
" msr psp, r2 \n"
|
||||||
" msr psplim, r3 \n"
|
" msr psplim, r3 \n"
|
||||||
|
@ -138,14 +138,14 @@
|
||||||
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
||||||
" ldr r0, [r1] \n" /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
|
" ldr r0, [r1] \n" /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmia r0!, {r1-r4} \n" /* Read task's dedicated PAC key from stack. */
|
" ldmia r0!, {r1-r4} \n" /* Read task's dedicated PAC key from stack. */
|
||||||
" msr PAC_KEY_P_3, r1 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_3, r1 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_2, r2 \n"
|
" msr PAC_KEY_P_2, r2 \n"
|
||||||
" msr PAC_KEY_P_1, r3 \n"
|
" msr PAC_KEY_P_1, r3 \n"
|
||||||
" msr PAC_KEY_P_0, r4 \n"
|
" msr PAC_KEY_P_0, r4 \n"
|
||||||
" clrm {r1-r4} \n" /* Clear r1-r4. */
|
" clrm {r1-r4} \n" /* Clear r1-r4. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" \n"
|
" \n"
|
||||||
" ldm r0!, {r1-r2} \n" /* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */
|
" ldm r0!, {r1-r2} \n" /* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */
|
||||||
" msr psplim, r1 \n" /* Set this task's PSPLIM value. */
|
" msr psplim, r1 \n" /* Set this task's PSPLIM value. */
|
||||||
|
@ -278,15 +278,15 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" mrs r2, psp \n" /* r2 = PSP. */
|
" mrs r2, psp \n" /* r2 = PSP. */
|
||||||
" \n"
|
" \n"
|
||||||
" save_general_regs: \n"
|
" save_general_regs: \n"
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" add r2, r2, #0x20 \n" /* Move r2 to location where s0 is saved. */
|
" add r2, r2, #0x20 \n" /* Move r2 to location where s0 is saved. */
|
||||||
" tst lr, #0x10 \n"
|
" tst lr, #0x10 \n"
|
||||||
" ittt eq \n"
|
" ittt eq \n"
|
||||||
" vstmiaeq r1!, {s16-s31} \n" /* Store s16-s31. */
|
" vstmiaeq r1!, {s16-s31} \n" /* Store s16-s31. */
|
||||||
" vldmiaeq r2, {s0-s16} \n" /* Copy hardware saved FP context into s0-s16. */
|
" vldmiaeq r2, {s0-s16} \n" /* Copy hardware saved FP context into s0-s16. */
|
||||||
" vstmiaeq r1!, {s0-s16} \n" /* Store hardware saved FP context. */
|
" vstmiaeq r1!, {s0-s16} \n" /* Store hardware saved FP context. */
|
||||||
" sub r2, r2, #0x20 \n" /* Set r2 back to the location of hardware saved context. */
|
" sub r2, r2, #0x20 \n" /* Set r2 back to the location of hardware saved context. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" stmia r1!, {r4-r11} \n" /* Store r4-r11. */
|
" stmia r1!, {r4-r11} \n" /* Store r4-r11. */
|
||||||
" ldmia r2, {r4-r11} \n" /* Copy the hardware saved context into r4-r11. */
|
" ldmia r2, {r4-r11} \n" /* Copy the hardware saved context into r4-r11. */
|
||||||
" stmia r1!, {r4-r11} \n" /* Store the hardware saved context. */
|
" stmia r1!, {r4-r11} \n" /* Store the hardware saved context. */
|
||||||
|
@ -295,14 +295,14 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" mrs r3, psplim \n" /* r3 = PSPLIM. */
|
" mrs r3, psplim \n" /* r3 = PSPLIM. */
|
||||||
" mrs r4, control \n" /* r4 = CONTROL. */
|
" mrs r4, control \n" /* r4 = CONTROL. */
|
||||||
" stmia r1!, {r2-r4, lr} \n" /* Store original PSP (after hardware has saved context), PSPLIM, CONTROL and LR. */
|
" stmia r1!, {r2-r4, lr} \n" /* Store original PSP (after hardware has saved context), PSPLIM, CONTROL and LR. */
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" mrs r2, PAC_KEY_P_0 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
" mrs r2, PAC_KEY_P_0 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
||||||
" mrs r3, PAC_KEY_P_1 \n"
|
" mrs r3, PAC_KEY_P_1 \n"
|
||||||
" mrs r4, PAC_KEY_P_2 \n"
|
" mrs r4, PAC_KEY_P_2 \n"
|
||||||
" mrs r5, PAC_KEY_P_3 \n"
|
" mrs r5, PAC_KEY_P_3 \n"
|
||||||
" stmia r1!, {r2-r5} \n" /* Store the task's dedicated PAC key on the task's context. */
|
" stmia r1!, {r2-r5} \n" /* Store the task's dedicated PAC key on the task's context. */
|
||||||
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" str r1, [r0] \n" /* Save the location from where the context should be restored as the first member of TCB. */
|
" str r1, [r0] \n" /* Save the location from where the context should be restored as the first member of TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" select_next_task: \n"
|
" select_next_task: \n"
|
||||||
|
@ -338,16 +338,16 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configTOTAL_MPU_REGIONS == 16 )
|
#if ( configTOTAL_MPU_REGIONS == 16 )
|
||||||
" movs r3, #8 \n" /* r3 = 8. */
|
" movs r3, #8 \n" /* r3 = 8. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 8. */
|
" str r3, [r1] \n" /* Program RNR = 8. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
" movs r3, #12 \n" /* r3 = 12. */
|
" movs r3, #12 \n" /* r3 = 12. */
|
||||||
" str r3, [r1] \n" /* Program RNR = 12. */
|
" str r3, [r1] \n" /* Program RNR = 12. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
" ldmia r0!, {r4-r11} \n" /* Read 4 sets of RBAR/RLAR registers from TCB. */
|
||||||
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
" stmia r2, {r4-r11} \n" /* Write 4 set of RBAR/RLAR registers using alias registers. */
|
||||||
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
#endif /* configTOTAL_MPU_REGIONS == 16 */
|
||||||
" \n"
|
" \n"
|
||||||
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
" ldr r1, =0xe000ed94 \n" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */
|
||||||
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
" ldr r2, [r1] \n" /* Read the value of MPU_CTRL. */
|
||||||
|
@ -361,14 +361,14 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldr r1, [r0] \n" /* r1 = Location of saved context in TCB. */
|
" ldr r1, [r0] \n" /* r1 = Location of saved context in TCB. */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_special_regs: \n"
|
" restore_special_regs: \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmdb r1!, {r2-r5} \n" /* Read task's dedicated PAC key from the task's context. */
|
" ldmdb r1!, {r2-r5} \n" /* Read task's dedicated PAC key from the task's context. */
|
||||||
" msr PAC_KEY_P_0, r2 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_0, r2 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_1, r3 \n"
|
" msr PAC_KEY_P_1, r3 \n"
|
||||||
" msr PAC_KEY_P_2, r4 \n"
|
" msr PAC_KEY_P_2, r4 \n"
|
||||||
" msr PAC_KEY_P_3, r5 \n"
|
" msr PAC_KEY_P_3, r5 \n"
|
||||||
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" ldmdb r1!, {r2-r4, lr} \n" /* r2 = original PSP, r3 = PSPLIM, r4 = CONTROL, LR restored. */
|
" ldmdb r1!, {r2-r4, lr} \n" /* r2 = original PSP, r3 = PSPLIM, r4 = CONTROL, LR restored. */
|
||||||
" msr psp, r2 \n"
|
" msr psp, r2 \n"
|
||||||
" msr psplim, r3 \n"
|
" msr psplim, r3 \n"
|
||||||
|
@ -378,13 +378,13 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldmdb r1!, {r4-r11} \n" /* r4-r11 contain hardware saved context. */
|
" ldmdb r1!, {r4-r11} \n" /* r4-r11 contain hardware saved context. */
|
||||||
" stmia r2!, {r4-r11} \n" /* Copy the hardware saved context on the task stack. */
|
" stmia r2!, {r4-r11} \n" /* Copy the hardware saved context on the task stack. */
|
||||||
" ldmdb r1!, {r4-r11} \n" /* r4-r11 restored. */
|
" ldmdb r1!, {r4-r11} \n" /* r4-r11 restored. */
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" tst lr, #0x10 \n"
|
" tst lr, #0x10 \n"
|
||||||
" ittt eq \n"
|
" ittt eq \n"
|
||||||
" vldmdbeq r1!, {s0-s16} \n" /* s0-s16 contain hardware saved FP context. */
|
" vldmdbeq r1!, {s0-s16} \n" /* s0-s16 contain hardware saved FP context. */
|
||||||
" vstmiaeq r2!, {s0-s16} \n" /* Copy hardware saved FP context on the task stack. */
|
" vstmiaeq r2!, {s0-s16} \n" /* Copy hardware saved FP context on the task stack. */
|
||||||
" vldmdbeq r1!, {s16-s31} \n" /* Restore s16-s31. */
|
" vldmdbeq r1!, {s16-s31} \n" /* Restore s16-s31. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" \n"
|
" \n"
|
||||||
" restore_context_done: \n"
|
" restore_context_done: \n"
|
||||||
" str r1, [r0] \n" /* Save the location where the context should be saved next as the first member of TCB. */
|
" str r1, [r0] \n" /* Save the location where the context should be saved next as the first member of TCB. */
|
||||||
|
@ -403,24 +403,24 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" \n"
|
" \n"
|
||||||
" mrs r0, psp \n" /* Read PSP in r0. */
|
" mrs r0, psp \n" /* Read PSP in r0. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
" tst lr, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
||||||
" it eq \n"
|
" it eq \n"
|
||||||
" vstmdbeq r0!, {s16-s31} \n" /* Store the additional FP context registers which are not saved automatically. */
|
" vstmdbeq r0!, {s16-s31} \n" /* Store the additional FP context registers which are not saved automatically. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" \n"
|
" \n"
|
||||||
" mrs r2, psplim \n" /* r2 = PSPLIM. */
|
" mrs r2, psplim \n" /* r2 = PSPLIM. */
|
||||||
" mov r3, lr \n" /* r3 = LR/EXC_RETURN. */
|
" mov r3, lr \n" /* r3 = LR/EXC_RETURN. */
|
||||||
" stmdb r0!, {r2-r11} \n" /* Store on the stack - PSPLIM, LR and registers that are not automatically saved. */
|
" stmdb r0!, {r2-r11} \n" /* Store on the stack - PSPLIM, LR and registers that are not automatically saved. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" mrs r1, PAC_KEY_P_3 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
" mrs r1, PAC_KEY_P_3 \n" /* Read task's dedicated PAC key from the PAC key registers. */
|
||||||
" mrs r2, PAC_KEY_P_2 \n"
|
" mrs r2, PAC_KEY_P_2 \n"
|
||||||
" mrs r3, PAC_KEY_P_1 \n"
|
" mrs r3, PAC_KEY_P_1 \n"
|
||||||
" mrs r4, PAC_KEY_P_0 \n"
|
" mrs r4, PAC_KEY_P_0 \n"
|
||||||
" stmdb r0!, {r1-r4} \n" /* Store the task's dedicated PAC key on the stack. */
|
" stmdb r0!, {r1-r4} \n" /* Store the task's dedicated PAC key on the stack. */
|
||||||
" clrm {r1-r4} \n" /* Clear r1-r4. */
|
" clrm {r1-r4} \n" /* Clear r1-r4. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" \n"
|
" \n"
|
||||||
" ldr r2, =pxCurrentTCB \n" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
" ldr r2, =pxCurrentTCB \n" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */
|
||||||
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
||||||
|
@ -438,22 +438,22 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
" ldr r1, [r2] \n" /* Read pxCurrentTCB. */
|
||||||
" ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */
|
" ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
" ldmia r0!, {r2-r5} \n" /* Read task's dedicated PAC key from stack. */
|
" ldmia r0!, {r2-r5} \n" /* Read task's dedicated PAC key from stack. */
|
||||||
" msr PAC_KEY_P_3, r2 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
" msr PAC_KEY_P_3, r2 \n" /* Write the task's dedicated PAC key to the PAC key registers. */
|
||||||
" msr PAC_KEY_P_2, r3 \n"
|
" msr PAC_KEY_P_2, r3 \n"
|
||||||
" msr PAC_KEY_P_1, r4 \n"
|
" msr PAC_KEY_P_1, r4 \n"
|
||||||
" msr PAC_KEY_P_0, r5 \n"
|
" msr PAC_KEY_P_0, r5 \n"
|
||||||
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
" clrm {r2-r5} \n" /* Clear r2-r5. */
|
||||||
#endif /* configENABLE_PAC */
|
#endif /* configENABLE_PAC */
|
||||||
" \n"
|
" \n"
|
||||||
" ldmia r0!, {r2-r11} \n" /* Read from stack - r2 = PSPLIM, r3 = LR and r4-r11 restored. */
|
" ldmia r0!, {r2-r11} \n" /* Read from stack - r2 = PSPLIM, r3 = LR and r4-r11 restored. */
|
||||||
" \n"
|
" \n"
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
" tst r3, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
" tst r3, #0x10 \n" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */
|
||||||
" it eq \n"
|
" it eq \n"
|
||||||
" vldmiaeq r0!, {s16-s31} \n" /* Restore the additional FP context registers which are not restored automatically. */
|
" vldmiaeq r0!, {s16-s31} \n" /* Restore the additional FP context registers which are not restored automatically. */
|
||||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||||
" \n"
|
" \n"
|
||||||
" msr psplim, r2 \n" /* Restore the PSPLIM register value for the task. */
|
" msr psplim, r2 \n" /* Restore the PSPLIM register value for the task. */
|
||||||
" msr psp, r0 \n" /* Remember the new top of stack for the task. */
|
" msr psp, r0 \n" /* Remember the new top of stack for the task. */
|
||||||
|
|
|
@ -243,54 +243,55 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
/*
|
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
/*
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
*
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
*
|
||||||
* 16 16 8 8 5 16 1
|
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
||||||
*/
|
* 16 16 8 8 5 16 1
|
||||||
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 70
|
#define MAX_CONTEXT_SIZE 70
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
||||||
* 16 16 8 8 5 1
|
* 16 16 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 54
|
#define MAX_CONTEXT_SIZE 54
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | | |
|
* | | | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
||||||
* 16 16 8 8 4 16 1
|
* 16 16 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 69
|
#define MAX_CONTEXT_SIZE 69
|
||||||
|
|
||||||
#else
|
#else /* if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | |
|
* | | | | PC, xPSR | EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><---->
|
* <-----------><--------------><---------><----------------><---------------------><---->
|
||||||
* 16 16 8 8 4 1
|
* 16 16 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 53
|
#define MAX_CONTEXT_SIZE 53
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
@ -299,54 +300,54 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><-----------><---->
|
* <---------><----------------><------------------------------><-----------><---->
|
||||||
* 8 8 5 16 1
|
* 8 8 5 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 38
|
#define MAX_CONTEXT_SIZE 38
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><---->
|
* <---------><----------------><------------------------------><---->
|
||||||
* 8 8 5 1
|
* 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 22
|
#define MAX_CONTEXT_SIZE 22
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | PC, xPSR | EXC_RETURN | | |
|
* | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><-----------><---->
|
* <---------><----------------><----------------------><-----------><---->
|
||||||
* 8 8 4 16 1
|
* 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 37
|
#define MAX_CONTEXT_SIZE 37
|
||||||
|
|
||||||
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | PC, xPSR | EXC_RETURN | |
|
* | | PC, xPSR | EXC_RETURN | |
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><---->
|
* <---------><----------------><----------------------><---->
|
||||||
* 8 8 4 1
|
* 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 21
|
#define MAX_CONTEXT_SIZE 21
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
|
@ -169,79 +169,80 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to manipulate the MPU.
|
* @brief Constants required to manipulate the MPU.
|
||||||
*/
|
*/
|
||||||
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
||||||
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
||||||
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
||||||
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
||||||
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
||||||
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
||||||
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
||||||
|
|
||||||
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
||||||
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
|
|
||||||
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
||||||
|
|
||||||
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
||||||
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
|
||||||
* region. */
|
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
||||||
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
* region. */
|
||||||
|
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
||||||
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
||||||
|
|
||||||
/* Enable privileged access to unmapped region. */
|
/* Enable privileged access to unmapped region. */
|
||||||
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
||||||
|
|
||||||
/* Enable MPU. */
|
/* Enable MPU. */
|
||||||
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
||||||
|
|
||||||
/* Expected value of the portMPU_TYPE register. */
|
/* Expected value of the portMPU_TYPE register. */
|
||||||
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
||||||
|
|
||||||
/* Extract first address of the MPU region as encoded in the
|
/* Extract first address of the MPU region as encoded in the
|
||||||
* RBAR (Region Base Address Register) value. */
|
* RBAR (Region Base Address Register) value. */
|
||||||
|
@ -380,14 +381,14 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to check and configure PACBTI security feature implementation.
|
* @brief Constants required to check and configure PACBTI security feature implementation.
|
||||||
*/
|
*/
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
||||||
|
|
||||||
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
||||||
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
||||||
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
||||||
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
||||||
|
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -409,7 +410,7 @@ static void prvTaskExitError( void );
|
||||||
* @return uint32_t Access permissions.
|
* @return uint32_t Access permissions.
|
||||||
*/
|
*/
|
||||||
static uint32_t prvGetRegionAccessPermissions( uint32_t ulRBARValue ) PRIVILEGED_FUNCTION;
|
static uint32_t prvGetRegionAccessPermissions( uint32_t ulRBARValue ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
|
||||||
|
@ -427,7 +428,7 @@ static void prvTaskExitError( void );
|
||||||
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_FPU */
|
#endif /* configENABLE_FPU */
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Configures PACBTI features.
|
* @brief Configures PACBTI features.
|
||||||
|
@ -890,7 +891,7 @@ static void prvTaskExitError( void )
|
||||||
return ulAccessPermissions;
|
return ulAccessPermissions;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
@ -1212,6 +1213,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __syscalls_flash_start__;
|
extern uint32_t * __syscalls_flash_start__;
|
||||||
|
@ -1282,6 +1284,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
||||||
* when we exit from the system call. */
|
* when we exit from the system call. */
|
||||||
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
||||||
|
|
||||||
/* Store the value of the PSPLIM register before the SVC was raised.
|
/* Store the value of the PSPLIM register before the SVC was raised.
|
||||||
* We need to restore it when we exit from the system call. */
|
* We need to restore it when we exit from the system call. */
|
||||||
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
||||||
|
@ -1300,6 +1303,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
|
|
||||||
/* Start executing the system call upon returning from this handler. */
|
/* Start executing the system call upon returning from this handler. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
||||||
|
|
||||||
/* Raise a request to exit from the system call upon finishing the
|
/* Raise a request to exit from the system call upon finishing the
|
||||||
* system call. */
|
* system call. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
||||||
|
@ -1359,6 +1363,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __privileged_functions_start__;
|
extern uint32_t * __privileged_functions_start__;
|
||||||
|
@ -1541,7 +1546,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
||||||
ulIndex++;
|
ulIndex++;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Check PACBTI security feature configuration before pushing the
|
/* Check PACBTI security feature configuration before pushing the
|
||||||
* CONTROL register's value on task's TCB. */
|
* CONTROL register's value on task's TCB. */
|
||||||
|
@ -1814,11 +1819,11 @@ BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
||||||
portNVIC_SHPR2_REG = 0;
|
portNVIC_SHPR2_REG = 0;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Set the CONTROL register value based on PACBTI security feature
|
/* Set the CONTROL register value based on PACBTI security feature
|
||||||
* configuration before starting the first task. */
|
* configuration before starting the first task. */
|
||||||
( void) prvConfigurePACBTI( pdTRUE );
|
( void ) prvConfigurePACBTI( pdTRUE );
|
||||||
}
|
}
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
|
|
||||||
|
@ -2018,9 +2023,9 @@ void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
if( xSchedulerRunning == pdFALSE )
|
if( xSchedulerRunning == pdFALSE )
|
||||||
{
|
{
|
||||||
/* Grant access to all the kernel objects before the scheduler
|
/* Grant access to all the kernel objects before the scheduler
|
||||||
* is started. It is necessary because there is no task running
|
* is started. It is necessary because there is no task running
|
||||||
* yet and therefore, we cannot use the permissions of any
|
* yet and therefore, we cannot use the permissions of any
|
||||||
* task. */
|
* task. */
|
||||||
xAccessGranted = pdTRUE;
|
xAccessGranted = pdTRUE;
|
||||||
}
|
}
|
||||||
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
||||||
|
@ -2241,7 +2246,7 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
||||||
{
|
{
|
||||||
|
@ -2253,13 +2258,13 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
/* Enable UsageFault exception. */
|
/* Enable UsageFault exception. */
|
||||||
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
||||||
|
|
||||||
#if( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if( configENABLE_BTI == 1 )
|
#if ( configENABLE_BTI == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,7 +64,7 @@
|
||||||
|
|
||||||
#ifndef configENABLE_MVE
|
#ifndef configENABLE_MVE
|
||||||
#define configENABLE_MVE 0
|
#define configENABLE_MVE 0
|
||||||
#elif( configENABLE_MVE != 0 )
|
#elif ( configENABLE_MVE != 0 )
|
||||||
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M23.
|
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M23.
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
|
@ -243,54 +243,55 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
/*
|
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
/*
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
*
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
*
|
||||||
* 16 16 8 8 5 16 1
|
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
||||||
*/
|
* 16 16 8 8 5 16 1
|
||||||
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 70
|
#define MAX_CONTEXT_SIZE 70
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
||||||
* 16 16 8 8 5 1
|
* 16 16 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 54
|
#define MAX_CONTEXT_SIZE 54
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | | |
|
* | | | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
||||||
* 16 16 8 8 4 16 1
|
* 16 16 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 69
|
#define MAX_CONTEXT_SIZE 69
|
||||||
|
|
||||||
#else
|
#else /* if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | |
|
* | | | | PC, xPSR | EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><---->
|
* <-----------><--------------><---------><----------------><---------------------><---->
|
||||||
* 16 16 8 8 4 1
|
* 16 16 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 53
|
#define MAX_CONTEXT_SIZE 53
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
@ -299,54 +300,54 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><-----------><---->
|
* <---------><----------------><------------------------------><-----------><---->
|
||||||
* 8 8 5 16 1
|
* 8 8 5 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 38
|
#define MAX_CONTEXT_SIZE 38
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><---->
|
* <---------><----------------><------------------------------><---->
|
||||||
* 8 8 5 1
|
* 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 22
|
#define MAX_CONTEXT_SIZE 22
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | PC, xPSR | EXC_RETURN | | |
|
* | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><-----------><---->
|
* <---------><----------------><----------------------><-----------><---->
|
||||||
* 8 8 4 16 1
|
* 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 37
|
#define MAX_CONTEXT_SIZE 37
|
||||||
|
|
||||||
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | PC, xPSR | EXC_RETURN | |
|
* | | PC, xPSR | EXC_RETURN | |
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><---->
|
* <---------><----------------><----------------------><---->
|
||||||
* 8 8 4 1
|
* 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 21
|
#define MAX_CONTEXT_SIZE 21
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
|
@ -169,79 +169,80 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to manipulate the MPU.
|
* @brief Constants required to manipulate the MPU.
|
||||||
*/
|
*/
|
||||||
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
||||||
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
||||||
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
||||||
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
||||||
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
||||||
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
||||||
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
||||||
|
|
||||||
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
||||||
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
|
|
||||||
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
||||||
|
|
||||||
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
||||||
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
|
||||||
* region. */
|
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
||||||
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
* region. */
|
||||||
|
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
||||||
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
||||||
|
|
||||||
/* Enable privileged access to unmapped region. */
|
/* Enable privileged access to unmapped region. */
|
||||||
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
||||||
|
|
||||||
/* Enable MPU. */
|
/* Enable MPU. */
|
||||||
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
||||||
|
|
||||||
/* Expected value of the portMPU_TYPE register. */
|
/* Expected value of the portMPU_TYPE register. */
|
||||||
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
||||||
|
|
||||||
/* Extract first address of the MPU region as encoded in the
|
/* Extract first address of the MPU region as encoded in the
|
||||||
* RBAR (Region Base Address Register) value. */
|
* RBAR (Region Base Address Register) value. */
|
||||||
|
@ -380,14 +381,14 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to check and configure PACBTI security feature implementation.
|
* @brief Constants required to check and configure PACBTI security feature implementation.
|
||||||
*/
|
*/
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
||||||
|
|
||||||
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
||||||
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
||||||
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
||||||
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
||||||
|
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -409,7 +410,7 @@ static void prvTaskExitError( void );
|
||||||
* @return uint32_t Access permissions.
|
* @return uint32_t Access permissions.
|
||||||
*/
|
*/
|
||||||
static uint32_t prvGetRegionAccessPermissions( uint32_t ulRBARValue ) PRIVILEGED_FUNCTION;
|
static uint32_t prvGetRegionAccessPermissions( uint32_t ulRBARValue ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
|
||||||
|
@ -427,7 +428,7 @@ static void prvTaskExitError( void );
|
||||||
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_FPU */
|
#endif /* configENABLE_FPU */
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Configures PACBTI features.
|
* @brief Configures PACBTI features.
|
||||||
|
@ -890,7 +891,7 @@ static void prvTaskExitError( void )
|
||||||
return ulAccessPermissions;
|
return ulAccessPermissions;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
@ -1212,6 +1213,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __syscalls_flash_start__;
|
extern uint32_t * __syscalls_flash_start__;
|
||||||
|
@ -1282,6 +1284,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
||||||
* when we exit from the system call. */
|
* when we exit from the system call. */
|
||||||
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
||||||
|
|
||||||
/* Store the value of the PSPLIM register before the SVC was raised.
|
/* Store the value of the PSPLIM register before the SVC was raised.
|
||||||
* We need to restore it when we exit from the system call. */
|
* We need to restore it when we exit from the system call. */
|
||||||
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
||||||
|
@ -1300,6 +1303,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
|
|
||||||
/* Start executing the system call upon returning from this handler. */
|
/* Start executing the system call upon returning from this handler. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
||||||
|
|
||||||
/* Raise a request to exit from the system call upon finishing the
|
/* Raise a request to exit from the system call upon finishing the
|
||||||
* system call. */
|
* system call. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
||||||
|
@ -1359,6 +1363,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __privileged_functions_start__;
|
extern uint32_t * __privileged_functions_start__;
|
||||||
|
@ -1541,7 +1546,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
||||||
ulIndex++;
|
ulIndex++;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Check PACBTI security feature configuration before pushing the
|
/* Check PACBTI security feature configuration before pushing the
|
||||||
* CONTROL register's value on task's TCB. */
|
* CONTROL register's value on task's TCB. */
|
||||||
|
@ -1814,11 +1819,11 @@ BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
||||||
portNVIC_SHPR2_REG = 0;
|
portNVIC_SHPR2_REG = 0;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Set the CONTROL register value based on PACBTI security feature
|
/* Set the CONTROL register value based on PACBTI security feature
|
||||||
* configuration before starting the first task. */
|
* configuration before starting the first task. */
|
||||||
( void) prvConfigurePACBTI( pdTRUE );
|
( void ) prvConfigurePACBTI( pdTRUE );
|
||||||
}
|
}
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
|
|
||||||
|
@ -2018,9 +2023,9 @@ void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
if( xSchedulerRunning == pdFALSE )
|
if( xSchedulerRunning == pdFALSE )
|
||||||
{
|
{
|
||||||
/* Grant access to all the kernel objects before the scheduler
|
/* Grant access to all the kernel objects before the scheduler
|
||||||
* is started. It is necessary because there is no task running
|
* is started. It is necessary because there is no task running
|
||||||
* yet and therefore, we cannot use the permissions of any
|
* yet and therefore, we cannot use the permissions of any
|
||||||
* task. */
|
* task. */
|
||||||
xAccessGranted = pdTRUE;
|
xAccessGranted = pdTRUE;
|
||||||
}
|
}
|
||||||
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
||||||
|
@ -2241,7 +2246,7 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
||||||
{
|
{
|
||||||
|
@ -2253,13 +2258,13 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
/* Enable UsageFault exception. */
|
/* Enable UsageFault exception. */
|
||||||
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
||||||
|
|
||||||
#if( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if( configENABLE_BTI == 1 )
|
#if ( configENABLE_BTI == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,7 +64,7 @@
|
||||||
|
|
||||||
#ifndef configENABLE_MVE
|
#ifndef configENABLE_MVE
|
||||||
#define configENABLE_MVE 0
|
#define configENABLE_MVE 0
|
||||||
#elif( configENABLE_MVE != 0 )
|
#elif ( configENABLE_MVE != 0 )
|
||||||
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M23.
|
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M23.
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
|
@ -243,54 +243,55 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
/*
|
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
/*
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
*
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
*
|
||||||
* 16 16 8 8 5 16 1
|
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
||||||
*/
|
* 16 16 8 8 5 16 1
|
||||||
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 70
|
#define MAX_CONTEXT_SIZE 70
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
||||||
* 16 16 8 8 5 1
|
* 16 16 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 54
|
#define MAX_CONTEXT_SIZE 54
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | | |
|
* | | | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
||||||
* 16 16 8 8 4 16 1
|
* 16 16 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 69
|
#define MAX_CONTEXT_SIZE 69
|
||||||
|
|
||||||
#else
|
#else /* if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | |
|
* | | | | PC, xPSR | EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><---->
|
* <-----------><--------------><---------><----------------><---------------------><---->
|
||||||
* 16 16 8 8 4 1
|
* 16 16 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 53
|
#define MAX_CONTEXT_SIZE 53
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
@ -299,54 +300,54 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><-----------><---->
|
* <---------><----------------><------------------------------><-----------><---->
|
||||||
* 8 8 5 16 1
|
* 8 8 5 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 38
|
#define MAX_CONTEXT_SIZE 38
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><---->
|
* <---------><----------------><------------------------------><---->
|
||||||
* 8 8 5 1
|
* 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 22
|
#define MAX_CONTEXT_SIZE 22
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | PC, xPSR | EXC_RETURN | | |
|
* | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><-----------><---->
|
* <---------><----------------><----------------------><-----------><---->
|
||||||
* 8 8 4 16 1
|
* 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 37
|
#define MAX_CONTEXT_SIZE 37
|
||||||
|
|
||||||
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | PC, xPSR | EXC_RETURN | |
|
* | | PC, xPSR | EXC_RETURN | |
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><---->
|
* <---------><----------------><----------------------><---->
|
||||||
* 8 8 4 1
|
* 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 21
|
#define MAX_CONTEXT_SIZE 21
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
|
@ -169,79 +169,80 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to manipulate the MPU.
|
* @brief Constants required to manipulate the MPU.
|
||||||
*/
|
*/
|
||||||
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
||||||
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
||||||
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
||||||
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
||||||
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
||||||
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
||||||
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
||||||
|
|
||||||
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
||||||
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
|
|
||||||
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
||||||
|
|
||||||
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
||||||
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
|
||||||
* region. */
|
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
||||||
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
* region. */
|
||||||
|
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
||||||
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
||||||
|
|
||||||
/* Enable privileged access to unmapped region. */
|
/* Enable privileged access to unmapped region. */
|
||||||
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
||||||
|
|
||||||
/* Enable MPU. */
|
/* Enable MPU. */
|
||||||
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
||||||
|
|
||||||
/* Expected value of the portMPU_TYPE register. */
|
/* Expected value of the portMPU_TYPE register. */
|
||||||
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
||||||
|
|
||||||
/* Extract first address of the MPU region as encoded in the
|
/* Extract first address of the MPU region as encoded in the
|
||||||
* RBAR (Region Base Address Register) value. */
|
* RBAR (Region Base Address Register) value. */
|
||||||
|
@ -380,14 +381,14 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to check and configure PACBTI security feature implementation.
|
* @brief Constants required to check and configure PACBTI security feature implementation.
|
||||||
*/
|
*/
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
||||||
|
|
||||||
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
||||||
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
||||||
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
||||||
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
||||||
|
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -409,7 +410,7 @@ static void prvTaskExitError( void );
|
||||||
* @return uint32_t Access permissions.
|
* @return uint32_t Access permissions.
|
||||||
*/
|
*/
|
||||||
static uint32_t prvGetRegionAccessPermissions( uint32_t ulRBARValue ) PRIVILEGED_FUNCTION;
|
static uint32_t prvGetRegionAccessPermissions( uint32_t ulRBARValue ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
|
||||||
|
@ -427,7 +428,7 @@ static void prvTaskExitError( void );
|
||||||
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_FPU */
|
#endif /* configENABLE_FPU */
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Configures PACBTI features.
|
* @brief Configures PACBTI features.
|
||||||
|
@ -890,7 +891,7 @@ static void prvTaskExitError( void )
|
||||||
return ulAccessPermissions;
|
return ulAccessPermissions;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
@ -1212,6 +1213,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __syscalls_flash_start__;
|
extern uint32_t * __syscalls_flash_start__;
|
||||||
|
@ -1282,6 +1284,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
||||||
* when we exit from the system call. */
|
* when we exit from the system call. */
|
||||||
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
||||||
|
|
||||||
/* Store the value of the PSPLIM register before the SVC was raised.
|
/* Store the value of the PSPLIM register before the SVC was raised.
|
||||||
* We need to restore it when we exit from the system call. */
|
* We need to restore it when we exit from the system call. */
|
||||||
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
||||||
|
@ -1300,6 +1303,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
|
|
||||||
/* Start executing the system call upon returning from this handler. */
|
/* Start executing the system call upon returning from this handler. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
||||||
|
|
||||||
/* Raise a request to exit from the system call upon finishing the
|
/* Raise a request to exit from the system call upon finishing the
|
||||||
* system call. */
|
* system call. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
||||||
|
@ -1359,6 +1363,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __privileged_functions_start__;
|
extern uint32_t * __privileged_functions_start__;
|
||||||
|
@ -1541,7 +1546,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
||||||
ulIndex++;
|
ulIndex++;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Check PACBTI security feature configuration before pushing the
|
/* Check PACBTI security feature configuration before pushing the
|
||||||
* CONTROL register's value on task's TCB. */
|
* CONTROL register's value on task's TCB. */
|
||||||
|
@ -1814,11 +1819,11 @@ BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
||||||
portNVIC_SHPR2_REG = 0;
|
portNVIC_SHPR2_REG = 0;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Set the CONTROL register value based on PACBTI security feature
|
/* Set the CONTROL register value based on PACBTI security feature
|
||||||
* configuration before starting the first task. */
|
* configuration before starting the first task. */
|
||||||
( void) prvConfigurePACBTI( pdTRUE );
|
( void ) prvConfigurePACBTI( pdTRUE );
|
||||||
}
|
}
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
|
|
||||||
|
@ -2018,9 +2023,9 @@ void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
if( xSchedulerRunning == pdFALSE )
|
if( xSchedulerRunning == pdFALSE )
|
||||||
{
|
{
|
||||||
/* Grant access to all the kernel objects before the scheduler
|
/* Grant access to all the kernel objects before the scheduler
|
||||||
* is started. It is necessary because there is no task running
|
* is started. It is necessary because there is no task running
|
||||||
* yet and therefore, we cannot use the permissions of any
|
* yet and therefore, we cannot use the permissions of any
|
||||||
* task. */
|
* task. */
|
||||||
xAccessGranted = pdTRUE;
|
xAccessGranted = pdTRUE;
|
||||||
}
|
}
|
||||||
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
||||||
|
@ -2241,7 +2246,7 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
||||||
{
|
{
|
||||||
|
@ -2253,13 +2258,13 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
/* Enable UsageFault exception. */
|
/* Enable UsageFault exception. */
|
||||||
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
||||||
|
|
||||||
#if( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if( configENABLE_BTI == 1 )
|
#if ( configENABLE_BTI == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,7 +60,7 @@
|
||||||
|
|
||||||
#ifndef configENABLE_MVE
|
#ifndef configENABLE_MVE
|
||||||
#define configENABLE_MVE 0
|
#define configENABLE_MVE 0
|
||||||
#elif( configENABLE_MVE != 0 )
|
#elif ( configENABLE_MVE != 0 )
|
||||||
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M33.
|
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M33.
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
|
@ -243,54 +243,55 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
/*
|
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
/*
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
*
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
*
|
||||||
* 16 16 8 8 5 16 1
|
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
||||||
*/
|
* 16 16 8 8 5 16 1
|
||||||
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 70
|
#define MAX_CONTEXT_SIZE 70
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
||||||
* 16 16 8 8 5 1
|
* 16 16 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 54
|
#define MAX_CONTEXT_SIZE 54
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | | |
|
* | | | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
||||||
* 16 16 8 8 4 16 1
|
* 16 16 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 69
|
#define MAX_CONTEXT_SIZE 69
|
||||||
|
|
||||||
#else
|
#else /* if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | |
|
* | | | | PC, xPSR | EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><---->
|
* <-----------><--------------><---------><----------------><---------------------><---->
|
||||||
* 16 16 8 8 4 1
|
* 16 16 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 53
|
#define MAX_CONTEXT_SIZE 53
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
@ -299,54 +300,54 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><-----------><---->
|
* <---------><----------------><------------------------------><-----------><---->
|
||||||
* 8 8 5 16 1
|
* 8 8 5 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 38
|
#define MAX_CONTEXT_SIZE 38
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><---->
|
* <---------><----------------><------------------------------><---->
|
||||||
* 8 8 5 1
|
* 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 22
|
#define MAX_CONTEXT_SIZE 22
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | PC, xPSR | EXC_RETURN | | |
|
* | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><-----------><---->
|
* <---------><----------------><----------------------><-----------><---->
|
||||||
* 8 8 4 16 1
|
* 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 37
|
#define MAX_CONTEXT_SIZE 37
|
||||||
|
|
||||||
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | PC, xPSR | EXC_RETURN | |
|
* | | PC, xPSR | EXC_RETURN | |
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><---->
|
* <---------><----------------><----------------------><---->
|
||||||
* 8 8 4 1
|
* 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 21
|
#define MAX_CONTEXT_SIZE 21
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
|
@ -169,79 +169,80 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to manipulate the MPU.
|
* @brief Constants required to manipulate the MPU.
|
||||||
*/
|
*/
|
||||||
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
||||||
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
||||||
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
||||||
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
||||||
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
||||||
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
||||||
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
||||||
|
|
||||||
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
||||||
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
|
|
||||||
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
||||||
|
|
||||||
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
||||||
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
|
||||||
* region. */
|
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
||||||
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
* region. */
|
||||||
|
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
||||||
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
||||||
|
|
||||||
/* Enable privileged access to unmapped region. */
|
/* Enable privileged access to unmapped region. */
|
||||||
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
||||||
|
|
||||||
/* Enable MPU. */
|
/* Enable MPU. */
|
||||||
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
||||||
|
|
||||||
/* Expected value of the portMPU_TYPE register. */
|
/* Expected value of the portMPU_TYPE register. */
|
||||||
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
||||||
|
|
||||||
/* Extract first address of the MPU region as encoded in the
|
/* Extract first address of the MPU region as encoded in the
|
||||||
* RBAR (Region Base Address Register) value. */
|
* RBAR (Region Base Address Register) value. */
|
||||||
|
@ -380,14 +381,14 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to check and configure PACBTI security feature implementation.
|
* @brief Constants required to check and configure PACBTI security feature implementation.
|
||||||
*/
|
*/
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
||||||
|
|
||||||
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
||||||
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
||||||
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
||||||
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
||||||
|
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -409,7 +410,7 @@ static void prvTaskExitError( void );
|
||||||
* @return uint32_t Access permissions.
|
* @return uint32_t Access permissions.
|
||||||
*/
|
*/
|
||||||
static uint32_t prvGetRegionAccessPermissions( uint32_t ulRBARValue ) PRIVILEGED_FUNCTION;
|
static uint32_t prvGetRegionAccessPermissions( uint32_t ulRBARValue ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
|
||||||
|
@ -427,7 +428,7 @@ static void prvTaskExitError( void );
|
||||||
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_FPU */
|
#endif /* configENABLE_FPU */
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Configures PACBTI features.
|
* @brief Configures PACBTI features.
|
||||||
|
@ -890,7 +891,7 @@ static void prvTaskExitError( void )
|
||||||
return ulAccessPermissions;
|
return ulAccessPermissions;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
@ -1212,6 +1213,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __syscalls_flash_start__;
|
extern uint32_t * __syscalls_flash_start__;
|
||||||
|
@ -1282,6 +1284,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
||||||
* when we exit from the system call. */
|
* when we exit from the system call. */
|
||||||
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
||||||
|
|
||||||
/* Store the value of the PSPLIM register before the SVC was raised.
|
/* Store the value of the PSPLIM register before the SVC was raised.
|
||||||
* We need to restore it when we exit from the system call. */
|
* We need to restore it when we exit from the system call. */
|
||||||
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
||||||
|
@ -1300,6 +1303,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
|
|
||||||
/* Start executing the system call upon returning from this handler. */
|
/* Start executing the system call upon returning from this handler. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
||||||
|
|
||||||
/* Raise a request to exit from the system call upon finishing the
|
/* Raise a request to exit from the system call upon finishing the
|
||||||
* system call. */
|
* system call. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
||||||
|
@ -1359,6 +1363,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __privileged_functions_start__;
|
extern uint32_t * __privileged_functions_start__;
|
||||||
|
@ -1541,7 +1546,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
||||||
ulIndex++;
|
ulIndex++;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Check PACBTI security feature configuration before pushing the
|
/* Check PACBTI security feature configuration before pushing the
|
||||||
* CONTROL register's value on task's TCB. */
|
* CONTROL register's value on task's TCB. */
|
||||||
|
@ -1814,11 +1819,11 @@ BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
||||||
portNVIC_SHPR2_REG = 0;
|
portNVIC_SHPR2_REG = 0;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Set the CONTROL register value based on PACBTI security feature
|
/* Set the CONTROL register value based on PACBTI security feature
|
||||||
* configuration before starting the first task. */
|
* configuration before starting the first task. */
|
||||||
( void) prvConfigurePACBTI( pdTRUE );
|
( void ) prvConfigurePACBTI( pdTRUE );
|
||||||
}
|
}
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
|
|
||||||
|
@ -2018,9 +2023,9 @@ void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
if( xSchedulerRunning == pdFALSE )
|
if( xSchedulerRunning == pdFALSE )
|
||||||
{
|
{
|
||||||
/* Grant access to all the kernel objects before the scheduler
|
/* Grant access to all the kernel objects before the scheduler
|
||||||
* is started. It is necessary because there is no task running
|
* is started. It is necessary because there is no task running
|
||||||
* yet and therefore, we cannot use the permissions of any
|
* yet and therefore, we cannot use the permissions of any
|
||||||
* task. */
|
* task. */
|
||||||
xAccessGranted = pdTRUE;
|
xAccessGranted = pdTRUE;
|
||||||
}
|
}
|
||||||
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
||||||
|
@ -2241,7 +2246,7 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
||||||
{
|
{
|
||||||
|
@ -2253,13 +2258,13 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
/* Enable UsageFault exception. */
|
/* Enable UsageFault exception. */
|
||||||
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
||||||
|
|
||||||
#if( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if( configENABLE_BTI == 1 )
|
#if ( configENABLE_BTI == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,7 +60,7 @@
|
||||||
|
|
||||||
#ifndef configENABLE_MVE
|
#ifndef configENABLE_MVE
|
||||||
#define configENABLE_MVE 0
|
#define configENABLE_MVE 0
|
||||||
#elif( configENABLE_MVE != 0 )
|
#elif ( configENABLE_MVE != 0 )
|
||||||
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M33.
|
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M33.
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
|
@ -243,54 +243,55 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
/*
|
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
/*
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
*
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
*
|
||||||
* 16 16 8 8 5 16 1
|
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
||||||
*/
|
* 16 16 8 8 5 16 1
|
||||||
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 70
|
#define MAX_CONTEXT_SIZE 70
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
||||||
* 16 16 8 8 5 1
|
* 16 16 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 54
|
#define MAX_CONTEXT_SIZE 54
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | | |
|
* | | | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
||||||
* 16 16 8 8 4 16 1
|
* 16 16 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 69
|
#define MAX_CONTEXT_SIZE 69
|
||||||
|
|
||||||
#else
|
#else /* if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | |
|
* | | | | PC, xPSR | EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><---->
|
* <-----------><--------------><---------><----------------><---------------------><---->
|
||||||
* 16 16 8 8 4 1
|
* 16 16 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 53
|
#define MAX_CONTEXT_SIZE 53
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
@ -299,54 +300,54 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><-----------><---->
|
* <---------><----------------><------------------------------><-----------><---->
|
||||||
* 8 8 5 16 1
|
* 8 8 5 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 38
|
#define MAX_CONTEXT_SIZE 38
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><---->
|
* <---------><----------------><------------------------------><---->
|
||||||
* 8 8 5 1
|
* 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 22
|
#define MAX_CONTEXT_SIZE 22
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | PC, xPSR | EXC_RETURN | | |
|
* | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><-----------><---->
|
* <---------><----------------><----------------------><-----------><---->
|
||||||
* 8 8 4 16 1
|
* 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 37
|
#define MAX_CONTEXT_SIZE 37
|
||||||
|
|
||||||
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | PC, xPSR | EXC_RETURN | |
|
* | | PC, xPSR | EXC_RETURN | |
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><---->
|
* <---------><----------------><----------------------><---->
|
||||||
* 8 8 4 1
|
* 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 21
|
#define MAX_CONTEXT_SIZE 21
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
|
@ -169,79 +169,80 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to manipulate the MPU.
|
* @brief Constants required to manipulate the MPU.
|
||||||
*/
|
*/
|
||||||
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
||||||
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
||||||
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
||||||
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
||||||
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
||||||
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
||||||
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
||||||
|
|
||||||
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
||||||
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
|
|
||||||
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
||||||
|
|
||||||
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
||||||
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
|
||||||
* region. */
|
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
||||||
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
* region. */
|
||||||
|
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
||||||
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
||||||
|
|
||||||
/* Enable privileged access to unmapped region. */
|
/* Enable privileged access to unmapped region. */
|
||||||
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
||||||
|
|
||||||
/* Enable MPU. */
|
/* Enable MPU. */
|
||||||
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
||||||
|
|
||||||
/* Expected value of the portMPU_TYPE register. */
|
/* Expected value of the portMPU_TYPE register. */
|
||||||
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
||||||
|
|
||||||
/* Extract first address of the MPU region as encoded in the
|
/* Extract first address of the MPU region as encoded in the
|
||||||
* RBAR (Region Base Address Register) value. */
|
* RBAR (Region Base Address Register) value. */
|
||||||
|
@ -380,14 +381,14 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to check and configure PACBTI security feature implementation.
|
* @brief Constants required to check and configure PACBTI security feature implementation.
|
||||||
*/
|
*/
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
||||||
|
|
||||||
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
||||||
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
||||||
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
||||||
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
||||||
|
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -409,7 +410,7 @@ static void prvTaskExitError( void );
|
||||||
* @return uint32_t Access permissions.
|
* @return uint32_t Access permissions.
|
||||||
*/
|
*/
|
||||||
static uint32_t prvGetRegionAccessPermissions( uint32_t ulRBARValue ) PRIVILEGED_FUNCTION;
|
static uint32_t prvGetRegionAccessPermissions( uint32_t ulRBARValue ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
#endif /* configENABLE_MPU == 1 && configUSE_MPU_WRAPPERS_V1 == 0 */
|
||||||
|
|
||||||
#if ( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
|
|
||||||
|
@ -427,7 +428,7 @@ static void prvTaskExitError( void );
|
||||||
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_FPU */
|
#endif /* configENABLE_FPU */
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Configures PACBTI features.
|
* @brief Configures PACBTI features.
|
||||||
|
@ -1212,6 +1213,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __syscalls_flash_start__;
|
extern uint32_t * __syscalls_flash_start__;
|
||||||
|
@ -1282,6 +1284,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
||||||
* when we exit from the system call. */
|
* when we exit from the system call. */
|
||||||
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
||||||
|
|
||||||
/* Store the value of the PSPLIM register before the SVC was raised.
|
/* Store the value of the PSPLIM register before the SVC was raised.
|
||||||
* We need to restore it when we exit from the system call. */
|
* We need to restore it when we exit from the system call. */
|
||||||
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
||||||
|
@ -1300,6 +1303,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
|
|
||||||
/* Start executing the system call upon returning from this handler. */
|
/* Start executing the system call upon returning from this handler. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
||||||
|
|
||||||
/* Raise a request to exit from the system call upon finishing the
|
/* Raise a request to exit from the system call upon finishing the
|
||||||
* system call. */
|
* system call. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
||||||
|
@ -1359,6 +1363,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __privileged_functions_start__;
|
extern uint32_t * __privileged_functions_start__;
|
||||||
|
@ -1541,7 +1546,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
||||||
ulIndex++;
|
ulIndex++;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Check PACBTI security feature configuration before pushing the
|
/* Check PACBTI security feature configuration before pushing the
|
||||||
* CONTROL register's value on task's TCB. */
|
* CONTROL register's value on task's TCB. */
|
||||||
|
@ -1814,11 +1819,11 @@ BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
||||||
portNVIC_SHPR2_REG = 0;
|
portNVIC_SHPR2_REG = 0;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Set the CONTROL register value based on PACBTI security feature
|
/* Set the CONTROL register value based on PACBTI security feature
|
||||||
* configuration before starting the first task. */
|
* configuration before starting the first task. */
|
||||||
( void) prvConfigurePACBTI( pdTRUE );
|
( void ) prvConfigurePACBTI( pdTRUE );
|
||||||
}
|
}
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
|
|
||||||
|
@ -2018,9 +2023,9 @@ void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
if( xSchedulerRunning == pdFALSE )
|
if( xSchedulerRunning == pdFALSE )
|
||||||
{
|
{
|
||||||
/* Grant access to all the kernel objects before the scheduler
|
/* Grant access to all the kernel objects before the scheduler
|
||||||
* is started. It is necessary because there is no task running
|
* is started. It is necessary because there is no task running
|
||||||
* yet and therefore, we cannot use the permissions of any
|
* yet and therefore, we cannot use the permissions of any
|
||||||
* task. */
|
* task. */
|
||||||
xAccessGranted = pdTRUE;
|
xAccessGranted = pdTRUE;
|
||||||
}
|
}
|
||||||
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
||||||
|
@ -2241,7 +2246,7 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
||||||
{
|
{
|
||||||
|
@ -2253,13 +2258,13 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
/* Enable UsageFault exception. */
|
/* Enable UsageFault exception. */
|
||||||
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
||||||
|
|
||||||
#if( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if( configENABLE_BTI == 1 )
|
#if ( configENABLE_BTI == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,7 +60,7 @@
|
||||||
|
|
||||||
#ifndef configENABLE_MVE
|
#ifndef configENABLE_MVE
|
||||||
#define configENABLE_MVE 0
|
#define configENABLE_MVE 0
|
||||||
#elif( configENABLE_MVE != 0 )
|
#elif ( configENABLE_MVE != 0 )
|
||||||
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M35.
|
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M35.
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
|
@ -243,54 +243,55 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
/*
|
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
/*
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
*
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
*
|
||||||
* 16 16 8 8 5 16 1
|
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
||||||
*/
|
* 16 16 8 8 5 16 1
|
||||||
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 70
|
#define MAX_CONTEXT_SIZE 70
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
||||||
* 16 16 8 8 5 1
|
* 16 16 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 54
|
#define MAX_CONTEXT_SIZE 54
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | | |
|
* | | | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
||||||
* 16 16 8 8 4 16 1
|
* 16 16 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 69
|
#define MAX_CONTEXT_SIZE 69
|
||||||
|
|
||||||
#else
|
#else /* if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | |
|
* | | | | PC, xPSR | EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><---->
|
* <-----------><--------------><---------><----------------><---------------------><---->
|
||||||
* 16 16 8 8 4 1
|
* 16 16 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 53
|
#define MAX_CONTEXT_SIZE 53
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
@ -299,54 +300,54 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><-----------><---->
|
* <---------><----------------><------------------------------><-----------><---->
|
||||||
* 8 8 5 16 1
|
* 8 8 5 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 38
|
#define MAX_CONTEXT_SIZE 38
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><---->
|
* <---------><----------------><------------------------------><---->
|
||||||
* 8 8 5 1
|
* 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 22
|
#define MAX_CONTEXT_SIZE 22
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | PC, xPSR | EXC_RETURN | | |
|
* | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><-----------><---->
|
* <---------><----------------><----------------------><-----------><---->
|
||||||
* 8 8 4 16 1
|
* 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 37
|
#define MAX_CONTEXT_SIZE 37
|
||||||
|
|
||||||
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | PC, xPSR | EXC_RETURN | |
|
* | | PC, xPSR | EXC_RETURN | |
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><---->
|
* <---------><----------------><----------------------><---->
|
||||||
* 8 8 4 1
|
* 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 21
|
#define MAX_CONTEXT_SIZE 21
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
|
@ -169,79 +169,80 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to manipulate the MPU.
|
* @brief Constants required to manipulate the MPU.
|
||||||
*/
|
*/
|
||||||
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
||||||
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
||||||
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
||||||
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
||||||
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
||||||
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
||||||
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
||||||
|
|
||||||
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
||||||
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
|
|
||||||
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
||||||
|
|
||||||
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
||||||
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
|
||||||
* region. */
|
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
||||||
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
* region. */
|
||||||
|
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
||||||
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
||||||
|
|
||||||
/* Enable privileged access to unmapped region. */
|
/* Enable privileged access to unmapped region. */
|
||||||
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
||||||
|
|
||||||
/* Enable MPU. */
|
/* Enable MPU. */
|
||||||
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
||||||
|
|
||||||
/* Expected value of the portMPU_TYPE register. */
|
/* Expected value of the portMPU_TYPE register. */
|
||||||
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
||||||
|
|
||||||
/* Extract first address of the MPU region as encoded in the
|
/* Extract first address of the MPU region as encoded in the
|
||||||
* RBAR (Region Base Address Register) value. */
|
* RBAR (Region Base Address Register) value. */
|
||||||
|
@ -380,14 +381,14 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to check and configure PACBTI security feature implementation.
|
* @brief Constants required to check and configure PACBTI security feature implementation.
|
||||||
*/
|
*/
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
||||||
|
|
||||||
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
||||||
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
||||||
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
||||||
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
||||||
|
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -427,7 +428,7 @@ static void prvTaskExitError( void );
|
||||||
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_FPU */
|
#endif /* configENABLE_FPU */
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Configures PACBTI features.
|
* @brief Configures PACBTI features.
|
||||||
|
@ -1212,6 +1213,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __syscalls_flash_start__;
|
extern uint32_t * __syscalls_flash_start__;
|
||||||
|
@ -1282,6 +1284,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
||||||
* when we exit from the system call. */
|
* when we exit from the system call. */
|
||||||
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
||||||
|
|
||||||
/* Store the value of the PSPLIM register before the SVC was raised.
|
/* Store the value of the PSPLIM register before the SVC was raised.
|
||||||
* We need to restore it when we exit from the system call. */
|
* We need to restore it when we exit from the system call. */
|
||||||
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
||||||
|
@ -1300,6 +1303,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
|
|
||||||
/* Start executing the system call upon returning from this handler. */
|
/* Start executing the system call upon returning from this handler. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
||||||
|
|
||||||
/* Raise a request to exit from the system call upon finishing the
|
/* Raise a request to exit from the system call upon finishing the
|
||||||
* system call. */
|
* system call. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
||||||
|
@ -1359,6 +1363,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __privileged_functions_start__;
|
extern uint32_t * __privileged_functions_start__;
|
||||||
|
@ -1541,7 +1546,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
||||||
ulIndex++;
|
ulIndex++;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Check PACBTI security feature configuration before pushing the
|
/* Check PACBTI security feature configuration before pushing the
|
||||||
* CONTROL register's value on task's TCB. */
|
* CONTROL register's value on task's TCB. */
|
||||||
|
@ -1814,11 +1819,11 @@ BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
||||||
portNVIC_SHPR2_REG = 0;
|
portNVIC_SHPR2_REG = 0;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Set the CONTROL register value based on PACBTI security feature
|
/* Set the CONTROL register value based on PACBTI security feature
|
||||||
* configuration before starting the first task. */
|
* configuration before starting the first task. */
|
||||||
( void) prvConfigurePACBTI( pdTRUE );
|
( void ) prvConfigurePACBTI( pdTRUE );
|
||||||
}
|
}
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
|
|
||||||
|
@ -2018,9 +2023,9 @@ void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
if( xSchedulerRunning == pdFALSE )
|
if( xSchedulerRunning == pdFALSE )
|
||||||
{
|
{
|
||||||
/* Grant access to all the kernel objects before the scheduler
|
/* Grant access to all the kernel objects before the scheduler
|
||||||
* is started. It is necessary because there is no task running
|
* is started. It is necessary because there is no task running
|
||||||
* yet and therefore, we cannot use the permissions of any
|
* yet and therefore, we cannot use the permissions of any
|
||||||
* task. */
|
* task. */
|
||||||
xAccessGranted = pdTRUE;
|
xAccessGranted = pdTRUE;
|
||||||
}
|
}
|
||||||
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
||||||
|
@ -2241,7 +2246,7 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
||||||
{
|
{
|
||||||
|
@ -2253,13 +2258,13 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
/* Enable UsageFault exception. */
|
/* Enable UsageFault exception. */
|
||||||
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
||||||
|
|
||||||
#if( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if( configENABLE_BTI == 1 )
|
#if ( configENABLE_BTI == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,7 +60,7 @@
|
||||||
|
|
||||||
#ifndef configENABLE_MVE
|
#ifndef configENABLE_MVE
|
||||||
#define configENABLE_MVE 0
|
#define configENABLE_MVE 0
|
||||||
#elif( configENABLE_MVE != 0 )
|
#elif ( configENABLE_MVE != 0 )
|
||||||
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M35.
|
#error configENABLE_MVE must be left undefined, or defined to 0 for the Cortex-M35.
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
|
@ -243,54 +243,55 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
/*
|
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
/*
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
*
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
*
|
||||||
* 16 16 8 8 5 16 1
|
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
||||||
*/
|
* 16 16 8 8 5 16 1
|
||||||
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 70
|
#define MAX_CONTEXT_SIZE 70
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
||||||
* 16 16 8 8 5 1
|
* 16 16 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 54
|
#define MAX_CONTEXT_SIZE 54
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | | |
|
* | | | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
||||||
* 16 16 8 8 4 16 1
|
* 16 16 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 69
|
#define MAX_CONTEXT_SIZE 69
|
||||||
|
|
||||||
#else
|
#else /* if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | |
|
* | | | | PC, xPSR | EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><---->
|
* <-----------><--------------><---------><----------------><---------------------><---->
|
||||||
* 16 16 8 8 4 1
|
* 16 16 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 53
|
#define MAX_CONTEXT_SIZE 53
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
@ -299,54 +300,54 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><-----------><---->
|
* <---------><----------------><------------------------------><-----------><---->
|
||||||
* 8 8 5 16 1
|
* 8 8 5 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 38
|
#define MAX_CONTEXT_SIZE 38
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><---->
|
* <---------><----------------><------------------------------><---->
|
||||||
* 8 8 5 1
|
* 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 22
|
#define MAX_CONTEXT_SIZE 22
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | PC, xPSR | EXC_RETURN | | |
|
* | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><-----------><---->
|
* <---------><----------------><----------------------><-----------><---->
|
||||||
* 8 8 4 16 1
|
* 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 37
|
#define MAX_CONTEXT_SIZE 37
|
||||||
|
|
||||||
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | PC, xPSR | EXC_RETURN | |
|
* | | PC, xPSR | EXC_RETURN | |
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><---->
|
* <---------><----------------><----------------------><---->
|
||||||
* 8 8 4 1
|
* 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 21
|
#define MAX_CONTEXT_SIZE 21
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
|
@ -169,79 +169,80 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to manipulate the MPU.
|
* @brief Constants required to manipulate the MPU.
|
||||||
*/
|
*/
|
||||||
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
||||||
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
||||||
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
||||||
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
||||||
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
||||||
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
||||||
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
||||||
|
|
||||||
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
||||||
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
|
|
||||||
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
||||||
|
|
||||||
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
||||||
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
|
||||||
* region. */
|
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
||||||
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
* region. */
|
||||||
|
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
||||||
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
||||||
|
|
||||||
/* Enable privileged access to unmapped region. */
|
/* Enable privileged access to unmapped region. */
|
||||||
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
||||||
|
|
||||||
/* Enable MPU. */
|
/* Enable MPU. */
|
||||||
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
||||||
|
|
||||||
/* Expected value of the portMPU_TYPE register. */
|
/* Expected value of the portMPU_TYPE register. */
|
||||||
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
||||||
|
|
||||||
/* Extract first address of the MPU region as encoded in the
|
/* Extract first address of the MPU region as encoded in the
|
||||||
* RBAR (Region Base Address Register) value. */
|
* RBAR (Region Base Address Register) value. */
|
||||||
|
@ -380,14 +381,14 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to check and configure PACBTI security feature implementation.
|
* @brief Constants required to check and configure PACBTI security feature implementation.
|
||||||
*/
|
*/
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
||||||
|
|
||||||
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
||||||
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
||||||
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
||||||
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
||||||
|
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -427,7 +428,7 @@ static void prvTaskExitError( void );
|
||||||
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_FPU */
|
#endif /* configENABLE_FPU */
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Configures PACBTI features.
|
* @brief Configures PACBTI features.
|
||||||
|
@ -1212,6 +1213,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __syscalls_flash_start__;
|
extern uint32_t * __syscalls_flash_start__;
|
||||||
|
@ -1282,6 +1284,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
||||||
* when we exit from the system call. */
|
* when we exit from the system call. */
|
||||||
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
||||||
|
|
||||||
/* Store the value of the PSPLIM register before the SVC was raised.
|
/* Store the value of the PSPLIM register before the SVC was raised.
|
||||||
* We need to restore it when we exit from the system call. */
|
* We need to restore it when we exit from the system call. */
|
||||||
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
||||||
|
@ -1300,6 +1303,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
|
|
||||||
/* Start executing the system call upon returning from this handler. */
|
/* Start executing the system call upon returning from this handler. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
||||||
|
|
||||||
/* Raise a request to exit from the system call upon finishing the
|
/* Raise a request to exit from the system call upon finishing the
|
||||||
* system call. */
|
* system call. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
||||||
|
@ -1359,6 +1363,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __privileged_functions_start__;
|
extern uint32_t * __privileged_functions_start__;
|
||||||
|
@ -1541,7 +1546,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
||||||
ulIndex++;
|
ulIndex++;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Check PACBTI security feature configuration before pushing the
|
/* Check PACBTI security feature configuration before pushing the
|
||||||
* CONTROL register's value on task's TCB. */
|
* CONTROL register's value on task's TCB. */
|
||||||
|
@ -1814,11 +1819,11 @@ BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
||||||
portNVIC_SHPR2_REG = 0;
|
portNVIC_SHPR2_REG = 0;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Set the CONTROL register value based on PACBTI security feature
|
/* Set the CONTROL register value based on PACBTI security feature
|
||||||
* configuration before starting the first task. */
|
* configuration before starting the first task. */
|
||||||
( void) prvConfigurePACBTI( pdTRUE );
|
( void ) prvConfigurePACBTI( pdTRUE );
|
||||||
}
|
}
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
|
|
||||||
|
@ -2018,9 +2023,9 @@ void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
if( xSchedulerRunning == pdFALSE )
|
if( xSchedulerRunning == pdFALSE )
|
||||||
{
|
{
|
||||||
/* Grant access to all the kernel objects before the scheduler
|
/* Grant access to all the kernel objects before the scheduler
|
||||||
* is started. It is necessary because there is no task running
|
* is started. It is necessary because there is no task running
|
||||||
* yet and therefore, we cannot use the permissions of any
|
* yet and therefore, we cannot use the permissions of any
|
||||||
* task. */
|
* task. */
|
||||||
xAccessGranted = pdTRUE;
|
xAccessGranted = pdTRUE;
|
||||||
}
|
}
|
||||||
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
||||||
|
@ -2241,7 +2246,7 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
||||||
{
|
{
|
||||||
|
@ -2253,13 +2258,13 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
/* Enable UsageFault exception. */
|
/* Enable UsageFault exception. */
|
||||||
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
||||||
|
|
||||||
#if( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if( configENABLE_BTI == 1 )
|
#if ( configENABLE_BTI == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
||||||
}
|
}
|
||||||
|
|
|
@ -243,54 +243,55 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
/*
|
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
/*
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
*
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
*
|
||||||
* 16 16 8 8 5 16 1
|
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
||||||
*/
|
* 16 16 8 8 5 16 1
|
||||||
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 70
|
#define MAX_CONTEXT_SIZE 70
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
||||||
* 16 16 8 8 5 1
|
* 16 16 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 54
|
#define MAX_CONTEXT_SIZE 54
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | | |
|
* | | | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
||||||
* 16 16 8 8 4 16 1
|
* 16 16 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 69
|
#define MAX_CONTEXT_SIZE 69
|
||||||
|
|
||||||
#else
|
#else /* if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | |
|
* | | | | PC, xPSR | EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><---->
|
* <-----------><--------------><---------><----------------><---------------------><---->
|
||||||
* 16 16 8 8 4 1
|
* 16 16 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 53
|
#define MAX_CONTEXT_SIZE 53
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
@ -299,54 +300,54 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><-----------><---->
|
* <---------><----------------><------------------------------><-----------><---->
|
||||||
* 8 8 5 16 1
|
* 8 8 5 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 38
|
#define MAX_CONTEXT_SIZE 38
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><---->
|
* <---------><----------------><------------------------------><---->
|
||||||
* 8 8 5 1
|
* 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 22
|
#define MAX_CONTEXT_SIZE 22
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | PC, xPSR | EXC_RETURN | | |
|
* | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><-----------><---->
|
* <---------><----------------><----------------------><-----------><---->
|
||||||
* 8 8 4 16 1
|
* 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 37
|
#define MAX_CONTEXT_SIZE 37
|
||||||
|
|
||||||
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | PC, xPSR | EXC_RETURN | |
|
* | | PC, xPSR | EXC_RETURN | |
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><---->
|
* <---------><----------------><----------------------><---->
|
||||||
* 8 8 4 1
|
* 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 21
|
#define MAX_CONTEXT_SIZE 21
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
|
@ -169,79 +169,80 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to manipulate the MPU.
|
* @brief Constants required to manipulate the MPU.
|
||||||
*/
|
*/
|
||||||
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
||||||
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
||||||
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
||||||
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
||||||
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
||||||
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
||||||
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
||||||
|
|
||||||
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
||||||
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
|
|
||||||
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
||||||
|
|
||||||
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
||||||
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
|
||||||
* region. */
|
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
||||||
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
* region. */
|
||||||
|
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
||||||
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
||||||
|
|
||||||
/* Enable privileged access to unmapped region. */
|
/* Enable privileged access to unmapped region. */
|
||||||
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
||||||
|
|
||||||
/* Enable MPU. */
|
/* Enable MPU. */
|
||||||
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
||||||
|
|
||||||
/* Expected value of the portMPU_TYPE register. */
|
/* Expected value of the portMPU_TYPE register. */
|
||||||
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
||||||
|
|
||||||
/* Extract first address of the MPU region as encoded in the
|
/* Extract first address of the MPU region as encoded in the
|
||||||
* RBAR (Region Base Address Register) value. */
|
* RBAR (Region Base Address Register) value. */
|
||||||
|
@ -380,14 +381,14 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to check and configure PACBTI security feature implementation.
|
* @brief Constants required to check and configure PACBTI security feature implementation.
|
||||||
*/
|
*/
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
||||||
|
|
||||||
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
||||||
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
||||||
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
||||||
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
||||||
|
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -427,7 +428,7 @@ static void prvTaskExitError( void );
|
||||||
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_FPU */
|
#endif /* configENABLE_FPU */
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Configures PACBTI features.
|
* @brief Configures PACBTI features.
|
||||||
|
@ -1212,6 +1213,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __syscalls_flash_start__;
|
extern uint32_t * __syscalls_flash_start__;
|
||||||
|
@ -1282,6 +1284,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
||||||
* when we exit from the system call. */
|
* when we exit from the system call. */
|
||||||
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
||||||
|
|
||||||
/* Store the value of the PSPLIM register before the SVC was raised.
|
/* Store the value of the PSPLIM register before the SVC was raised.
|
||||||
* We need to restore it when we exit from the system call. */
|
* We need to restore it when we exit from the system call. */
|
||||||
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
||||||
|
@ -1300,6 +1303,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
|
|
||||||
/* Start executing the system call upon returning from this handler. */
|
/* Start executing the system call upon returning from this handler. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
||||||
|
|
||||||
/* Raise a request to exit from the system call upon finishing the
|
/* Raise a request to exit from the system call upon finishing the
|
||||||
* system call. */
|
* system call. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
||||||
|
@ -1359,6 +1363,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __privileged_functions_start__;
|
extern uint32_t * __privileged_functions_start__;
|
||||||
|
@ -1541,7 +1546,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
||||||
ulIndex++;
|
ulIndex++;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Check PACBTI security feature configuration before pushing the
|
/* Check PACBTI security feature configuration before pushing the
|
||||||
* CONTROL register's value on task's TCB. */
|
* CONTROL register's value on task's TCB. */
|
||||||
|
@ -1814,11 +1819,11 @@ BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
||||||
portNVIC_SHPR2_REG = 0;
|
portNVIC_SHPR2_REG = 0;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Set the CONTROL register value based on PACBTI security feature
|
/* Set the CONTROL register value based on PACBTI security feature
|
||||||
* configuration before starting the first task. */
|
* configuration before starting the first task. */
|
||||||
( void) prvConfigurePACBTI( pdTRUE );
|
( void ) prvConfigurePACBTI( pdTRUE );
|
||||||
}
|
}
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
|
|
||||||
|
@ -2018,9 +2023,9 @@ void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
if( xSchedulerRunning == pdFALSE )
|
if( xSchedulerRunning == pdFALSE )
|
||||||
{
|
{
|
||||||
/* Grant access to all the kernel objects before the scheduler
|
/* Grant access to all the kernel objects before the scheduler
|
||||||
* is started. It is necessary because there is no task running
|
* is started. It is necessary because there is no task running
|
||||||
* yet and therefore, we cannot use the permissions of any
|
* yet and therefore, we cannot use the permissions of any
|
||||||
* task. */
|
* task. */
|
||||||
xAccessGranted = pdTRUE;
|
xAccessGranted = pdTRUE;
|
||||||
}
|
}
|
||||||
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
||||||
|
@ -2241,7 +2246,7 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
||||||
{
|
{
|
||||||
|
@ -2253,13 +2258,13 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
/* Enable UsageFault exception. */
|
/* Enable UsageFault exception. */
|
||||||
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
||||||
|
|
||||||
#if( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if( configENABLE_BTI == 1 )
|
#if ( configENABLE_BTI == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
||||||
}
|
}
|
||||||
|
|
|
@ -243,54 +243,55 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
/*
|
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
/*
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
*
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
*
|
||||||
* 16 16 8 8 5 16 1
|
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
||||||
*/
|
* 16 16 8 8 5 16 1
|
||||||
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 70
|
#define MAX_CONTEXT_SIZE 70
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
||||||
* 16 16 8 8 5 1
|
* 16 16 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 54
|
#define MAX_CONTEXT_SIZE 54
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | | |
|
* | | | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
||||||
* 16 16 8 8 4 16 1
|
* 16 16 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 69
|
#define MAX_CONTEXT_SIZE 69
|
||||||
|
|
||||||
#else
|
#else /* if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | |
|
* | | | | PC, xPSR | EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><---->
|
* <-----------><--------------><---------><----------------><---------------------><---->
|
||||||
* 16 16 8 8 4 1
|
* 16 16 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 53
|
#define MAX_CONTEXT_SIZE 53
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
@ -299,54 +300,54 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><-----------><---->
|
* <---------><----------------><------------------------------><-----------><---->
|
||||||
* 8 8 5 16 1
|
* 8 8 5 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 38
|
#define MAX_CONTEXT_SIZE 38
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><---->
|
* <---------><----------------><------------------------------><---->
|
||||||
* 8 8 5 1
|
* 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 22
|
#define MAX_CONTEXT_SIZE 22
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | PC, xPSR | EXC_RETURN | | |
|
* | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><-----------><---->
|
* <---------><----------------><----------------------><-----------><---->
|
||||||
* 8 8 4 16 1
|
* 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 37
|
#define MAX_CONTEXT_SIZE 37
|
||||||
|
|
||||||
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | PC, xPSR | EXC_RETURN | |
|
* | | PC, xPSR | EXC_RETURN | |
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><---->
|
* <---------><----------------><----------------------><---->
|
||||||
* 8 8 4 1
|
* 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 21
|
#define MAX_CONTEXT_SIZE 21
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
|
@ -169,79 +169,80 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to manipulate the MPU.
|
* @brief Constants required to manipulate the MPU.
|
||||||
*/
|
*/
|
||||||
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
||||||
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
||||||
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
||||||
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
||||||
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
||||||
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
||||||
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
||||||
|
|
||||||
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
||||||
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
|
|
||||||
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
||||||
|
|
||||||
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
||||||
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
|
||||||
* region. */
|
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
||||||
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
* region. */
|
||||||
|
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
||||||
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
||||||
|
|
||||||
/* Enable privileged access to unmapped region. */
|
/* Enable privileged access to unmapped region. */
|
||||||
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
||||||
|
|
||||||
/* Enable MPU. */
|
/* Enable MPU. */
|
||||||
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
||||||
|
|
||||||
/* Expected value of the portMPU_TYPE register. */
|
/* Expected value of the portMPU_TYPE register. */
|
||||||
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
||||||
|
|
||||||
/* Extract first address of the MPU region as encoded in the
|
/* Extract first address of the MPU region as encoded in the
|
||||||
* RBAR (Region Base Address Register) value. */
|
* RBAR (Region Base Address Register) value. */
|
||||||
|
@ -380,14 +381,14 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to check and configure PACBTI security feature implementation.
|
* @brief Constants required to check and configure PACBTI security feature implementation.
|
||||||
*/
|
*/
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
||||||
|
|
||||||
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
||||||
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
||||||
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
||||||
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
||||||
|
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -427,7 +428,7 @@ static void prvTaskExitError( void );
|
||||||
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_FPU */
|
#endif /* configENABLE_FPU */
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Configures PACBTI features.
|
* @brief Configures PACBTI features.
|
||||||
|
@ -1212,6 +1213,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __syscalls_flash_start__;
|
extern uint32_t * __syscalls_flash_start__;
|
||||||
|
@ -1282,6 +1284,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
||||||
* when we exit from the system call. */
|
* when we exit from the system call. */
|
||||||
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
||||||
|
|
||||||
/* Store the value of the PSPLIM register before the SVC was raised.
|
/* Store the value of the PSPLIM register before the SVC was raised.
|
||||||
* We need to restore it when we exit from the system call. */
|
* We need to restore it when we exit from the system call. */
|
||||||
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
||||||
|
@ -1300,6 +1303,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
|
|
||||||
/* Start executing the system call upon returning from this handler. */
|
/* Start executing the system call upon returning from this handler. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
||||||
|
|
||||||
/* Raise a request to exit from the system call upon finishing the
|
/* Raise a request to exit from the system call upon finishing the
|
||||||
* system call. */
|
* system call. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
||||||
|
@ -1359,6 +1363,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __privileged_functions_start__;
|
extern uint32_t * __privileged_functions_start__;
|
||||||
|
@ -1541,7 +1546,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
||||||
ulIndex++;
|
ulIndex++;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Check PACBTI security feature configuration before pushing the
|
/* Check PACBTI security feature configuration before pushing the
|
||||||
* CONTROL register's value on task's TCB. */
|
* CONTROL register's value on task's TCB. */
|
||||||
|
@ -1814,11 +1819,11 @@ BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
||||||
portNVIC_SHPR2_REG = 0;
|
portNVIC_SHPR2_REG = 0;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Set the CONTROL register value based on PACBTI security feature
|
/* Set the CONTROL register value based on PACBTI security feature
|
||||||
* configuration before starting the first task. */
|
* configuration before starting the first task. */
|
||||||
( void) prvConfigurePACBTI( pdTRUE );
|
( void ) prvConfigurePACBTI( pdTRUE );
|
||||||
}
|
}
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
|
|
||||||
|
@ -2018,9 +2023,9 @@ void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
if( xSchedulerRunning == pdFALSE )
|
if( xSchedulerRunning == pdFALSE )
|
||||||
{
|
{
|
||||||
/* Grant access to all the kernel objects before the scheduler
|
/* Grant access to all the kernel objects before the scheduler
|
||||||
* is started. It is necessary because there is no task running
|
* is started. It is necessary because there is no task running
|
||||||
* yet and therefore, we cannot use the permissions of any
|
* yet and therefore, we cannot use the permissions of any
|
||||||
* task. */
|
* task. */
|
||||||
xAccessGranted = pdTRUE;
|
xAccessGranted = pdTRUE;
|
||||||
}
|
}
|
||||||
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
||||||
|
@ -2241,7 +2246,7 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
||||||
{
|
{
|
||||||
|
@ -2253,13 +2258,13 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
/* Enable UsageFault exception. */
|
/* Enable UsageFault exception. */
|
||||||
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
||||||
|
|
||||||
#if( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if( configENABLE_BTI == 1 )
|
#if ( configENABLE_BTI == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
||||||
}
|
}
|
||||||
|
|
|
@ -243,54 +243,55 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
/*
|
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
/*
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
*
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
*
|
||||||
* 16 16 8 8 5 16 1
|
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
||||||
*/
|
* 16 16 8 8 5 16 1
|
||||||
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 70
|
#define MAX_CONTEXT_SIZE 70
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
||||||
* 16 16 8 8 5 1
|
* 16 16 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 54
|
#define MAX_CONTEXT_SIZE 54
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | | |
|
* | | | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
||||||
* 16 16 8 8 4 16 1
|
* 16 16 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 69
|
#define MAX_CONTEXT_SIZE 69
|
||||||
|
|
||||||
#else
|
#else /* if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | |
|
* | | | | PC, xPSR | EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><---->
|
* <-----------><--------------><---------><----------------><---------------------><---->
|
||||||
* 16 16 8 8 4 1
|
* 16 16 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 53
|
#define MAX_CONTEXT_SIZE 53
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
@ -299,54 +300,54 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><-----------><---->
|
* <---------><----------------><------------------------------><-----------><---->
|
||||||
* 8 8 5 16 1
|
* 8 8 5 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 38
|
#define MAX_CONTEXT_SIZE 38
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><---->
|
* <---------><----------------><------------------------------><---->
|
||||||
* 8 8 5 1
|
* 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 22
|
#define MAX_CONTEXT_SIZE 22
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | PC, xPSR | EXC_RETURN | | |
|
* | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><-----------><---->
|
* <---------><----------------><----------------------><-----------><---->
|
||||||
* 8 8 4 16 1
|
* 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 37
|
#define MAX_CONTEXT_SIZE 37
|
||||||
|
|
||||||
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | PC, xPSR | EXC_RETURN | |
|
* | | PC, xPSR | EXC_RETURN | |
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><---->
|
* <---------><----------------><----------------------><---->
|
||||||
* 8 8 4 1
|
* 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 21
|
#define MAX_CONTEXT_SIZE 21
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
|
@ -169,79 +169,80 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to manipulate the MPU.
|
* @brief Constants required to manipulate the MPU.
|
||||||
*/
|
*/
|
||||||
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
||||||
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
||||||
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
||||||
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
||||||
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
||||||
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
||||||
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
||||||
|
|
||||||
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
||||||
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
|
|
||||||
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK ( 3UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
#define portMPU_MAIR_ATTR0_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
#define portMPU_MAIR_ATTR1_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
#define portMPU_MAIR_ATTR2_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
#define portMPU_MAIR_ATTR3_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
#define portMPU_MAIR_ATTR4_POS ( 0UL )
|
||||||
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
#define portMPU_MAIR_ATTR5_POS ( 8UL )
|
||||||
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
#define portMPU_MAIR_ATTR6_POS ( 16UL )
|
||||||
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 )
|
||||||
|
|
||||||
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
#define portMPU_MAIR_ATTR7_POS ( 24UL )
|
||||||
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 )
|
||||||
|
|
||||||
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL )
|
||||||
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL )
|
||||||
|
|
||||||
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
#define portMPU_RLAR_REGION_ENABLE ( 1UL )
|
||||||
|
|
||||||
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
#if ( portARMV8M_MINOR_VERSION >= 1 )
|
||||||
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
|
||||||
* region. */
|
/* Enable Privileged eXecute Never MPU attribute for the selected memory
|
||||||
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
* region. */
|
||||||
|
#define portMPU_RLAR_PRIVILEGED_EXECUTE_NEVER ( 1UL << 4UL )
|
||||||
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
#endif /* portARMV8M_MINOR_VERSION >= 1 */
|
||||||
|
|
||||||
/* Enable privileged access to unmapped region. */
|
/* Enable privileged access to unmapped region. */
|
||||||
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL )
|
||||||
|
|
||||||
/* Enable MPU. */
|
/* Enable MPU. */
|
||||||
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
#define portMPU_ENABLE_BIT ( 1UL << 0UL )
|
||||||
|
|
||||||
/* Expected value of the portMPU_TYPE register. */
|
/* Expected value of the portMPU_TYPE register. */
|
||||||
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL )
|
||||||
|
|
||||||
/* Extract first address of the MPU region as encoded in the
|
/* Extract first address of the MPU region as encoded in the
|
||||||
* RBAR (Region Base Address Register) value. */
|
* RBAR (Region Base Address Register) value. */
|
||||||
|
@ -380,14 +381,14 @@ typedef void ( * portISR_t )( void );
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to check and configure PACBTI security feature implementation.
|
* @brief Constants required to check and configure PACBTI security feature implementation.
|
||||||
*/
|
*/
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
#define portID_ISAR5_REG ( *( ( volatile uint32_t * ) 0xe000ed74 ) )
|
||||||
|
|
||||||
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
#define portCONTROL_UPAC_EN ( 1UL << 7UL )
|
||||||
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
#define portCONTROL_PAC_EN ( 1UL << 6UL )
|
||||||
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
#define portCONTROL_UBTI_EN ( 1UL << 5UL )
|
||||||
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
#define portCONTROL_BTI_EN ( 1UL << 4UL )
|
||||||
|
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -427,7 +428,7 @@ static void prvTaskExitError( void );
|
||||||
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_FPU */
|
#endif /* configENABLE_FPU */
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Configures PACBTI features.
|
* @brief Configures PACBTI features.
|
||||||
|
@ -1212,6 +1213,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __syscalls_flash_start__;
|
extern uint32_t * __syscalls_flash_start__;
|
||||||
|
@ -1282,6 +1284,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
||||||
* when we exit from the system call. */
|
* when we exit from the system call. */
|
||||||
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
||||||
|
|
||||||
/* Store the value of the PSPLIM register before the SVC was raised.
|
/* Store the value of the PSPLIM register before the SVC was raised.
|
||||||
* We need to restore it when we exit from the system call. */
|
* We need to restore it when we exit from the system call. */
|
||||||
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
#if ( portUSE_PSPLIM_REGISTER == 1 )
|
||||||
|
@ -1300,6 +1303,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
|
|
||||||
/* Start executing the system call upon returning from this handler. */
|
/* Start executing the system call upon returning from this handler. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
||||||
|
|
||||||
/* Raise a request to exit from the system call upon finishing the
|
/* Raise a request to exit from the system call upon finishing the
|
||||||
* system call. */
|
* system call. */
|
||||||
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
||||||
|
@ -1359,6 +1363,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||||
|
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __privileged_functions_start__;
|
extern uint32_t * __privileged_functions_start__;
|
||||||
|
@ -1541,7 +1546,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
||||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
||||||
ulIndex++;
|
ulIndex++;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Check PACBTI security feature configuration before pushing the
|
/* Check PACBTI security feature configuration before pushing the
|
||||||
* CONTROL register's value on task's TCB. */
|
* CONTROL register's value on task's TCB. */
|
||||||
|
@ -1814,11 +1819,11 @@ BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
||||||
portNVIC_SHPR2_REG = 0;
|
portNVIC_SHPR2_REG = 0;
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
{
|
{
|
||||||
/* Set the CONTROL register value based on PACBTI security feature
|
/* Set the CONTROL register value based on PACBTI security feature
|
||||||
* configuration before starting the first task. */
|
* configuration before starting the first task. */
|
||||||
( void) prvConfigurePACBTI( pdTRUE );
|
( void ) prvConfigurePACBTI( pdTRUE );
|
||||||
}
|
}
|
||||||
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
#endif /* configENABLE_PAC == 1 || configENABLE_BTI == 1 */
|
||||||
|
|
||||||
|
@ -2018,9 +2023,9 @@ void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
if( xSchedulerRunning == pdFALSE )
|
if( xSchedulerRunning == pdFALSE )
|
||||||
{
|
{
|
||||||
/* Grant access to all the kernel objects before the scheduler
|
/* Grant access to all the kernel objects before the scheduler
|
||||||
* is started. It is necessary because there is no task running
|
* is started. It is necessary because there is no task running
|
||||||
* yet and therefore, we cannot use the permissions of any
|
* yet and therefore, we cannot use the permissions of any
|
||||||
* task. */
|
* task. */
|
||||||
xAccessGranted = pdTRUE;
|
xAccessGranted = pdTRUE;
|
||||||
}
|
}
|
||||||
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
else if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
||||||
|
@ -2241,7 +2246,7 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
#if ( ( configENABLE_PAC == 1 ) || ( configENABLE_BTI == 1 ) )
|
||||||
|
|
||||||
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
static uint32_t prvConfigurePACBTI( BaseType_t xWriteControlRegister )
|
||||||
{
|
{
|
||||||
|
@ -2253,13 +2258,13 @@ BaseType_t xPortIsInsideInterrupt( void )
|
||||||
/* Enable UsageFault exception. */
|
/* Enable UsageFault exception. */
|
||||||
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_USG_FAULT_ENABLE_BIT;
|
||||||
|
|
||||||
#if( configENABLE_PAC == 1 )
|
#if ( configENABLE_PAC == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
ulControl |= ( portCONTROL_UPAC_EN | portCONTROL_PAC_EN );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if( configENABLE_BTI == 1 )
|
#if ( configENABLE_BTI == 1 )
|
||||||
{
|
{
|
||||||
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
ulControl |= ( portCONTROL_UBTI_EN | portCONTROL_BTI_EN );
|
||||||
}
|
}
|
||||||
|
|
|
@ -243,54 +243,55 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
/*
|
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
/*
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
*
|
* +-----------+---------------+----------+-----------------+------------------------------+------------+-----+
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
*
|
||||||
* 16 16 8 8 5 16 1
|
* <-----------><--------------><---------><----------------><-----------------------------><-----------><---->
|
||||||
*/
|
* 16 16 8 8 5 16 1
|
||||||
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 70
|
#define MAX_CONTEXT_SIZE 70
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
* +-----------+---------------+----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
* <-----------><--------------><---------><----------------><-----------------------------><---->
|
||||||
* 16 16 8 8 5 1
|
* 16 16 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 54
|
#define MAX_CONTEXT_SIZE 54
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | | |
|
* | | | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
* <-----------><--------------><---------><----------------><---------------------><-----------><---->
|
||||||
* 16 16 8 8 4 16 1
|
* 16 16 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 69
|
#define MAX_CONTEXT_SIZE 69
|
||||||
|
|
||||||
#else
|
#else /* if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | s16-s31 | s0-s15, FPSCR | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | | | PC, xPSR | EXC_RETURN | |
|
* | | | | PC, xPSR | EXC_RETURN | |
|
||||||
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
* +-----------+---------------+----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <-----------><--------------><---------><----------------><---------------------><---->
|
* <-----------><--------------><---------><----------------><---------------------><---->
|
||||||
* 16 16 8 8 4 1
|
* 16 16 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 53
|
#define MAX_CONTEXT_SIZE 53
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
@ -299,54 +300,54 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
||||||
|
|
||||||
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
#if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | TaskPacKey | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | | |
|
||||||
* +----------+-----------------+------------------------------+------------+-----+
|
* +----------+-----------------+------------------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><-----------><---->
|
* <---------><----------------><------------------------------><-----------><---->
|
||||||
* 8 8 5 16 1
|
* 8 8 5 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 38
|
#define MAX_CONTEXT_SIZE 38
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 0 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
* | r4-r11 | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, | |
|
||||||
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
* | | PC, xPSR | CONTROL, EXC_RETURN | |
|
||||||
* +----------+-----------------+------------------------------+-----+
|
* +----------+-----------------+------------------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><------------------------------><---->
|
* <---------><----------------><------------------------------><---->
|
||||||
* 8 8 5 1
|
* 8 8 5 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 22
|
#define MAX_CONTEXT_SIZE 22
|
||||||
|
|
||||||
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
#elif ( ( configENABLE_TRUSTZONE == 0 ) && ( configENABLE_PAC == 1 ) )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | TaskPacKey | |
|
||||||
* | | PC, xPSR | EXC_RETURN | | |
|
* | | PC, xPSR | EXC_RETURN | | |
|
||||||
* +----------+-----------------+----------------------+------------+-----+
|
* +----------+-----------------+----------------------+------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><-----------><---->
|
* <---------><----------------><----------------------><-----------><---->
|
||||||
* 8 8 4 16 1
|
* 8 8 4 16 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 37
|
#define MAX_CONTEXT_SIZE 37
|
||||||
|
|
||||||
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
#else /* #if( configENABLE_TRUSTZONE == 1 ) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
* | r4-r11 | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL | |
|
||||||
* | | PC, xPSR | EXC_RETURN | |
|
* | | PC, xPSR | EXC_RETURN | |
|
||||||
* +----------+-----------------+----------------------+-----+
|
* +----------+-----------------+----------------------+-----+
|
||||||
*
|
*
|
||||||
* <---------><----------------><----------------------><---->
|
* <---------><----------------><----------------------><---->
|
||||||
* 8 8 4 1
|
* 8 8 4 1
|
||||||
*/
|
*/
|
||||||
#define MAX_CONTEXT_SIZE 21
|
#define MAX_CONTEXT_SIZE 21
|
||||||
|
|
||||||
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
#endif /* #if ( ( configENABLE_TRUSTZONE == 1 ) && ( configENABLE_PAC == 1 ) ) */
|
||||||
|
|
Loading…
Reference in a new issue