mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-09-02 12:24:07 -04:00
Update system call entry mechanism (#898)
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 SVC call and everything else is handled internally. This PR also makes the following changes: 1. Update the Access Control List (ACL) mechanism to grant access to all the kernel objects before the scheduler is started. 2. Add one struct param for system calls with 5 parameters. This removes the need for special handling for system calls with 5 parameters. 3. Remove raise privilege SVC when MPU wrapper v2 is used. 4. Add additional run time parameter checks to MPU wrappers for xTaskGenericNotify and xQueueTakeMutexRecursive APIs.
This commit is contained in:
parent
4ff01a7a4a
commit
76be28cdc6
114 changed files with 7521 additions and 16320 deletions
|
@ -32,6 +32,7 @@
|
|||
* 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"
|
||||
#include "mpu_syscall_numbers.h"
|
||||
|
||||
SECTION freertos_system_calls:CODE:NOROOT(2)
|
||||
THUMB
|
||||
|
@ -41,10 +42,6 @@
|
|||
#define configUSE_MPU_WRAPPERS_V1 0
|
||||
#endif
|
||||
|
||||
/* These must be in sync with portmacro.h. */
|
||||
#define portSVC_SYSTEM_CALL_ENTER 3 /* System calls with upto 4 parameters. */
|
||||
#define portSVC_SYSTEM_CALL_ENTER_1 4 /* System calls with 5 parameters. */
|
||||
#define portSVC_SYSTEM_CALL_EXIT 5
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
#if ( configUSE_MPU_WRAPPERS_V1 == 0 )
|
||||
|
@ -60,10 +57,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
|
||||
|
@ -77,10 +71,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
|
||||
|
@ -94,10 +85,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
|
||||
|
@ -111,10 +99,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
|
||||
|
@ -128,10 +113,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
|
||||
|
@ -145,10 +127,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
|
||||
|
@ -162,10 +141,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
|
||||
|
@ -179,10 +155,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
|
||||
|
@ -196,10 +169,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
|
||||
|
@ -213,10 +183,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
|
||||
|
@ -230,10 +197,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_ulTaskGetRunTimeCounter
|
||||
|
@ -247,10 +211,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
|
||||
|
@ -264,10 +225,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
|
||||
|
@ -281,10 +239,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
|
||||
|
@ -298,10 +253,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
|
||||
|
@ -315,10 +267,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
|
||||
|
@ -332,10 +281,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
|
||||
|
@ -349,10 +295,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
|
||||
|
@ -366,10 +309,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
|
||||
|
@ -383,10 +323,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
|
||||
|
@ -400,10 +337,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
|
||||
|
@ -417,10 +351,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
|
||||
|
@ -434,10 +365,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
|
||||
|
@ -451,10 +379,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
|
||||
|
@ -468,10 +393,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
|
||||
|
@ -485,14 +407,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
|
||||
|
@ -502,14 +421,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
|
||||
|
@ -519,10 +435,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
|
||||
|
@ -536,10 +449,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
|
||||
|
@ -553,10 +463,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
|
||||
|
@ -570,10 +477,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
|
||||
|
@ -587,10 +491,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
|
||||
|
@ -604,10 +505,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
|
||||
|
@ -621,10 +519,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
|
||||
|
@ -638,10 +533,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
|
||||
|
@ -655,10 +547,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
|
||||
|
@ -672,10 +561,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
|
||||
|
@ -689,10 +575,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
|
||||
|
@ -706,10 +589,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
|
||||
|
@ -723,10 +603,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
|
||||
|
@ -740,10 +617,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
|
||||
|
@ -757,10 +631,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
|
||||
|
@ -774,10 +645,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
|
||||
|
@ -791,10 +659,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
|
||||
|
@ -808,10 +673,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
|
||||
|
@ -825,10 +687,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
|
||||
|
@ -842,10 +701,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
|
||||
|
@ -859,10 +715,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
|
||||
|
@ -876,14 +729,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_xTimerGenericCommandFromTask
|
||||
MPU_xTimerGenericCommandFromTask:
|
||||
PUBLIC MPU_xTimerGenericCommandFromTaskEntry
|
||||
MPU_xTimerGenericCommandFromTaskEntry:
|
||||
push {r0}
|
||||
mrs r0, control
|
||||
tst r0, #1
|
||||
|
@ -893,10 +743,7 @@ MPU_xTimerGenericCommandFromTask:
|
|||
b MPU_xTimerGenericCommandFromTaskImpl
|
||||
MPU_xTimerGenericCommandFromTask_Unpriv:
|
||||
pop {r0}
|
||||
svc #portSVC_SYSTEM_CALL_ENTER_1
|
||||
bl MPU_xTimerGenericCommandFromTaskImpl
|
||||
svc #portSVC_SYSTEM_CALL_EXIT
|
||||
bx lr
|
||||
svc #SYSTEM_CALL_xTimerGenericCommandFromTask
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
PUBLIC MPU_pcTimerGetName
|
||||
|
@ -910,10 +757,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
|
||||
|
@ -927,10 +771,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
|
||||
|
@ -944,10 +785,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
|
||||
|
@ -961,10 +799,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
|
||||
|
@ -978,10 +813,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
|
||||
|
@ -995,14 +827,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
|
||||
|
@ -1012,10 +841,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
|
||||
|
@ -1029,10 +855,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
|
||||
|
@ -1046,10 +869,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
|
||||
|
@ -1063,10 +883,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
|
||||
|
@ -1080,10 +897,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
|
||||
|
@ -1097,10 +911,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
|
||||
|
@ -1114,10 +925,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
|
||||
|
@ -1131,10 +939,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
|
||||
|
@ -1148,10 +953,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
|
||||
|
@ -1165,10 +967,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
|
||||
|
@ -1182,10 +981,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
|
||||
|
@ -1199,10 +995,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
|
||||
|
@ -1216,10 +1009,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
|
||||
|
@ -1233,10 +1023,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
|
||||
|
|
|
@ -41,6 +41,7 @@
|
|||
/* Scheduler includes. */
|
||||
#include "FreeRTOS.h"
|
||||
#include "task.h"
|
||||
#include "mpu_syscall_numbers.h"
|
||||
|
||||
#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
|
||||
|
||||
|
@ -236,29 +237,22 @@ extern void vPortRestoreContextOfFirstTask( void ) PRIVILEGED_FUNCTION;
|
|||
* @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.
|
||||
* @param ucSystemCallNumber The system call number of the system call.
|
||||
*/
|
||||
void vSystemCallEnter( uint32_t * pulTaskStack,
|
||||
uint32_t ulLR ) PRIVILEGED_FUNCTION;
|
||||
uint32_t ulLR,
|
||||
uint8_t ucSystemCallNumber ) PRIVILEGED_FUNCTION;
|
||||
|
||||
#endif /* #if ( configUSE_MPU_WRAPPERS_V1 == 0 ) */
|
||||
|
||||
#if ( 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.
|
||||
* @brief Raise SVC for exiting from a system call.
|
||||
*/
|
||||
void vSystemCallEnter_1( uint32_t * pulTaskStack,
|
||||
uint32_t ulLR ) PRIVILEGED_FUNCTION;
|
||||
void vRequestSystemCallExit( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;
|
||||
|
||||
#endif /* #if ( configUSE_MPU_WRAPPERS_V1 == 0 ) */
|
||||
|
||||
|
@ -294,6 +288,15 @@ void vPortSwitchToUserMode( void );
|
|||
* variable. */
|
||||
static UBaseType_t uxCriticalNesting = 0xaaaaaaaa;
|
||||
|
||||
#if ( ( configUSE_MPU_WRAPPERS_V1 == 0 ) && ( configENABLE_ACCESS_CONTROL_LIST == 1 ) )
|
||||
|
||||
/*
|
||||
* This variable is set to pdTRUE when the scheduler is started.
|
||||
*/
|
||||
PRIVILEGED_DATA static BaseType_t xSchedulerRunning = pdFALSE;
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure
|
||||
* FreeRTOS API functions are not called from interrupts that have been assigned
|
||||
|
@ -368,10 +371,10 @@ void vPortSVCHandler_C( uint32_t * pulParam ) /* PRIVILEGED_FUNCTION */
|
|||
uint8_t ucSVCNumber;
|
||||
uint32_t ulPC;
|
||||
|
||||
#if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 )
|
||||
#if ( ( configUSE_MPU_WRAPPERS_V1 == 1 ) && ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) )
|
||||
extern uint32_t __syscalls_flash_start__[];
|
||||
extern uint32_t __syscalls_flash_end__[];
|
||||
#endif /* #if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */
|
||||
#endif /* #if ( ( configUSE_MPU_WRAPPERS_V1 == 1 ) && ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) ) */
|
||||
|
||||
/* The stack contains: r0, r1, r2, r3, r12, LR, PC and xPSR. The first
|
||||
* argument (r0) is pulParam[ 0 ]. */
|
||||
|
@ -397,26 +400,15 @@ void vPortSVCHandler_C( uint32_t * pulParam ) /* PRIVILEGED_FUNCTION */
|
|||
|
||||
break;
|
||||
|
||||
#if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 )
|
||||
case portSVC_RAISE_PRIVILEGE: /* Only raise the privilege, if the
|
||||
* svc was raised from any of the
|
||||
* system calls. */
|
||||
#if ( configUSE_MPU_WRAPPERS_V1 == 1 )
|
||||
#if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 )
|
||||
case portSVC_RAISE_PRIVILEGE: /* Only raise the privilege, if the
|
||||
* svc was raised from any of the
|
||||
* system calls. */
|
||||
|
||||
if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) &&
|
||||
( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) )
|
||||
{
|
||||
__asm volatile
|
||||
(
|
||||
" mrs r1, control \n" /* Obtain current control value. */
|
||||
" bic r1, r1, #1 \n" /* Set privilege bit. */
|
||||
" msr control, r1 \n" /* Write back new control value. */
|
||||
::: "r1", "memory"
|
||||
);
|
||||
}
|
||||
|
||||
break;
|
||||
#else /* if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */
|
||||
case portSVC_RAISE_PRIVILEGE:
|
||||
if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) &&
|
||||
( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) )
|
||||
{
|
||||
__asm volatile
|
||||
(
|
||||
" mrs r1, control \n" /* Obtain current control value. */
|
||||
|
@ -424,11 +416,24 @@ void vPortSVCHandler_C( uint32_t * pulParam ) /* PRIVILEGED_FUNCTION */
|
|||
" msr control, r1 \n" /* Write back new control value. */
|
||||
::: "r1", "memory"
|
||||
);
|
||||
break;
|
||||
#endif /* #if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */
|
||||
}
|
||||
|
||||
default: /* Unknown SVC call. */
|
||||
break;
|
||||
break;
|
||||
#else /* if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */
|
||||
case portSVC_RAISE_PRIVILEGE:
|
||||
__asm volatile
|
||||
(
|
||||
" mrs r1, control \n" /* Obtain current control value. */
|
||||
" bic r1, r1, #1 \n" /* Set privilege bit. */
|
||||
" msr control, r1 \n" /* Write back new control value. */
|
||||
::: "r1", "memory"
|
||||
);
|
||||
break;
|
||||
#endif /* #if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */
|
||||
#endif /* #if ( configUSE_MPU_WRAPPERS_V1 == 1 ) */
|
||||
|
||||
default: /* Unknown SVC call. */
|
||||
break;
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
@ -436,15 +441,16 @@ void vPortSVCHandler_C( uint32_t * pulParam ) /* PRIVILEGED_FUNCTION */
|
|||
#if ( configUSE_MPU_WRAPPERS_V1 == 0 )
|
||||
|
||||
void vSystemCallEnter( uint32_t * pulTaskStack,
|
||||
uint32_t ulLR ) /* PRIVILEGED_FUNCTION */
|
||||
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__;
|
||||
|
@ -456,17 +462,27 @@ void vPortSVCHandler_C( uint32_t * pulParam ) /* PRIVILEGED_FUNCTION */
|
|||
#endif /* #if defined( __ARMCC_VERSION ) */
|
||||
|
||||
ulSystemCallLocation = pulTaskStack[ portOFFSET_TO_PC ];
|
||||
pxMpuSettings = xTaskGetMPUSettings( pxCurrentTCB );
|
||||
|
||||
/* If the request did not come from the system call section, do nothing. */
|
||||
/* 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__ ) )
|
||||
( ulSystemCallLocation <= ( uint32_t ) __syscalls_flash_end__ ) &&
|
||||
( pxMpuSettings->xSystemCallStackInfo.pulTaskStack == NULL ) &&
|
||||
( uxSystemCallImplementations[ ucSystemCallNumber ] != ( UBaseType_t ) 0 ) )
|
||||
{
|
||||
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( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
|
||||
{
|
||||
/* Extended frame i.e. FPU in use. */
|
||||
|
@ -507,10 +523,19 @@ void vPortSVCHandler_C( uint32_t * pulParam ) /* PRIVILEGED_FUNCTION */
|
|||
* the system call. */
|
||||
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize;
|
||||
|
||||
/* Store the value of the Link Register before the SVC was raised. We need to
|
||||
* restore it when we exit from the system call. */
|
||||
/* 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 ];
|
||||
|
||||
|
||||
/* 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;
|
||||
|
||||
/* 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 )
|
||||
|
@ -534,108 +559,9 @@ void vPortSVCHandler_C( uint32_t * pulParam ) /* PRIVILEGED_FUNCTION */
|
|||
|
||||
#if ( configUSE_MPU_WRAPPERS_V1 == 0 )
|
||||
|
||||
void vSystemCallEnter_1( uint32_t * pulTaskStack,
|
||||
uint32_t ulLR ) /* PRIVILEGED_FUNCTION */
|
||||
void vRequestSystemCallExit( void ) /* __attribute__( ( naked ) ) 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__ ) )
|
||||
{
|
||||
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( ( 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;
|
||||
}
|
||||
|
||||
/* 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 );
|
||||
}
|
||||
|
||||
/* Use the pulSystemCallStack in thread mode. */
|
||||
__asm volatile ( "msr psp, %0" : : "r" ( pulSystemCallStack ) );
|
||||
|
||||
/* Raise the privilege for the duration of the system call. */
|
||||
__asm volatile (
|
||||
" mrs r1, control \n" /* Obtain current control value. */
|
||||
" bic r1, #1 \n" /* Clear nPRIV bit. */
|
||||
" msr control, r1 \n" /* Write back new control value. */
|
||||
::: "r1", "memory"
|
||||
);
|
||||
|
||||
/* Remember the location where we should copy the stack frame when we exit from
|
||||
* the system call. */
|
||||
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize;
|
||||
|
||||
/* Store the value of the Link Register before the SVC was raised. We need to
|
||||
* restore it when we exit from the system call. */
|
||||
pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];
|
||||
|
||||
/* 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 );
|
||||
}
|
||||
__asm volatile ( "svc %0 \n" ::"i" ( portSVC_SYSTEM_CALL_EXIT ) : "memory" );
|
||||
}
|
||||
|
||||
#endif /* #if ( configUSE_MPU_WRAPPERS_V1 == 0 ) */
|
||||
|
@ -652,24 +578,32 @@ void vPortSVCHandler_C( uint32_t * pulParam ) /* PRIVILEGED_FUNCTION */
|
|||
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__;
|
||||
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 __syscalls_flash_start__[];
|
||||
extern uint32_t __syscalls_flash_end__[];
|
||||
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 );
|
||||
|
||||
/* 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__ ) )
|
||||
/* 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 ) )
|
||||
{
|
||||
pxMpuSettings = xTaskGetMPUSettings( pxCurrentTCB );
|
||||
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
|
||||
|
||||
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
|
||||
|
@ -708,8 +642,10 @@ void vPortSVCHandler_C( uint32_t * pulParam ) /* PRIVILEGED_FUNCTION */
|
|||
::: "r1", "memory"
|
||||
);
|
||||
|
||||
/* Restore the stacked link register to what it was at the time of
|
||||
* system call entry. */
|
||||
/* 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;
|
||||
|
||||
/* If the hardware used padding to force the stack pointer
|
||||
|
@ -875,6 +811,12 @@ BaseType_t xPortStartScheduler( void )
|
|||
/* Initialise the critical nesting count ready for the first task. */
|
||||
uxCriticalNesting = 0;
|
||||
|
||||
#if ( ( configUSE_MPU_WRAPPERS_V1 == 0 ) && ( configENABLE_ACCESS_CONTROL_LIST == 1 ) )
|
||||
{
|
||||
xSchedulerRunning = pdTRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Ensure the VFP is enabled - it should be anyway. */
|
||||
vPortEnableVFP();
|
||||
|
||||
|
@ -1404,21 +1346,34 @@ BaseType_t xPortIsAuthorizedToAccessBuffer( const void * pvBuffer,
|
|||
{
|
||||
uint32_t ulAccessControlListEntryIndex, ulAccessControlListEntryBit;
|
||||
BaseType_t xAccessGranted = pdFALSE;
|
||||
const xMPU_SETTINGS * xTaskMpuSettings = xTaskGetMPUSettings( NULL ); /* Calling task's MPU settings. */
|
||||
const xMPU_SETTINGS * xTaskMpuSettings;
|
||||
|
||||
ulAccessControlListEntryIndex = ( ( uint32_t ) lInternalIndexOfKernelObject / portACL_ENTRY_SIZE_BITS );
|
||||
ulAccessControlListEntryBit = ( ( uint32_t ) lInternalIndexOfKernelObject % portACL_ENTRY_SIZE_BITS );
|
||||
|
||||
if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
||||
if( xSchedulerRunning == pdFALSE )
|
||||
{
|
||||
/* Grant access to all the kernel objects before the scheduler
|
||||
* is started. It is necessary because there is no task running
|
||||
* yet and therefore, we cannot use the permissions of any
|
||||
* task. */
|
||||
xAccessGranted = pdTRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
if( ( xTaskMpuSettings->ulAccessControlList[ ulAccessControlListEntryIndex ] & ( 1U << ulAccessControlListEntryBit ) ) != 0 )
|
||||
xTaskMpuSettings = xTaskGetMPUSettings( NULL ); /* Calling task's MPU settings. */
|
||||
|
||||
ulAccessControlListEntryIndex = ( ( uint32_t ) lInternalIndexOfKernelObject / portACL_ENTRY_SIZE_BITS );
|
||||
ulAccessControlListEntryBit = ( ( uint32_t ) lInternalIndexOfKernelObject % portACL_ENTRY_SIZE_BITS );
|
||||
|
||||
if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )
|
||||
{
|
||||
xAccessGranted = pdTRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
if( ( xTaskMpuSettings->ulAccessControlList[ ulAccessControlListEntryIndex ] & ( 1U << ulAccessControlListEntryBit ) ) != 0 )
|
||||
{
|
||||
xAccessGranted = pdTRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return xAccessGranted;
|
||||
|
|
|
@ -32,6 +32,7 @@ To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so
|
|||
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>
|
||||
#include <mpu_syscall_numbers.h>
|
||||
|
||||
RSEG CODE:CODE(2)
|
||||
thumb
|
||||
|
@ -40,7 +41,6 @@ files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler.
|
|||
EXTERN vTaskSwitchContext
|
||||
EXTERN vPortSVCHandler_C
|
||||
EXTERN vSystemCallEnter
|
||||
EXTERN vSystemCallEnter_1
|
||||
EXTERN vSystemCallExit
|
||||
|
||||
PUBLIC xPortPendSVHandler
|
||||
|
@ -64,9 +64,8 @@ files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler.
|
|||
#endif
|
||||
|
||||
/* These must be in sync with portmacro.h. */
|
||||
#define portSVC_SYSTEM_CALL_ENTER 3
|
||||
#define portSVC_SYSTEM_CALL_ENTER_1 4
|
||||
#define portSVC_SYSTEM_CALL_EXIT 5
|
||||
#define portSVC_START_SCHEDULER 100
|
||||
#define portSVC_SYSTEM_CALL_EXIT 103
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
xPortPendSVHandler:
|
||||
|
@ -170,10 +169,8 @@ vPortSVCHandler:
|
|||
|
||||
ldr r1, [r0, #24]
|
||||
ldrb r2, [r1, #-2]
|
||||
cmp r2, #portSVC_SYSTEM_CALL_ENTER
|
||||
beq syscall_enter
|
||||
cmp r2, #portSVC_SYSTEM_CALL_ENTER_1
|
||||
beq syscall_enter_1
|
||||
cmp r2, #NUM_SYSTEM_CALLS
|
||||
blt syscall_enter
|
||||
cmp r2, #portSVC_SYSTEM_CALL_EXIT
|
||||
beq syscall_exit
|
||||
b vPortSVCHandler_C
|
||||
|
@ -182,10 +179,6 @@ vPortSVCHandler:
|
|||
mov r1, lr
|
||||
b vSystemCallEnter
|
||||
|
||||
syscall_enter_1:
|
||||
mov r1, lr
|
||||
b vSystemCallEnter_1
|
||||
|
||||
syscall_exit:
|
||||
mov r1, lr
|
||||
b vSystemCallExit
|
||||
|
@ -224,7 +217,7 @@ vPortStartFirstTask:
|
|||
cpsie f
|
||||
dsb
|
||||
isb
|
||||
svc 0
|
||||
svc #portSVC_START_SCHEDULER
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
|
|
|
@ -252,12 +252,10 @@ typedef struct MPU_SETTINGS
|
|||
/*-----------------------------------------------------------*/
|
||||
|
||||
/* SVC numbers for various services. */
|
||||
#define portSVC_START_SCHEDULER 0
|
||||
#define portSVC_YIELD 1
|
||||
#define portSVC_RAISE_PRIVILEGE 2
|
||||
#define portSVC_SYSTEM_CALL_ENTER 3 /* System calls with upto 4 parameters. */
|
||||
#define portSVC_SYSTEM_CALL_ENTER_1 4 /* System calls with 5 parameters. */
|
||||
#define portSVC_SYSTEM_CALL_EXIT 5
|
||||
#define portSVC_START_SCHEDULER 100
|
||||
#define portSVC_YIELD 101
|
||||
#define portSVC_RAISE_PRIVILEGE 102
|
||||
#define portSVC_SYSTEM_CALL_EXIT 103
|
||||
|
||||
/* Scheduler utilities. */
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue