mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-09-01 20:03:50 -04:00
Update system call entry mechanism (#896)
Earlier the System Call entry from an unprivileged task looked like: 1. SVC for entering system call. 2. System call implementation. 3. SVC for exiting system call. Now, the system call entry needs to make only one system call and everything else is handled internally. This PR also makes the following small changes: 1. Add one struct param for system calls with 5 parameters. This removes the need for special handling for system calls with 5 parameters. 2. Remove raise privilege SVC when MPU wrapper v2 is used. 3. Add additional run time parameter checks to MPU wrappers for xTaskGenericNotify and xQueueTakeMutexRecursive APIs. These changes are tested on the following platforms: 1. STM32H743ZI (Cortex-M7) 2. STM32L152RE (Cortex-M3) 3. Nuvoton M2351 (Cortex-M23) 4. NXP LPC55S69 (Cortex-M33)
This commit is contained in:
parent
52c1c6e578
commit
9bfd85a253
115 changed files with 46168 additions and 54704 deletions
|
@ -32,15 +32,12 @@
|
|||
/*-----------------------------------------------------------*/
|
||||
|
||||
#include "FreeRTOSConfig.h"
|
||||
#include "mpu_syscall_numbers.h"
|
||||
|
||||
#ifndef configUSE_MPU_WRAPPERS_V1
|
||||
#define configUSE_MPU_WRAPPERS_V1 0
|
||||
#endif
|
||||
|
||||
/* These must be in sync with portmacro.h. */
|
||||
#define portSVC_SYSTEM_CALL_ENTER 4 /* System calls with upto 4 parameters. */
|
||||
#define portSVC_SYSTEM_CALL_ENTER_1 5 /* System calls with 5 parameters. */
|
||||
#define portSVC_SYSTEM_CALL_EXIT 6
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
#if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) )
|
||||
|
@ -56,10 +53,7 @@ MPU_xTaskDelayUntil:
|
|||
b MPU_xTaskDelayUntilImpl
|
||||
MPU_xTaskDelayUntil_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xTaskDelayUntilImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xTaskDelayUntil
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xTaskAbortDelay
|
||||
|
@ -73,10 +67,7 @@ MPU_xTaskAbortDelay:
|
|||
b MPU_xTaskAbortDelayImpl
|
||||
MPU_xTaskAbortDelay_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xTaskAbortDelayImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xTaskAbortDelay
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_vTaskDelay
|
||||
|
@ -90,10 +81,7 @@ MPU_vTaskDelay:
|
|||
b MPU_vTaskDelayImpl
|
||||
MPU_vTaskDelay_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_vTaskDelayImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_vTaskDelay
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_uxTaskPriorityGet
|
||||
|
@ -107,10 +95,7 @@ MPU_uxTaskPriorityGet:
|
|||
b MPU_uxTaskPriorityGetImpl
|
||||
MPU_uxTaskPriorityGet_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_uxTaskPriorityGetImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_uxTaskPriorityGet
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_eTaskGetState
|
||||
|
@ -124,10 +109,7 @@ MPU_eTaskGetState:
|
|||
b MPU_eTaskGetStateImpl
|
||||
MPU_eTaskGetState_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_eTaskGetStateImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_eTaskGetState
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_vTaskGetInfo
|
||||
|
@ -141,10 +123,7 @@ MPU_vTaskGetInfo:
|
|||
b MPU_vTaskGetInfoImpl
|
||||
MPU_vTaskGetInfo_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_vTaskGetInfoImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_vTaskGetInfo
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xTaskGetIdleTaskHandle
|
||||
|
@ -158,10 +137,7 @@ MPU_xTaskGetIdleTaskHandle:
|
|||
b MPU_xTaskGetIdleTaskHandleImpl
|
||||
MPU_xTaskGetIdleTaskHandle_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xTaskGetIdleTaskHandleImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xTaskGetIdleTaskHandle
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_vTaskSuspend
|
||||
|
@ -175,10 +151,7 @@ MPU_vTaskSuspend:
|
|||
b MPU_vTaskSuspendImpl
|
||||
MPU_vTaskSuspend_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_vTaskSuspendImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_vTaskSuspend
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_vTaskResume
|
||||
|
@ -192,10 +165,7 @@ MPU_vTaskResume:
|
|||
b MPU_vTaskResumeImpl
|
||||
MPU_vTaskResume_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_vTaskResumeImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_vTaskResume
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xTaskGetTickCount
|
||||
|
@ -209,10 +179,7 @@ MPU_xTaskGetTickCount:
|
|||
b MPU_xTaskGetTickCountImpl
|
||||
MPU_xTaskGetTickCount_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xTaskGetTickCountImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xTaskGetTickCount
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_uxTaskGetNumberOfTasks
|
||||
|
@ -226,10 +193,7 @@ MPU_uxTaskGetNumberOfTasks:
|
|||
b MPU_uxTaskGetNumberOfTasksImpl
|
||||
MPU_uxTaskGetNumberOfTasks_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_uxTaskGetNumberOfTasksImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_uxTaskGetNumberOfTasks
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_pcTaskGetName
|
||||
|
@ -243,10 +207,7 @@ MPU_pcTaskGetName:
|
|||
b MPU_pcTaskGetNameImpl
|
||||
MPU_pcTaskGetName_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_pcTaskGetNameImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_pcTaskGetName
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_ulTaskGetRunTimeCounter
|
||||
|
@ -260,10 +221,7 @@ MPU_ulTaskGetRunTimeCounter:
|
|||
b MPU_ulTaskGetRunTimeCounterImpl
|
||||
MPU_ulTaskGetRunTimeCounter_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_ulTaskGetRunTimeCounterImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_ulTaskGetRunTimeCounter
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_ulTaskGetRunTimePercent
|
||||
|
@ -277,10 +235,7 @@ MPU_ulTaskGetRunTimePercent:
|
|||
b MPU_ulTaskGetRunTimePercentImpl
|
||||
MPU_ulTaskGetRunTimePercent_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_ulTaskGetRunTimePercentImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_ulTaskGetRunTimePercent
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_ulTaskGetIdleRunTimePercent
|
||||
|
@ -294,10 +249,7 @@ MPU_ulTaskGetIdleRunTimePercent:
|
|||
b MPU_ulTaskGetIdleRunTimePercentImpl
|
||||
MPU_ulTaskGetIdleRunTimePercent_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_ulTaskGetIdleRunTimePercentImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_ulTaskGetIdleRunTimePercent
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_ulTaskGetIdleRunTimeCounter
|
||||
|
@ -311,10 +263,7 @@ MPU_ulTaskGetIdleRunTimeCounter:
|
|||
b MPU_ulTaskGetIdleRunTimeCounterImpl
|
||||
MPU_ulTaskGetIdleRunTimeCounter_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_ulTaskGetIdleRunTimeCounterImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_ulTaskGetIdleRunTimeCounter
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_vTaskSetApplicationTaskTag
|
||||
|
@ -328,10 +277,7 @@ MPU_vTaskSetApplicationTaskTag:
|
|||
b MPU_vTaskSetApplicationTaskTagImpl
|
||||
MPU_vTaskSetApplicationTaskTag_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_vTaskSetApplicationTaskTagImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_vTaskSetApplicationTaskTag
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xTaskGetApplicationTaskTag
|
||||
|
@ -345,10 +291,7 @@ MPU_xTaskGetApplicationTaskTag:
|
|||
b MPU_xTaskGetApplicationTaskTagImpl
|
||||
MPU_xTaskGetApplicationTaskTag_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xTaskGetApplicationTaskTagImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xTaskGetApplicationTaskTag
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_vTaskSetThreadLocalStoragePointer
|
||||
|
@ -362,10 +305,7 @@ MPU_vTaskSetThreadLocalStoragePointer:
|
|||
b MPU_vTaskSetThreadLocalStoragePointerImpl
|
||||
MPU_vTaskSetThreadLocalStoragePointer_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_vTaskSetThreadLocalStoragePointerImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_vTaskSetThreadLocalStoragePointer
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_pvTaskGetThreadLocalStoragePointer
|
||||
|
@ -379,10 +319,7 @@ MPU_pvTaskGetThreadLocalStoragePointer:
|
|||
b MPU_pvTaskGetThreadLocalStoragePointerImpl
|
||||
MPU_pvTaskGetThreadLocalStoragePointer_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_pvTaskGetThreadLocalStoragePointerImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_pvTaskGetThreadLocalStoragePointer
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_uxTaskGetSystemState
|
||||
|
@ -396,10 +333,7 @@ MPU_uxTaskGetSystemState:
|
|||
b MPU_uxTaskGetSystemStateImpl
|
||||
MPU_uxTaskGetSystemState_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_uxTaskGetSystemStateImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_uxTaskGetSystemState
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_uxTaskGetStackHighWaterMark
|
||||
|
@ -413,10 +347,7 @@ MPU_uxTaskGetStackHighWaterMark:
|
|||
b MPU_uxTaskGetStackHighWaterMarkImpl
|
||||
MPU_uxTaskGetStackHighWaterMark_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_uxTaskGetStackHighWaterMarkImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_uxTaskGetStackHighWaterMark
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_uxTaskGetStackHighWaterMark2
|
||||
|
@ -430,10 +361,7 @@ MPU_uxTaskGetStackHighWaterMark2:
|
|||
b MPU_uxTaskGetStackHighWaterMark2Impl
|
||||
MPU_uxTaskGetStackHighWaterMark2_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_uxTaskGetStackHighWaterMark2Impl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_uxTaskGetStackHighWaterMark2
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xTaskGetCurrentTaskHandle
|
||||
|
@ -447,10 +375,7 @@ MPU_xTaskGetCurrentTaskHandle:
|
|||
b MPU_xTaskGetCurrentTaskHandleImpl
|
||||
MPU_xTaskGetCurrentTaskHandle_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xTaskGetCurrentTaskHandleImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xTaskGetCurrentTaskHandle
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xTaskGetSchedulerState
|
||||
|
@ -464,10 +389,7 @@ MPU_xTaskGetSchedulerState:
|
|||
b MPU_xTaskGetSchedulerStateImpl
|
||||
MPU_xTaskGetSchedulerState_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xTaskGetSchedulerStateImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xTaskGetSchedulerState
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_vTaskSetTimeOutState
|
||||
|
@ -481,10 +403,7 @@ MPU_vTaskSetTimeOutState:
|
|||
b MPU_vTaskSetTimeOutStateImpl
|
||||
MPU_vTaskSetTimeOutState_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_vTaskSetTimeOutStateImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_vTaskSetTimeOutState
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xTaskCheckForTimeOut
|
||||
|
@ -498,14 +417,11 @@ MPU_xTaskCheckForTimeOut:
|
|||
b MPU_xTaskCheckForTimeOutImpl
|
||||
MPU_xTaskCheckForTimeOut_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xTaskCheckForTimeOutImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xTaskCheckForTimeOut
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xTaskGenericNotify
|
||||
MPU_xTaskGenericNotify:
|
||||
PUBLIC MPU_xTaskGenericNotifyEntry
|
||||
MPU_xTaskGenericNotifyEntry:
|
||||
push {r0}
|
||||
mrs r0, control
|
||||
tst r0, #1
|
||||
|
@ -515,14 +431,11 @@ MPU_xTaskGenericNotify:
|
|||
b MPU_xTaskGenericNotifyImpl
|
||||
MPU_xTaskGenericNotify_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER_1
|
||||
bl MPU_xTaskGenericNotifyImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xTaskGenericNotify
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xTaskGenericNotifyWait
|
||||
MPU_xTaskGenericNotifyWait:
|
||||
PUBLIC MPU_xTaskGenericNotifyWaitEntry
|
||||
MPU_xTaskGenericNotifyWaitEntry:
|
||||
push {r0}
|
||||
mrs r0, control
|
||||
tst r0, #1
|
||||
|
@ -532,10 +445,7 @@ MPU_xTaskGenericNotifyWait:
|
|||
b MPU_xTaskGenericNotifyWaitImpl
|
||||
MPU_xTaskGenericNotifyWait_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER_1
|
||||
bl MPU_xTaskGenericNotifyWaitImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xTaskGenericNotifyWait
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_ulTaskGenericNotifyTake
|
||||
|
@ -549,10 +459,7 @@ MPU_ulTaskGenericNotifyTake:
|
|||
b MPU_ulTaskGenericNotifyTakeImpl
|
||||
MPU_ulTaskGenericNotifyTake_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_ulTaskGenericNotifyTakeImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_ulTaskGenericNotifyTake
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xTaskGenericNotifyStateClear
|
||||
|
@ -566,10 +473,7 @@ MPU_xTaskGenericNotifyStateClear:
|
|||
b MPU_xTaskGenericNotifyStateClearImpl
|
||||
MPU_xTaskGenericNotifyStateClear_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xTaskGenericNotifyStateClearImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xTaskGenericNotifyStateClear
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_ulTaskGenericNotifyValueClear
|
||||
|
@ -583,10 +487,7 @@ MPU_ulTaskGenericNotifyValueClear:
|
|||
b MPU_ulTaskGenericNotifyValueClearImpl
|
||||
MPU_ulTaskGenericNotifyValueClear_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_ulTaskGenericNotifyValueClearImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_ulTaskGenericNotifyValueClear
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xQueueGenericSend
|
||||
|
@ -600,10 +501,7 @@ MPU_xQueueGenericSend:
|
|||
b MPU_xQueueGenericSendImpl
|
||||
MPU_xQueueGenericSend_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xQueueGenericSendImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xQueueGenericSend
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_uxQueueMessagesWaiting
|
||||
|
@ -617,10 +515,7 @@ MPU_uxQueueMessagesWaiting:
|
|||
b MPU_uxQueueMessagesWaitingImpl
|
||||
MPU_uxQueueMessagesWaiting_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_uxQueueMessagesWaitingImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_uxQueueMessagesWaiting
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_uxQueueSpacesAvailable
|
||||
|
@ -634,10 +529,7 @@ MPU_uxQueueSpacesAvailable:
|
|||
b MPU_uxQueueSpacesAvailableImpl
|
||||
MPU_uxQueueSpacesAvailable_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_uxQueueSpacesAvailableImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_uxQueueSpacesAvailable
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xQueueReceive
|
||||
|
@ -651,10 +543,7 @@ MPU_xQueueReceive:
|
|||
b MPU_xQueueReceiveImpl
|
||||
MPU_xQueueReceive_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xQueueReceiveImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xQueueReceive
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xQueuePeek
|
||||
|
@ -668,10 +557,7 @@ MPU_xQueuePeek:
|
|||
b MPU_xQueuePeekImpl
|
||||
MPU_xQueuePeek_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xQueuePeekImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xQueuePeek
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xQueueSemaphoreTake
|
||||
|
@ -685,10 +571,7 @@ MPU_xQueueSemaphoreTake:
|
|||
b MPU_xQueueSemaphoreTakeImpl
|
||||
MPU_xQueueSemaphoreTake_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xQueueSemaphoreTakeImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xQueueSemaphoreTake
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xQueueGetMutexHolder
|
||||
|
@ -702,10 +585,7 @@ MPU_xQueueGetMutexHolder:
|
|||
b MPU_xQueueGetMutexHolderImpl
|
||||
MPU_xQueueGetMutexHolder_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xQueueGetMutexHolderImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xQueueGetMutexHolder
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xQueueTakeMutexRecursive
|
||||
|
@ -719,10 +599,7 @@ MPU_xQueueTakeMutexRecursive:
|
|||
b MPU_xQueueTakeMutexRecursiveImpl
|
||||
MPU_xQueueTakeMutexRecursive_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xQueueTakeMutexRecursiveImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xQueueTakeMutexRecursive
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xQueueGiveMutexRecursive
|
||||
|
@ -736,10 +613,7 @@ MPU_xQueueGiveMutexRecursive:
|
|||
b MPU_xQueueGiveMutexRecursiveImpl
|
||||
MPU_xQueueGiveMutexRecursive_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xQueueGiveMutexRecursiveImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xQueueGiveMutexRecursive
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xQueueSelectFromSet
|
||||
|
@ -753,10 +627,7 @@ MPU_xQueueSelectFromSet:
|
|||
b MPU_xQueueSelectFromSetImpl
|
||||
MPU_xQueueSelectFromSet_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xQueueSelectFromSetImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xQueueSelectFromSet
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xQueueAddToSet
|
||||
|
@ -770,10 +641,7 @@ MPU_xQueueAddToSet:
|
|||
b MPU_xQueueAddToSetImpl
|
||||
MPU_xQueueAddToSet_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xQueueAddToSetImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xQueueAddToSet
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_vQueueAddToRegistry
|
||||
|
@ -787,10 +655,7 @@ MPU_vQueueAddToRegistry:
|
|||
b MPU_vQueueAddToRegistryImpl
|
||||
MPU_vQueueAddToRegistry_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_vQueueAddToRegistryImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_vQueueAddToRegistry
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_vQueueUnregisterQueue
|
||||
|
@ -804,10 +669,7 @@ MPU_vQueueUnregisterQueue:
|
|||
b MPU_vQueueUnregisterQueueImpl
|
||||
MPU_vQueueUnregisterQueue_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_vQueueUnregisterQueueImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_vQueueUnregisterQueue
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_pcQueueGetName
|
||||
|
@ -821,10 +683,7 @@ MPU_pcQueueGetName:
|
|||
b MPU_pcQueueGetNameImpl
|
||||
MPU_pcQueueGetName_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_pcQueueGetNameImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_pcQueueGetName
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_pvTimerGetTimerID
|
||||
|
@ -838,10 +697,7 @@ MPU_pvTimerGetTimerID:
|
|||
b MPU_pvTimerGetTimerIDImpl
|
||||
MPU_pvTimerGetTimerID_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_pvTimerGetTimerIDImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_pvTimerGetTimerID
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_vTimerSetTimerID
|
||||
|
@ -855,10 +711,7 @@ MPU_vTimerSetTimerID:
|
|||
b MPU_vTimerSetTimerIDImpl
|
||||
MPU_vTimerSetTimerID_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_vTimerSetTimerIDImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_vTimerSetTimerID
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xTimerIsTimerActive
|
||||
|
@ -872,10 +725,7 @@ MPU_xTimerIsTimerActive:
|
|||
b MPU_xTimerIsTimerActiveImpl
|
||||
MPU_xTimerIsTimerActive_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xTimerIsTimerActiveImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xTimerIsTimerActive
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xTimerGetTimerDaemonTaskHandle
|
||||
|
@ -889,14 +739,11 @@ MPU_xTimerGetTimerDaemonTaskHandle:
|
|||
b MPU_xTimerGetTimerDaemonTaskHandleImpl
|
||||
MPU_xTimerGetTimerDaemonTaskHandle_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xTimerGetTimerDaemonTaskHandleImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xTimerGetTimerDaemonTaskHandle
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xTimerGenericCommand
|
||||
MPU_xTimerGenericCommand:
|
||||
PUBLIC MPU_xTimerGenericCommandEntry
|
||||
MPU_xTimerGenericCommandEntry:
|
||||
push {r0}
|
||||
/* This function can be called from ISR also and therefore, we need a check
|
||||
* to take privileged path, if called from ISR. */
|
||||
|
@ -908,13 +755,10 @@ MPU_xTimerGenericCommand:
|
|||
beq MPU_xTimerGenericCommand_Priv
|
||||
MPU_xTimerGenericCommand_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER_1
|
||||
bl MPU_xTimerGenericCommandImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xTimerGenericCommand
|
||||
MPU_xTimerGenericCommand_Priv:
|
||||
pop {r0}
|
||||
b MPU_xTimerGenericCommandImpl
|
||||
b MPU_xTimerGenericCommandPrivImpl
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
|
@ -929,10 +773,7 @@ MPU_pcTimerGetName:
|
|||
b MPU_pcTimerGetNameImpl
|
||||
MPU_pcTimerGetName_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_pcTimerGetNameImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_pcTimerGetName
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_vTimerSetReloadMode
|
||||
|
@ -946,10 +787,7 @@ MPU_vTimerSetReloadMode:
|
|||
b MPU_vTimerSetReloadModeImpl
|
||||
MPU_vTimerSetReloadMode_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_vTimerSetReloadModeImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_vTimerSetReloadMode
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xTimerGetReloadMode
|
||||
|
@ -963,10 +801,7 @@ MPU_xTimerGetReloadMode:
|
|||
b MPU_xTimerGetReloadModeImpl
|
||||
MPU_xTimerGetReloadMode_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xTimerGetReloadModeImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xTimerGetReloadMode
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_uxTimerGetReloadMode
|
||||
|
@ -980,10 +815,7 @@ MPU_uxTimerGetReloadMode:
|
|||
b MPU_uxTimerGetReloadModeImpl
|
||||
MPU_uxTimerGetReloadMode_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_uxTimerGetReloadModeImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_uxTimerGetReloadMode
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xTimerGetPeriod
|
||||
|
@ -997,10 +829,7 @@ MPU_xTimerGetPeriod:
|
|||
b MPU_xTimerGetPeriodImpl
|
||||
MPU_xTimerGetPeriod_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xTimerGetPeriodImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xTimerGetPeriod
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xTimerGetExpiryTime
|
||||
|
@ -1014,14 +843,11 @@ MPU_xTimerGetExpiryTime:
|
|||
b MPU_xTimerGetExpiryTimeImpl
|
||||
MPU_xTimerGetExpiryTime_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xTimerGetExpiryTimeImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xTimerGetExpiryTime
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xEventGroupWaitBits
|
||||
MPU_xEventGroupWaitBits:
|
||||
PUBLIC MPU_xEventGroupWaitBitsEntry
|
||||
MPU_xEventGroupWaitBitsEntry:
|
||||
push {r0}
|
||||
mrs r0, control
|
||||
tst r0, #1
|
||||
|
@ -1031,10 +857,7 @@ MPU_xEventGroupWaitBits:
|
|||
b MPU_xEventGroupWaitBitsImpl
|
||||
MPU_xEventGroupWaitBits_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER_1
|
||||
bl MPU_xEventGroupWaitBitsImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xEventGroupWaitBits
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xEventGroupClearBits
|
||||
|
@ -1048,10 +871,7 @@ MPU_xEventGroupClearBits:
|
|||
b MPU_xEventGroupClearBitsImpl
|
||||
MPU_xEventGroupClearBits_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xEventGroupClearBitsImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xEventGroupClearBits
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xEventGroupSetBits
|
||||
|
@ -1065,10 +885,7 @@ MPU_xEventGroupSetBits:
|
|||
b MPU_xEventGroupSetBitsImpl
|
||||
MPU_xEventGroupSetBits_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xEventGroupSetBitsImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xEventGroupSetBits
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xEventGroupSync
|
||||
|
@ -1082,10 +899,7 @@ MPU_xEventGroupSync:
|
|||
b MPU_xEventGroupSyncImpl
|
||||
MPU_xEventGroupSync_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xEventGroupSyncImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xEventGroupSync
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_uxEventGroupGetNumber
|
||||
|
@ -1099,10 +913,7 @@ MPU_uxEventGroupGetNumber:
|
|||
b MPU_uxEventGroupGetNumberImpl
|
||||
MPU_uxEventGroupGetNumber_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_uxEventGroupGetNumberImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_uxEventGroupGetNumber
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_vEventGroupSetNumber
|
||||
|
@ -1116,10 +927,7 @@ MPU_vEventGroupSetNumber:
|
|||
b MPU_vEventGroupSetNumberImpl
|
||||
MPU_vEventGroupSetNumber_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_vEventGroupSetNumberImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_vEventGroupSetNumber
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xStreamBufferSend
|
||||
|
@ -1133,10 +941,7 @@ MPU_xStreamBufferSend:
|
|||
b MPU_xStreamBufferSendImpl
|
||||
MPU_xStreamBufferSend_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xStreamBufferSendImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xStreamBufferSend
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xStreamBufferReceive
|
||||
|
@ -1150,10 +955,7 @@ MPU_xStreamBufferReceive:
|
|||
b MPU_xStreamBufferReceiveImpl
|
||||
MPU_xStreamBufferReceive_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xStreamBufferReceiveImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xStreamBufferReceive
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xStreamBufferIsFull
|
||||
|
@ -1167,10 +969,7 @@ MPU_xStreamBufferIsFull:
|
|||
b MPU_xStreamBufferIsFullImpl
|
||||
MPU_xStreamBufferIsFull_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xStreamBufferIsFullImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xStreamBufferIsFull
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xStreamBufferIsEmpty
|
||||
|
@ -1184,10 +983,7 @@ MPU_xStreamBufferIsEmpty:
|
|||
b MPU_xStreamBufferIsEmptyImpl
|
||||
MPU_xStreamBufferIsEmpty_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xStreamBufferIsEmptyImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xStreamBufferIsEmpty
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xStreamBufferSpacesAvailable
|
||||
|
@ -1201,10 +997,7 @@ MPU_xStreamBufferSpacesAvailable:
|
|||
b MPU_xStreamBufferSpacesAvailableImpl
|
||||
MPU_xStreamBufferSpacesAvailable_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xStreamBufferSpacesAvailableImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xStreamBufferSpacesAvailable
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xStreamBufferBytesAvailable
|
||||
|
@ -1218,10 +1011,7 @@ MPU_xStreamBufferBytesAvailable:
|
|||
b MPU_xStreamBufferBytesAvailableImpl
|
||||
MPU_xStreamBufferBytesAvailable_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xStreamBufferBytesAvailableImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xStreamBufferBytesAvailable
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xStreamBufferSetTriggerLevel
|
||||
|
@ -1235,10 +1025,7 @@ MPU_xStreamBufferSetTriggerLevel:
|
|||
b MPU_xStreamBufferSetTriggerLevelImpl
|
||||
MPU_xStreamBufferSetTriggerLevel_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xStreamBufferSetTriggerLevelImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xStreamBufferSetTriggerLevel
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_xStreamBufferNextMessageLengthBytes
|
||||
|
@ -1252,10 +1039,7 @@ MPU_xStreamBufferNextMessageLengthBytes:
|
|||
b MPU_xStreamBufferNextMessageLengthBytesImpl
|
||||
MPU_xStreamBufferNextMessageLengthBytes_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER
|
||||
bl MPU_xStreamBufferNextMessageLengthBytesImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xStreamBufferNextMessageLengthBytes
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/* Default weak implementations in case one is not available from
|
||||
|
@ -1461,9 +1245,9 @@ MPU_xTimerIsTimerActiveImpl:
|
|||
MPU_xTimerGetTimerDaemonTaskHandleImpl:
|
||||
b MPU_xTimerGetTimerDaemonTaskHandleImpl
|
||||
|
||||
PUBWEAK MPU_xTimerGenericCommandImpl
|
||||
MPU_xTimerGenericCommandImpl:
|
||||
b MPU_xTimerGenericCommandImpl
|
||||
PUBWEAK MPU_xTimerGenericCommandPrivImpl
|
||||
MPU_xTimerGenericCommandPrivImpl:
|
||||
b MPU_xTimerGenericCommandPrivImpl
|
||||
|
||||
PUBWEAK MPU_pcTimerGetNameImpl
|
||||
MPU_pcTimerGetNameImpl:
|
||||
|
|
|
@ -35,8 +35,9 @@
|
|||
#include "FreeRTOS.h"
|
||||
#include "task.h"
|
||||
|
||||
/* MPU wrappers includes. */
|
||||
/* MPU includes. */
|
||||
#include "mpu_wrappers.h"
|
||||
#include "mpu_syscall_numbers.h"
|
||||
|
||||
/* Portasm includes. */
|
||||
#include "portasm.h"
|
||||
|
@ -216,11 +217,11 @@
|
|||
|
||||
/* Extract last address of the MPU region as encoded in the
|
||||
* RLAR (Region Limit Address Register) value. */
|
||||
#define portEXTRACT_LAST_ADDRESS_FROM_RLAR( rlar ) \
|
||||
#define portEXTRACT_LAST_ADDRESS_FROM_RLAR( rlar ) \
|
||||
( ( ( rlar ) & portMPU_RLAR_ADDRESS_MASK ) | ~portMPU_RLAR_ADDRESS_MASK )
|
||||
|
||||
/* Does addr lies within [start, end] address range? */
|
||||
#define portIS_ADDRESS_WITHIN_RANGE( addr, start, end ) \
|
||||
#define portIS_ADDRESS_WITHIN_RANGE( addr, start, end ) \
|
||||
( ( ( addr ) >= ( start ) ) && ( ( addr ) <= ( end ) ) )
|
||||
|
||||
/* Is the access request satisfied by the available permissions? */
|
||||
|
@ -422,31 +423,26 @@ portDONT_DISCARD void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) PRIV
|
|||
|
||||
#if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) )
|
||||
|
||||
/**
|
||||
* @brief Sets up the system call stack so that upon returning from
|
||||
* SVC, the system call stack is used.
|
||||
*
|
||||
* It is used for the system calls with up to 4 parameters.
|
||||
*
|
||||
* @param pulTaskStack The current SP when the SVC was raised.
|
||||
* @param ulLR The value of Link Register (EXC_RETURN) in the SVC handler.
|
||||
*/
|
||||
void vSystemCallEnter( uint32_t * pulTaskStack, uint32_t ulLR ) PRIVILEGED_FUNCTION;
|
||||
/**
|
||||
* @brief Sets up the system call stack so that upon returning from
|
||||
* SVC, the system call stack is used.
|
||||
*
|
||||
* @param pulTaskStack The current SP when the SVC was raised.
|
||||
* @param ulLR The value of Link Register (EXC_RETURN) in the SVC handler.
|
||||
* @param ucSystemCallNumber The system call number of the system call.
|
||||
*/
|
||||
void vSystemCallEnter( uint32_t * pulTaskStack,
|
||||
uint32_t ulLR,
|
||||
uint8_t ucSystemCallNumber ) PRIVILEGED_FUNCTION;
|
||||
|
||||
#endif /* ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) */
|
||||
|
||||
#if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) )
|
||||
|
||||
/**
|
||||
* @brief Sets up the system call stack so that upon returning from
|
||||
* SVC, the system call stack is used.
|
||||
*
|
||||
* It is used for the system calls with 5 parameters.
|
||||
*
|
||||
* @param pulTaskStack The current SP when the SVC was raised.
|
||||
* @param ulLR The value of Link Register (EXC_RETURN) in the SVC handler.
|
||||
*/
|
||||
void vSystemCallEnter_1( uint32_t * pulTaskStack, uint32_t ulLR ) PRIVILEGED_FUNCTION;
|
||||
/**
|
||||
* @brief Raise SVC for exiting from a system call.
|
||||
*/
|
||||
void vRequestSystemCallExit( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
|
||||
|
||||
#endif /* ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) */
|
||||
|
||||
|
@ -459,7 +455,8 @@ portDONT_DISCARD void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) PRIV
|
|||
* @param pulSystemCallStack The current SP when the SVC was raised.
|
||||
* @param ulLR The value of Link Register (EXC_RETURN) in the SVC handler.
|
||||
*/
|
||||
void vSystemCallExit( uint32_t * pulSystemCallStack, uint32_t ulLR ) PRIVILEGED_FUNCTION;
|
||||
void vSystemCallExit( uint32_t * pulSystemCallStack,
|
||||
uint32_t ulLR ) PRIVILEGED_FUNCTION;
|
||||
|
||||
#endif /* ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) */
|
||||
|
||||
|
@ -813,7 +810,6 @@ static void prvTaskExitError( void )
|
|||
static void prvSetupMPU( void ) /* PRIVILEGED_FUNCTION */
|
||||
{
|
||||
#if defined( __ARMCC_VERSION )
|
||||
|
||||
/* Declaration when these variable are defined in code instead of being
|
||||
* exported from linker scripts. */
|
||||
extern uint32_t * __privileged_functions_start__;
|
||||
|
@ -983,7 +979,6 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
|||
{
|
||||
#if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 1 ) )
|
||||
#if defined( __ARMCC_VERSION )
|
||||
|
||||
/* Declaration when these variable are defined in code instead of being
|
||||
* exported from linker scripts. */
|
||||
extern uint32_t * __syscalls_flash_start__;
|
||||
|
@ -1101,513 +1096,454 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
|
|||
|
||||
#if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) )
|
||||
|
||||
void vSystemCallEnter( uint32_t * pulTaskStack, uint32_t ulLR ) /* PRIVILEGED_FUNCTION */
|
||||
{
|
||||
extern TaskHandle_t pxCurrentTCB;
|
||||
xMPU_SETTINGS * pxMpuSettings;
|
||||
uint32_t * pulSystemCallStack;
|
||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||
#if defined( __ARMCC_VERSION )
|
||||
/* Declaration when these variable are defined in code instead of being
|
||||
* exported from linker scripts. */
|
||||
extern uint32_t * __syscalls_flash_start__;
|
||||
extern uint32_t * __syscalls_flash_end__;
|
||||
#else
|
||||
/* Declaration when these variable are exported from linker scripts. */
|
||||
extern uint32_t __syscalls_flash_start__[];
|
||||
extern uint32_t __syscalls_flash_end__[];
|
||||
#endif /* #if defined( __ARMCC_VERSION ) */
|
||||
|
||||
ulSystemCallLocation = pulTaskStack[ portOFFSET_TO_PC ];
|
||||
|
||||
/* If the request did not come from the system call section, do nothing. */
|
||||
if( ( ulSystemCallLocation >= ( uint32_t ) __syscalls_flash_start__ ) &&
|
||||
( ulSystemCallLocation <= ( uint32_t ) __syscalls_flash_end__ ) )
|
||||
void vSystemCallEnter( uint32_t * pulTaskStack,
|
||||
uint32_t ulLR,
|
||||
uint8_t ucSystemCallNumber ) /* PRIVILEGED_FUNCTION */
|
||||
{
|
||||
extern TaskHandle_t pxCurrentTCB;
|
||||
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
|
||||
xMPU_SETTINGS * pxMpuSettings;
|
||||
uint32_t * pulSystemCallStack;
|
||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||
|
||||
#if defined( __ARMCC_VERSION )
|
||||
/* Declaration when these variable are defined in code instead of being
|
||||
* exported from linker scripts. */
|
||||
extern uint32_t * __syscalls_flash_start__;
|
||||
extern uint32_t * __syscalls_flash_end__;
|
||||
#else
|
||||
/* Declaration when these variable are exported from linker scripts. */
|
||||
extern uint32_t __syscalls_flash_start__[];
|
||||
extern uint32_t __syscalls_flash_end__[];
|
||||
#endif /* #if defined( __ARMCC_VERSION ) */
|
||||
|
||||
ulSystemCallLocation = pulTaskStack[ portOFFSET_TO_PC ];
|
||||
pxMpuSettings = xTaskGetMPUSettings( pxCurrentTCB );
|
||||
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
|
||||
|
||||
/* This is not NULL only for the duration of the system call. */
|
||||
configASSERT( pxMpuSettings->xSystemCallStackInfo.pulTaskStack == NULL );
|
||||
|
||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||
/* Checks:
|
||||
* 1. SVC is raised from the system call section (i.e. application is
|
||||
* not raising SVC directly).
|
||||
* 2. pxMpuSettings->xSystemCallStackInfo.pulTaskStack must be NULL as
|
||||
* it is non-NULL only during the execution of a system call (i.e.
|
||||
* between system call enter and exit).
|
||||
* 3. System call is not for a kernel API disabled by the configuration
|
||||
* in FreeRTOSConfig.h.
|
||||
* 4. We do not need to check that ucSystemCallNumber is within range
|
||||
* because the assembly SVC handler checks that before calling
|
||||
* this function.
|
||||
*/
|
||||
if( ( ulSystemCallLocation >= ( uint32_t ) __syscalls_flash_start__ ) &&
|
||||
( ulSystemCallLocation <= ( uint32_t ) __syscalls_flash_end__ ) &&
|
||||
( pxMpuSettings->xSystemCallStackInfo.pulTaskStack == NULL ) &&
|
||||
( uxSystemCallImplementations[ ucSystemCallNumber ] != ( UBaseType_t ) 0 ) )
|
||||
{
|
||||
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
|
||||
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
|
||||
|
||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||
{
|
||||
/* Extended frame i.e. FPU in use. */
|
||||
ulStackFrameSize = 26;
|
||||
__asm volatile (
|
||||
" vpush {s0} \n" /* Trigger lazy stacking. */
|
||||
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
|
||||
::: "memory"
|
||||
);
|
||||
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
|
||||
{
|
||||
/* Extended frame i.e. FPU in use. */
|
||||
ulStackFrameSize = 26;
|
||||
__asm volatile
|
||||
(
|
||||
" vpush {s0} \n" /* Trigger lazy stacking. */
|
||||
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
|
||||
::: "memory"
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Standard frame i.e. FPU not in use. */
|
||||
ulStackFrameSize = 8;
|
||||
}
|
||||
}
|
||||
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
|
||||
{
|
||||
ulStackFrameSize = 8;
|
||||
}
|
||||
#endif /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
|
||||
|
||||
/* Make space on the system call stack for the stack frame. */
|
||||
pulSystemCallStack = pulSystemCallStack - ulStackFrameSize;
|
||||
|
||||
/* Copy the stack frame. */
|
||||
for( i = 0; i < ulStackFrameSize; i++ )
|
||||
{
|
||||
pulSystemCallStack[ i ] = pulTaskStack[ i ];
|
||||
}
|
||||
|
||||
/* Store the value of the Link Register before the SVC was raised.
|
||||
* It contains the address of the caller of the System Call entry
|
||||
* point (i.e. the caller of the MPU_<API>). We need to restore it
|
||||
* when we exit from the system call. */
|
||||
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
||||
|
||||
/* Store the value of the PSPLIM register before the SVC was raised.
|
||||
* We need to restore it when we exit from the system call. */
|
||||
__asm volatile ( "mrs %0, psplim" : "=r" ( pxMpuSettings->xSystemCallStackInfo.ulStackLimitRegisterAtSystemCallEntry ) );
|
||||
|
||||
/* Use the pulSystemCallStack in thread mode. */
|
||||
__asm volatile ( "msr psp, %0" : : "r" ( pulSystemCallStack ) );
|
||||
__asm volatile ( "msr psplim, %0" : : "r" ( pxMpuSettings->xSystemCallStackInfo.pulSystemCallStackLimit ) );
|
||||
|
||||
/* Start executing the system call upon returning from this handler. */
|
||||
pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];
|
||||
|
||||
/* Raise a request to exit from the system call upon finishing the
|
||||
* system call. */
|
||||
pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;
|
||||
|
||||
/* Remember the location where we should copy the stack frame when we exit from
|
||||
* the system call. */
|
||||
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize;
|
||||
|
||||
/* Record if the hardware used padding to force the stack pointer
|
||||
* to be double word aligned. */
|
||||
if( ( pulTaskStack[ portOFFSET_TO_PSR ] & portPSR_STACK_PADDING_MASK ) == portPSR_STACK_PADDING_MASK )
|
||||
{
|
||||
pxMpuSettings->ulTaskFlags |= portSTACK_FRAME_HAS_PADDING_FLAG;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Standard frame i.e. FPU not in use. */
|
||||
ulStackFrameSize = 8;
|
||||
pxMpuSettings->ulTaskFlags &= ( ~portSTACK_FRAME_HAS_PADDING_FLAG );
|
||||
}
|
||||
|
||||
/* We ensure in pxPortInitialiseStack that the system call stack is
|
||||
* double word aligned and therefore, there is no need of padding.
|
||||
* Clear the bit[9] of stacked xPSR. */
|
||||
pulSystemCallStack[ portOFFSET_TO_PSR ] &= ( ~portPSR_STACK_PADDING_MASK );
|
||||
|
||||
/* Raise the privilege for the duration of the system call. */
|
||||
__asm volatile
|
||||
(
|
||||
" mrs r0, control \n" /* Obtain current control value. */
|
||||
" movs r1, #1 \n" /* r1 = 1. */
|
||||
" bics r0, r1 \n" /* Clear nPRIV bit. */
|
||||
" msr control, r0 \n" /* Write back new control value. */
|
||||
::: "r0", "r1", "memory"
|
||||
);
|
||||
}
|
||||
#else
|
||||
{
|
||||
ulStackFrameSize = 8;
|
||||
}
|
||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||
|
||||
/* Make space on the system call stack for the stack frame. */
|
||||
pulSystemCallStack = pulSystemCallStack - ulStackFrameSize;
|
||||
|
||||
/* Copy the stack frame. */
|
||||
for( i = 0; i < ulStackFrameSize; i++ )
|
||||
{
|
||||
pulSystemCallStack[ i ] = pulTaskStack[ i ];
|
||||
}
|
||||
|
||||
/* Store the value of the LR and PSPLIM registers before the SVC was raised. We need to
|
||||
* restore it when we exit from the system call. */
|
||||
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
||||
__asm volatile ( "mrs %0, psplim" : "=r" ( pxMpuSettings->xSystemCallStackInfo.ulStackLimitRegisterAtSystemCallEntry ) );
|
||||
|
||||
/* Use the pulSystemCallStack in thread mode. */
|
||||
__asm volatile ( "msr psp, %0" : : "r" ( pulSystemCallStack ) );
|
||||
__asm volatile ( "msr psplim, %0" : : "r" ( pxMpuSettings->xSystemCallStackInfo.pulSystemCallStackLimit ) );
|
||||
|
||||
/* Remember the location where we should copy the stack frame when we exit from
|
||||
* the system call. */
|
||||
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize;
|
||||
|
||||
/* Record if the hardware used padding to force the stack pointer
|
||||
* to be double word aligned. */
|
||||
if( ( pulTaskStack[ portOFFSET_TO_PSR ] & portPSR_STACK_PADDING_MASK ) == portPSR_STACK_PADDING_MASK )
|
||||
{
|
||||
pxMpuSettings->ulTaskFlags |= portSTACK_FRAME_HAS_PADDING_FLAG;
|
||||
}
|
||||
else
|
||||
{
|
||||
pxMpuSettings->ulTaskFlags &= ( ~portSTACK_FRAME_HAS_PADDING_FLAG );
|
||||
}
|
||||
|
||||
/* We ensure in pxPortInitialiseStack that the system call stack is
|
||||
* double word aligned and therefore, there is no need of padding.
|
||||
* Clear the bit[9] of stacked xPSR. */
|
||||
pulSystemCallStack[ portOFFSET_TO_PSR ] &= ( ~portPSR_STACK_PADDING_MASK );
|
||||
|
||||
/* Raise the privilege for the duration of the system call. */
|
||||
__asm volatile (
|
||||
" mrs r0, control \n" /* Obtain current control value. */
|
||||
" movs r1, #1 \n" /* r1 = 1. */
|
||||
" bics r0, r1 \n" /* Clear nPRIV bit. */
|
||||
" msr control, r0 \n" /* Write back new control value. */
|
||||
::: "r0", "r1", "memory"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) */
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
#if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) )
|
||||
|
||||
void vSystemCallEnter_1( uint32_t * pulTaskStack, uint32_t ulLR ) /* PRIVILEGED_FUNCTION */
|
||||
{
|
||||
extern TaskHandle_t pxCurrentTCB;
|
||||
xMPU_SETTINGS * pxMpuSettings;
|
||||
uint32_t * pulSystemCallStack;
|
||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||
#if defined( __ARMCC_VERSION )
|
||||
/* Declaration when these variable are defined in code instead of being
|
||||
* exported from linker scripts. */
|
||||
extern uint32_t * __syscalls_flash_start__;
|
||||
extern uint32_t * __syscalls_flash_end__;
|
||||
#else
|
||||
/* Declaration when these variable are exported from linker scripts. */
|
||||
extern uint32_t __syscalls_flash_start__[];
|
||||
extern uint32_t __syscalls_flash_end__[];
|
||||
#endif /* #if defined( __ARMCC_VERSION ) */
|
||||
|
||||
ulSystemCallLocation = pulTaskStack[ portOFFSET_TO_PC ];
|
||||
|
||||
/* If the request did not come from the system call section, do nothing. */
|
||||
if( ( ulSystemCallLocation >= ( uint32_t ) __syscalls_flash_start__ ) &&
|
||||
( ulSystemCallLocation <= ( uint32_t ) __syscalls_flash_end__ ) )
|
||||
void vRequestSystemCallExit( void ) /* __attribute__( ( naked ) ) PRIVILEGED_FUNCTION */
|
||||
{
|
||||
pxMpuSettings = xTaskGetMPUSettings( pxCurrentTCB );
|
||||
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
|
||||
|
||||
/* This is not NULL only for the duration of the system call. */
|
||||
configASSERT( pxMpuSettings->xSystemCallStackInfo.pulTaskStack == NULL );
|
||||
|
||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||
{
|
||||
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
|
||||
{
|
||||
/* Extended frame i.e. FPU in use. */
|
||||
ulStackFrameSize = 26;
|
||||
__asm volatile (
|
||||
" vpush {s0} \n" /* Trigger lazy stacking. */
|
||||
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
|
||||
::: "memory"
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Standard frame i.e. FPU not in use. */
|
||||
ulStackFrameSize = 8;
|
||||
}
|
||||
}
|
||||
#else
|
||||
{
|
||||
ulStackFrameSize = 8;
|
||||
}
|
||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||
|
||||
/* Make space on the system call stack for the stack frame and
|
||||
* the parameter passed on the stack. We only need to copy one
|
||||
* parameter but we still reserve 2 spaces to keep the stack
|
||||
* double word aligned. */
|
||||
pulSystemCallStack = pulSystemCallStack - ulStackFrameSize - 2UL;
|
||||
|
||||
/* Copy the stack frame. */
|
||||
for( i = 0; i < ulStackFrameSize; i++ )
|
||||
{
|
||||
pulSystemCallStack[ i ] = pulTaskStack[ i ];
|
||||
}
|
||||
|
||||
/* Copy the parameter which is passed the stack. */
|
||||
if( ( pulTaskStack[ portOFFSET_TO_PSR ] & portPSR_STACK_PADDING_MASK ) == portPSR_STACK_PADDING_MASK )
|
||||
{
|
||||
pulSystemCallStack[ ulStackFrameSize ] = pulTaskStack[ ulStackFrameSize + 1 ];
|
||||
/* Record if the hardware used padding to force the stack pointer
|
||||
* to be double word aligned. */
|
||||
pxMpuSettings->ulTaskFlags |= portSTACK_FRAME_HAS_PADDING_FLAG;
|
||||
}
|
||||
else
|
||||
{
|
||||
pulSystemCallStack[ ulStackFrameSize ] = pulTaskStack[ ulStackFrameSize ];
|
||||
/* Record if the hardware used padding to force the stack pointer
|
||||
* to be double word aligned. */
|
||||
pxMpuSettings->ulTaskFlags &= ( ~portSTACK_FRAME_HAS_PADDING_FLAG );
|
||||
}
|
||||
|
||||
/* Store the value of the LR and PSPLIM registers before the SVC was raised.
|
||||
* We need to restore it when we exit from the system call. */
|
||||
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
||||
__asm volatile ( "mrs %0, psplim" : "=r" ( pxMpuSettings->xSystemCallStackInfo.ulStackLimitRegisterAtSystemCallEntry ) );
|
||||
|
||||
/* Use the pulSystemCallStack in thread mode. */
|
||||
__asm volatile ( "msr psp, %0" : : "r" ( pulSystemCallStack ) );
|
||||
__asm volatile ( "msr psplim, %0" : : "r" ( pxMpuSettings->xSystemCallStackInfo.pulSystemCallStackLimit ) );
|
||||
|
||||
/* Remember the location where we should copy the stack frame when we exit from
|
||||
* the system call. */
|
||||
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize;
|
||||
|
||||
/* We ensure in pxPortInitialiseStack that the system call stack is
|
||||
* double word aligned and therefore, there is no need of padding.
|
||||
* Clear the bit[9] of stacked xPSR. */
|
||||
pulSystemCallStack[ portOFFSET_TO_PSR ] &= ( ~portPSR_STACK_PADDING_MASK );
|
||||
|
||||
/* Raise the privilege for the duration of the system call. */
|
||||
__asm volatile (
|
||||
" mrs r0, control \n" /* Obtain current control value. */
|
||||
" movs r1, #1 \n" /* r1 = 1. */
|
||||
" bics r0, r1 \n" /* Clear nPRIV bit. */
|
||||
" msr control, r0 \n" /* Write back new control value. */
|
||||
::: "r0", "r1", "memory"
|
||||
);
|
||||
__asm volatile ( "svc %0 \n" ::"i" ( portSVC_SYSTEM_CALL_EXIT ) : "memory" );
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) */
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
#if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) )
|
||||
|
||||
void vSystemCallExit( uint32_t * pulSystemCallStack, uint32_t ulLR ) /* PRIVILEGED_FUNCTION */
|
||||
{
|
||||
extern TaskHandle_t pxCurrentTCB;
|
||||
xMPU_SETTINGS * pxMpuSettings;
|
||||
uint32_t * pulTaskStack;
|
||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||
#if defined( __ARMCC_VERSION )
|
||||
/* Declaration when these variable are defined in code instead of being
|
||||
* exported from linker scripts. */
|
||||
extern uint32_t * __syscalls_flash_start__;
|
||||
extern uint32_t * __syscalls_flash_end__;
|
||||
#else
|
||||
/* Declaration when these variable are exported from linker scripts. */
|
||||
extern uint32_t __syscalls_flash_start__[];
|
||||
extern uint32_t __syscalls_flash_end__[];
|
||||
#endif /* #if defined( __ARMCC_VERSION ) */
|
||||
|
||||
ulSystemCallLocation = pulSystemCallStack[ portOFFSET_TO_PC ];
|
||||
|
||||
/* If the request did not come from the system call section, do nothing. */
|
||||
if( ( ulSystemCallLocation >= ( uint32_t ) __syscalls_flash_start__ ) &&
|
||||
( ulSystemCallLocation <= ( uint32_t ) __syscalls_flash_end__ ) )
|
||||
void vSystemCallExit( uint32_t * pulSystemCallStack,
|
||||
uint32_t ulLR ) /* PRIVILEGED_FUNCTION */
|
||||
{
|
||||
pxMpuSettings = xTaskGetMPUSettings( pxCurrentTCB );
|
||||
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
|
||||
extern TaskHandle_t pxCurrentTCB;
|
||||
xMPU_SETTINGS * pxMpuSettings;
|
||||
uint32_t * pulTaskStack;
|
||||
uint32_t ulStackFrameSize, ulSystemCallLocation, i;
|
||||
|
||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||
#if defined( __ARMCC_VERSION )
|
||||
/* Declaration when these variable are defined in code instead of being
|
||||
* exported from linker scripts. */
|
||||
extern uint32_t * __privileged_functions_start__;
|
||||
extern uint32_t * __privileged_functions_end__;
|
||||
#else
|
||||
/* Declaration when these variable are exported from linker scripts. */
|
||||
extern uint32_t __privileged_functions_start__[];
|
||||
extern uint32_t __privileged_functions_end__[];
|
||||
#endif /* #if defined( __ARMCC_VERSION ) */
|
||||
|
||||
ulSystemCallLocation = pulSystemCallStack[ portOFFSET_TO_PC ];
|
||||
pxMpuSettings = xTaskGetMPUSettings( pxCurrentTCB );
|
||||
|
||||
/* Checks:
|
||||
* 1. SVC is raised from the privileged code (i.e. application is not
|
||||
* raising SVC directly). This SVC is only raised from
|
||||
* vRequestSystemCallExit which is in the privileged code section.
|
||||
* 2. pxMpuSettings->xSystemCallStackInfo.pulTaskStack must not be NULL -
|
||||
* this means that we previously entered a system call and the
|
||||
* application is not attempting to exit without entering a system
|
||||
* call.
|
||||
*/
|
||||
if( ( ulSystemCallLocation >= ( uint32_t ) __privileged_functions_start__ ) &&
|
||||
( ulSystemCallLocation <= ( uint32_t ) __privileged_functions_end__ ) &&
|
||||
( pxMpuSettings->xSystemCallStackInfo.pulTaskStack != NULL ) )
|
||||
{
|
||||
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
|
||||
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
|
||||
|
||||
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
|
||||
{
|
||||
/* Extended frame i.e. FPU in use. */
|
||||
ulStackFrameSize = 26;
|
||||
__asm volatile (
|
||||
" vpush {s0} \n" /* Trigger lazy stacking. */
|
||||
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
|
||||
::: "memory"
|
||||
);
|
||||
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
|
||||
{
|
||||
/* Extended frame i.e. FPU in use. */
|
||||
ulStackFrameSize = 26;
|
||||
__asm volatile
|
||||
(
|
||||
" vpush {s0} \n" /* Trigger lazy stacking. */
|
||||
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
|
||||
::: "memory"
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Standard frame i.e. FPU not in use. */
|
||||
ulStackFrameSize = 8;
|
||||
}
|
||||
}
|
||||
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
|
||||
{
|
||||
ulStackFrameSize = 8;
|
||||
}
|
||||
#endif /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
|
||||
|
||||
/* Make space on the task stack for the stack frame. */
|
||||
pulTaskStack = pulTaskStack - ulStackFrameSize;
|
||||
|
||||
/* Copy the stack frame. */
|
||||
for( i = 0; i < ulStackFrameSize; i++ )
|
||||
{
|
||||
pulTaskStack[ i ] = pulSystemCallStack[ i ];
|
||||
}
|
||||
|
||||
/* Use the pulTaskStack in thread mode. */
|
||||
__asm volatile ( "msr psp, %0" : : "r" ( pulTaskStack ) );
|
||||
|
||||
/* Return to the caller of the System Call entry point (i.e. the
|
||||
* caller of the MPU_<API>). */
|
||||
pulTaskStack[ portOFFSET_TO_PC ] = pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry;
|
||||
/* Ensure that LR has a valid value.*/
|
||||
pulTaskStack[ portOFFSET_TO_LR ] = pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry;
|
||||
|
||||
/* Restore the PSPLIM register to what it was at the time of
|
||||
* system call entry. */
|
||||
__asm volatile ( "msr psplim, %0" : : "r" ( pxMpuSettings->xSystemCallStackInfo.ulStackLimitRegisterAtSystemCallEntry ) );
|
||||
|
||||
/* If the hardware used padding to force the stack pointer
|
||||
* to be double word aligned, set the stacked xPSR bit[9],
|
||||
* otherwise clear it. */
|
||||
if( ( pxMpuSettings->ulTaskFlags & portSTACK_FRAME_HAS_PADDING_FLAG ) == portSTACK_FRAME_HAS_PADDING_FLAG )
|
||||
{
|
||||
pulTaskStack[ portOFFSET_TO_PSR ] |= portPSR_STACK_PADDING_MASK;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Standard frame i.e. FPU not in use. */
|
||||
ulStackFrameSize = 8;
|
||||
pulTaskStack[ portOFFSET_TO_PSR ] &= ( ~portPSR_STACK_PADDING_MASK );
|
||||
}
|
||||
|
||||
/* This is not NULL only for the duration of the system call. */
|
||||
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = NULL;
|
||||
|
||||
/* Drop the privilege before returning to the thread mode. */
|
||||
__asm volatile
|
||||
(
|
||||
" mrs r0, control \n" /* Obtain current control value. */
|
||||
" movs r1, #1 \n" /* r1 = 1. */
|
||||
" orrs r0, r1 \n" /* Set nPRIV bit. */
|
||||
" msr control, r0 \n" /* Write back new control value. */
|
||||
::: "r0", "r1", "memory"
|
||||
);
|
||||
}
|
||||
#else
|
||||
{
|
||||
ulStackFrameSize = 8;
|
||||
}
|
||||
#endif /* configENABLE_FPU || configENABLE_MVE */
|
||||
|
||||
/* Make space on the task stack for the stack frame. */
|
||||
pulTaskStack = pulTaskStack - ulStackFrameSize;
|
||||
|
||||
/* Copy the stack frame. */
|
||||
for( i = 0; i < ulStackFrameSize; i++ )
|
||||
{
|
||||
pulTaskStack[ i ] = pulSystemCallStack[ i ];
|
||||
}
|
||||
|
||||
/* Use the pulTaskStack in thread mode. */
|
||||
__asm volatile ( "msr psp, %0" : : "r" ( pulTaskStack ) );
|
||||
|
||||
/* Restore the LR and PSPLIM to what they were at the time of
|
||||
* system call entry. */
|
||||
pulTaskStack[ portOFFSET_TO_LR ] = pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry;
|
||||
__asm volatile ( "msr psplim, %0" : : "r" ( pxMpuSettings->xSystemCallStackInfo.ulStackLimitRegisterAtSystemCallEntry ) );
|
||||
|
||||
/* If the hardware used padding to force the stack pointer
|
||||
* to be double word aligned, set the stacked xPSR bit[9],
|
||||
* otherwise clear it. */
|
||||
if( ( pxMpuSettings->ulTaskFlags & portSTACK_FRAME_HAS_PADDING_FLAG ) == portSTACK_FRAME_HAS_PADDING_FLAG )
|
||||
{
|
||||
pulTaskStack[ portOFFSET_TO_PSR ] |= portPSR_STACK_PADDING_MASK;
|
||||
}
|
||||
else
|
||||
{
|
||||
pulTaskStack[ portOFFSET_TO_PSR ] &= ( ~portPSR_STACK_PADDING_MASK );
|
||||
}
|
||||
|
||||
/* This is not NULL only for the duration of the system call. */
|
||||
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = NULL;
|
||||
|
||||
/* Drop the privilege before returning to the thread mode. */
|
||||
__asm volatile (
|
||||
" mrs r0, control \n" /* Obtain current control value. */
|
||||
" movs r1, #1 \n" /* r1 = 1. */
|
||||
" orrs r0, r1 \n" /* Set nPRIV bit. */
|
||||
" msr control, r0 \n" /* Write back new control value. */
|
||||
::: "r0", "r1", "memory"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) */
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
#if ( configENABLE_MPU == 1 )
|
||||
|
||||
BaseType_t xPortIsTaskPrivileged( void ) /* PRIVILEGED_FUNCTION */
|
||||
{
|
||||
BaseType_t xTaskIsPrivileged = pdFALSE;
|
||||
const xMPU_SETTINGS * xTaskMpuSettings = xTaskGetMPUSettings( NULL ); /* Calling task's MPU settings. */
|
||||
|
||||
if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
||||
BaseType_t xPortIsTaskPrivileged( void ) /* PRIVILEGED_FUNCTION */
|
||||
{
|
||||
xTaskIsPrivileged = pdTRUE;
|
||||
}
|
||||
BaseType_t xTaskIsPrivileged = pdFALSE;
|
||||
const xMPU_SETTINGS * xTaskMpuSettings = xTaskGetMPUSettings( NULL ); /* Calling task's MPU settings. */
|
||||
|
||||
return xTaskIsPrivileged;
|
||||
}
|
||||
if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
||||
{
|
||||
xTaskIsPrivileged = pdTRUE;
|
||||
}
|
||||
|
||||
return xTaskIsPrivileged;
|
||||
}
|
||||
|
||||
#endif /* configENABLE_MPU == 1 */
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
#if( configENABLE_MPU == 1 )
|
||||
#if ( configENABLE_MPU == 1 )
|
||||
|
||||
StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,
|
||||
StackType_t * pxEndOfStack,
|
||||
TaskFunction_t pxCode,
|
||||
void * pvParameters,
|
||||
BaseType_t xRunPrivileged,
|
||||
xMPU_SETTINGS * xMPUSettings ) /* PRIVILEGED_FUNCTION */
|
||||
{
|
||||
uint32_t ulIndex = 0;
|
||||
|
||||
xMPUSettings->ulContext[ ulIndex ] = 0x04040404; /* r4. */
|
||||
ulIndex++;
|
||||
xMPUSettings->ulContext[ ulIndex ] = 0x05050505; /* r5. */
|
||||
ulIndex++;
|
||||
xMPUSettings->ulContext[ ulIndex ] = 0x06060606; /* r6. */
|
||||
ulIndex++;
|
||||
xMPUSettings->ulContext[ ulIndex ] = 0x07070707; /* r7. */
|
||||
ulIndex++;
|
||||
xMPUSettings->ulContext[ ulIndex ] = 0x08080808; /* r8. */
|
||||
ulIndex++;
|
||||
xMPUSettings->ulContext[ ulIndex ] = 0x09090909; /* r9. */
|
||||
ulIndex++;
|
||||
xMPUSettings->ulContext[ ulIndex ] = 0x10101010; /* r10. */
|
||||
ulIndex++;
|
||||
xMPUSettings->ulContext[ ulIndex ] = 0x11111111; /* r11. */
|
||||
ulIndex++;
|
||||
|
||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pvParameters; /* r0. */
|
||||
ulIndex++;
|
||||
xMPUSettings->ulContext[ ulIndex ] = 0x01010101; /* r1. */
|
||||
ulIndex++;
|
||||
xMPUSettings->ulContext[ ulIndex ] = 0x02020202; /* r2. */
|
||||
ulIndex++;
|
||||
xMPUSettings->ulContext[ ulIndex ] = 0x03030303; /* r3. */
|
||||
ulIndex++;
|
||||
xMPUSettings->ulContext[ ulIndex ] = 0x12121212; /* r12. */
|
||||
ulIndex++;
|
||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) portTASK_RETURN_ADDRESS; /* LR. */
|
||||
ulIndex++;
|
||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxCode; /* PC. */
|
||||
ulIndex++;
|
||||
xMPUSettings->ulContext[ ulIndex ] = portINITIAL_XPSR; /* xPSR. */
|
||||
ulIndex++;
|
||||
|
||||
#if ( configENABLE_TRUSTZONE == 1 )
|
||||
StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,
|
||||
StackType_t * pxEndOfStack,
|
||||
TaskFunction_t pxCode,
|
||||
void * pvParameters,
|
||||
BaseType_t xRunPrivileged,
|
||||
xMPU_SETTINGS * xMPUSettings ) /* PRIVILEGED_FUNCTION */
|
||||
{
|
||||
xMPUSettings->ulContext[ ulIndex ] = portNO_SECURE_CONTEXT; /* xSecureContext. */
|
||||
uint32_t ulIndex = 0;
|
||||
|
||||
xMPUSettings->ulContext[ ulIndex ] = 0x04040404; /* r4. */
|
||||
ulIndex++;
|
||||
}
|
||||
#endif /* configENABLE_TRUSTZONE */
|
||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) ( pxTopOfStack - 8 ); /* PSP with the hardware saved stack. */
|
||||
ulIndex++;
|
||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
||||
ulIndex++;
|
||||
if( xRunPrivileged == pdTRUE )
|
||||
{
|
||||
xMPUSettings->ulTaskFlags |= portTASK_IS_PRIVILEGED_FLAG;
|
||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) portINITIAL_CONTROL_PRIVILEGED; /* CONTROL. */
|
||||
xMPUSettings->ulContext[ ulIndex ] = 0x05050505; /* r5. */
|
||||
ulIndex++;
|
||||
}
|
||||
else
|
||||
{
|
||||
xMPUSettings->ulTaskFlags &= ( ~portTASK_IS_PRIVILEGED_FLAG );
|
||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) portINITIAL_CONTROL_UNPRIVILEGED; /* CONTROL. */
|
||||
xMPUSettings->ulContext[ ulIndex ] = 0x06060606; /* r6. */
|
||||
ulIndex++;
|
||||
xMPUSettings->ulContext[ ulIndex ] = 0x07070707; /* r7. */
|
||||
ulIndex++;
|
||||
xMPUSettings->ulContext[ ulIndex ] = 0x08080808; /* r8. */
|
||||
ulIndex++;
|
||||
xMPUSettings->ulContext[ ulIndex ] = 0x09090909; /* r9. */
|
||||
ulIndex++;
|
||||
xMPUSettings->ulContext[ ulIndex ] = 0x10101010; /* r10. */
|
||||
ulIndex++;
|
||||
xMPUSettings->ulContext[ ulIndex ] = 0x11111111; /* r11. */
|
||||
ulIndex++;
|
||||
|
||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pvParameters; /* r0. */
|
||||
ulIndex++;
|
||||
xMPUSettings->ulContext[ ulIndex ] = 0x01010101; /* r1. */
|
||||
ulIndex++;
|
||||
xMPUSettings->ulContext[ ulIndex ] = 0x02020202; /* r2. */
|
||||
ulIndex++;
|
||||
xMPUSettings->ulContext[ ulIndex ] = 0x03030303; /* r3. */
|
||||
ulIndex++;
|
||||
xMPUSettings->ulContext[ ulIndex ] = 0x12121212; /* r12. */
|
||||
ulIndex++;
|
||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) portTASK_RETURN_ADDRESS; /* LR. */
|
||||
ulIndex++;
|
||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxCode; /* PC. */
|
||||
ulIndex++;
|
||||
xMPUSettings->ulContext[ ulIndex ] = portINITIAL_XPSR; /* xPSR. */
|
||||
ulIndex++;
|
||||
|
||||
#if ( configENABLE_TRUSTZONE == 1 )
|
||||
{
|
||||
xMPUSettings->ulContext[ ulIndex ] = portNO_SECURE_CONTEXT; /* xSecureContext. */
|
||||
ulIndex++;
|
||||
}
|
||||
#endif /* configENABLE_TRUSTZONE */
|
||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) ( pxTopOfStack - 8 ); /* PSP with the hardware saved stack. */
|
||||
ulIndex++;
|
||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack; /* PSPLIM. */
|
||||
ulIndex++;
|
||||
if( xRunPrivileged == pdTRUE )
|
||||
{
|
||||
xMPUSettings->ulTaskFlags |= portTASK_IS_PRIVILEGED_FLAG;
|
||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) portINITIAL_CONTROL_PRIVILEGED; /* CONTROL. */
|
||||
ulIndex++;
|
||||
}
|
||||
else
|
||||
{
|
||||
xMPUSettings->ulTaskFlags &= ( ~portTASK_IS_PRIVILEGED_FLAG );
|
||||
xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) portINITIAL_CONTROL_UNPRIVILEGED; /* CONTROL. */
|
||||
ulIndex++;
|
||||
}
|
||||
xMPUSettings->ulContext[ ulIndex ] = portINITIAL_EXC_RETURN; /* LR (EXC_RETURN). */
|
||||
ulIndex++;
|
||||
|
||||
#if ( configUSE_MPU_WRAPPERS_V1 == 0 )
|
||||
{
|
||||
/* Ensure that the system call stack is double word aligned. */
|
||||
xMPUSettings->xSystemCallStackInfo.pulSystemCallStack = &( xMPUSettings->xSystemCallStackInfo.ulSystemCallStackBuffer[ configSYSTEM_CALL_STACK_SIZE - 1 ] );
|
||||
xMPUSettings->xSystemCallStackInfo.pulSystemCallStack = ( uint32_t * ) ( ( uint32_t ) ( xMPUSettings->xSystemCallStackInfo.pulSystemCallStack ) &
|
||||
( uint32_t ) ( ~( portBYTE_ALIGNMENT_MASK ) ) );
|
||||
|
||||
xMPUSettings->xSystemCallStackInfo.pulSystemCallStackLimit = &( xMPUSettings->xSystemCallStackInfo.ulSystemCallStackBuffer[ 0 ] );
|
||||
xMPUSettings->xSystemCallStackInfo.pulSystemCallStackLimit = ( uint32_t * ) ( ( ( uint32_t ) ( xMPUSettings->xSystemCallStackInfo.pulSystemCallStackLimit ) +
|
||||
( uint32_t ) ( portBYTE_ALIGNMENT - 1 ) ) &
|
||||
( uint32_t ) ( ~( portBYTE_ALIGNMENT_MASK ) ) );
|
||||
|
||||
/* This is not NULL only for the duration of a system call. */
|
||||
xMPUSettings->xSystemCallStackInfo.pulTaskStack = NULL;
|
||||
}
|
||||
#endif /* configUSE_MPU_WRAPPERS_V1 == 0 */
|
||||
|
||||
return &( xMPUSettings->ulContext[ ulIndex ] );
|
||||
}
|
||||
xMPUSettings->ulContext[ ulIndex ] = portINITIAL_EXC_RETURN; /* LR (EXC_RETURN). */
|
||||
ulIndex++;
|
||||
|
||||
#if ( configUSE_MPU_WRAPPERS_V1 == 0 )
|
||||
{
|
||||
/* Ensure that the system call stack is double word aligned. */
|
||||
xMPUSettings->xSystemCallStackInfo.pulSystemCallStack = &( xMPUSettings->xSystemCallStackInfo.ulSystemCallStackBuffer[ configSYSTEM_CALL_STACK_SIZE - 1 ] );
|
||||
xMPUSettings->xSystemCallStackInfo.pulSystemCallStack = ( uint32_t * ) ( ( uint32_t ) ( xMPUSettings->xSystemCallStackInfo.pulSystemCallStack ) &
|
||||
( uint32_t ) ( ~( portBYTE_ALIGNMENT_MASK ) ) );
|
||||
|
||||
xMPUSettings->xSystemCallStackInfo.pulSystemCallStackLimit = &( xMPUSettings->xSystemCallStackInfo.ulSystemCallStackBuffer[ 0 ] );
|
||||
xMPUSettings->xSystemCallStackInfo.pulSystemCallStackLimit = ( uint32_t * ) ( ( ( uint32_t ) ( xMPUSettings->xSystemCallStackInfo.pulSystemCallStackLimit ) +
|
||||
( uint32_t ) ( portBYTE_ALIGNMENT - 1 ) ) &
|
||||
( uint32_t ) ( ~( portBYTE_ALIGNMENT_MASK ) ) );
|
||||
|
||||
/* This is not NULL only for the duration of a system call. */
|
||||
xMPUSettings->xSystemCallStackInfo.pulTaskStack = NULL;
|
||||
}
|
||||
#endif /* configUSE_MPU_WRAPPERS_V1 == 0 */
|
||||
|
||||
return &( xMPUSettings->ulContext[ ulIndex ] );
|
||||
}
|
||||
|
||||
#else /* configENABLE_MPU */
|
||||
|
||||
StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,
|
||||
StackType_t * pxEndOfStack,
|
||||
TaskFunction_t pxCode,
|
||||
void * pvParameters ) /* PRIVILEGED_FUNCTION */
|
||||
{
|
||||
/* Simulate the stack frame as it would be created by a context switch
|
||||
* interrupt. */
|
||||
#if ( portPRELOAD_REGISTERS == 0 )
|
||||
StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,
|
||||
StackType_t * pxEndOfStack,
|
||||
TaskFunction_t pxCode,
|
||||
void * pvParameters ) /* PRIVILEGED_FUNCTION */
|
||||
{
|
||||
pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */
|
||||
*pxTopOfStack = portINITIAL_XPSR; /* xPSR. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) pxCode; /* PC. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR. */
|
||||
pxTopOfStack -= 5; /* R12, R3, R2 and R1. */
|
||||
*pxTopOfStack = ( StackType_t ) pvParameters; /* R0. */
|
||||
pxTopOfStack -= 9; /* R11..R4, EXC_RETURN. */
|
||||
*pxTopOfStack = portINITIAL_EXC_RETURN;
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */
|
||||
|
||||
#if ( configENABLE_TRUSTZONE == 1 )
|
||||
/* Simulate the stack frame as it would be created by a context switch
|
||||
* interrupt. */
|
||||
#if ( portPRELOAD_REGISTERS == 0 )
|
||||
{
|
||||
pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */
|
||||
*pxTopOfStack = portINITIAL_XPSR; /* xPSR. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */
|
||||
}
|
||||
#endif /* configENABLE_TRUSTZONE */
|
||||
}
|
||||
#else /* portPRELOAD_REGISTERS */
|
||||
{
|
||||
pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */
|
||||
*pxTopOfStack = portINITIAL_XPSR; /* xPSR. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) pxCode; /* PC. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) 0x12121212UL; /* R12. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) 0x03030303UL; /* R3. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) 0x02020202UL; /* R2. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) 0x01010101UL; /* R1. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) pvParameters; /* R0. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) 0x11111111UL; /* R11. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) 0x10101010UL; /* R10. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) 0x09090909UL; /* R09. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) 0x08080808UL; /* R08. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) 0x07070707UL; /* R07. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) 0x06060606UL; /* R06. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) 0x05050505UL; /* R05. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) 0x04040404UL; /* R04. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = portINITIAL_EXC_RETURN; /* EXC_RETURN. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */
|
||||
*pxTopOfStack = ( StackType_t ) pxCode; /* PC. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR. */
|
||||
pxTopOfStack -= 5; /* R12, R3, R2 and R1. */
|
||||
*pxTopOfStack = ( StackType_t ) pvParameters; /* R0. */
|
||||
pxTopOfStack -= 9; /* R11..R4, EXC_RETURN. */
|
||||
*pxTopOfStack = portINITIAL_EXC_RETURN;
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */
|
||||
|
||||
#if ( configENABLE_TRUSTZONE == 1 )
|
||||
#if ( configENABLE_TRUSTZONE == 1 )
|
||||
{
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */
|
||||
}
|
||||
#endif /* configENABLE_TRUSTZONE */
|
||||
}
|
||||
#else /* portPRELOAD_REGISTERS */
|
||||
{
|
||||
pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */
|
||||
*pxTopOfStack = portINITIAL_XPSR; /* xPSR. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */
|
||||
}
|
||||
#endif /* configENABLE_TRUSTZONE */
|
||||
}
|
||||
#endif /* portPRELOAD_REGISTERS */
|
||||
*pxTopOfStack = ( StackType_t ) pxCode; /* PC. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) 0x12121212UL; /* R12. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) 0x03030303UL; /* R3. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) 0x02020202UL; /* R2. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) 0x01010101UL; /* R1. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) pvParameters; /* R0. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) 0x11111111UL; /* R11. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) 0x10101010UL; /* R10. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) 0x09090909UL; /* R09. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) 0x08080808UL; /* R08. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) 0x07070707UL; /* R07. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) 0x06060606UL; /* R06. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) 0x05050505UL; /* R05. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) 0x04040404UL; /* R04. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = portINITIAL_EXC_RETURN; /* EXC_RETURN. */
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */
|
||||
|
||||
return pxTopOfStack;
|
||||
}
|
||||
#if ( configENABLE_TRUSTZONE == 1 )
|
||||
{
|
||||
pxTopOfStack--;
|
||||
*pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */
|
||||
}
|
||||
#endif /* configENABLE_TRUSTZONE */
|
||||
}
|
||||
#endif /* portPRELOAD_REGISTERS */
|
||||
|
||||
return pxTopOfStack;
|
||||
}
|
||||
|
||||
#endif /* configENABLE_MPU */
|
||||
/*-----------------------------------------------------------*/
|
||||
|
@ -1750,7 +1686,6 @@ void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */
|
|||
int32_t lIndex = 0;
|
||||
|
||||
#if defined( __ARMCC_VERSION )
|
||||
|
||||
/* Declaration when these variable are defined in code instead of being
|
||||
* exported from linker scripts. */
|
||||
extern uint32_t * __privileged_sram_start__;
|
||||
|
|
|
@ -32,6 +32,9 @@ the code is included in C files but excluded by the preprocessor in assembly
|
|||
files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */
|
||||
#include "FreeRTOSConfig.h"
|
||||
|
||||
/* System call numbers includes. */
|
||||
#include "mpu_syscall_numbers.h"
|
||||
|
||||
#ifndef configUSE_MPU_WRAPPERS_V1
|
||||
#define configUSE_MPU_WRAPPERS_V1 0
|
||||
#endif
|
||||
|
@ -44,7 +47,6 @@ files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler.
|
|||
EXTERN SecureContext_LoadContext
|
||||
#if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) )
|
||||
EXTERN vSystemCallEnter
|
||||
EXTERN vSystemCallEnter_1
|
||||
EXTERN vSystemCallExit
|
||||
#endif
|
||||
|
||||
|
@ -86,7 +88,7 @@ vResetPrivilege:
|
|||
/*-----------------------------------------------------------*/
|
||||
|
||||
vPortAllocateSecureContext:
|
||||
svc 0 /* Secure context is allocated in the supervisor call. portSVC_ALLOCATE_SECURE_CONTEXT = 0. */
|
||||
svc 100 /* Secure context is allocated in the supervisor call. portSVC_ALLOCATE_SECURE_CONTEXT = 100. */
|
||||
bx lr /* Return. */
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
|
@ -205,7 +207,7 @@ vStartFirstTask:
|
|||
cpsie f
|
||||
dsb
|
||||
isb
|
||||
svc 2 /* System call to start the first task. portSVC_START_SCHEDULER = 2. */
|
||||
svc 102 /* System call to start the first task. portSVC_START_SCHEDULER = 102. */
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
ulSetInterruptMask:
|
||||
|
@ -455,11 +457,9 @@ SVC_Handler:
|
|||
|
||||
ldr r1, [r0, #24]
|
||||
ldrb r2, [r1, #-2]
|
||||
cmp r2, #4 /* portSVC_SYSTEM_CALL_ENTER. */
|
||||
beq syscall_enter
|
||||
cmp r2, #5 /* portSVC_SYSTEM_CALL_ENTER_1. */
|
||||
beq syscall_enter_1
|
||||
cmp r2, #6 /* portSVC_SYSTEM_CALL_EXIT. */
|
||||
cmp r2, #NUM_SYSTEM_CALLS
|
||||
blt syscall_enter
|
||||
cmp r2, #104 /* portSVC_SYSTEM_CALL_EXIT. */
|
||||
beq syscall_exit
|
||||
b vPortSVCHandler_C
|
||||
|
||||
|
@ -467,10 +467,6 @@ SVC_Handler:
|
|||
mov r1, lr
|
||||
b vSystemCallEnter
|
||||
|
||||
syscall_enter_1:
|
||||
mov r1, lr
|
||||
b vSystemCallEnter_1
|
||||
|
||||
syscall_exit:
|
||||
mov r1, lr
|
||||
b vSystemCallExit
|
||||
|
@ -493,7 +489,7 @@ vPortFreeSecureContext:
|
|||
ldr r1, [r2] /* The first item on the stack is the task's xSecureContext. */
|
||||
cmp r1, #0 /* Raise svc if task's xSecureContext is not NULL. */
|
||||
it ne
|
||||
svcne 1 /* Secure context is freed in the supervisor call. portSVC_FREE_SECURE_CONTEXT = 1. */
|
||||
svcne 101 /* Secure context is freed in the supervisor call. portSVC_FREE_SECURE_CONTEXT = 101. */
|
||||
bx lr /* Return. */
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
|
|
|
@ -316,13 +316,12 @@ extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) P
|
|||
/**
|
||||
* @brief SVC numbers.
|
||||
*/
|
||||
#define portSVC_ALLOCATE_SECURE_CONTEXT 0
|
||||
#define portSVC_FREE_SECURE_CONTEXT 1
|
||||
#define portSVC_START_SCHEDULER 2
|
||||
#define portSVC_RAISE_PRIVILEGE 3
|
||||
#define portSVC_SYSTEM_CALL_ENTER 4 /* System calls with upto 4 parameters. */
|
||||
#define portSVC_SYSTEM_CALL_ENTER_1 5 /* System calls with 5 parameters. */
|
||||
#define portSVC_SYSTEM_CALL_EXIT 6
|
||||
#define portSVC_ALLOCATE_SECURE_CONTEXT 100
|
||||
#define portSVC_FREE_SECURE_CONTEXT 101
|
||||
#define portSVC_START_SCHEDULER 102
|
||||
#define portSVC_RAISE_PRIVILEGE 103
|
||||
#define portSVC_SYSTEM_CALL_EXIT 104
|
||||
#define portSVC_YIELD 105
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue