mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-04-19 21:11:57 -04:00
Add .syntax unified to GCC assembly functions (#538)
This fixes the compilation issue with XC32 compiler. It was reported here - https://forums.freertos.org/t/xc32-v4-00-error-with-building-freertos-portasm-c/14357/4 Signed-off-by: Gaurav Aggarwal <aggarg@amazon.com> Co-authored-by: Paul Bartell <pbartell@amazon.com>
This commit is contained in:
parent
4649d58899
commit
3b18a07568
|
@ -137,6 +137,8 @@ BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, control \n"/* r0 = CONTROL. */
|
" mrs r0, control \n"/* r0 = CONTROL. */
|
||||||
" movs r1, #1 \n"/* r1 = 1. */
|
" movs r1, #1 \n"/* r1 = 1. */
|
||||||
" tst r0, r1 \n"/* Perform r0 & r1 (bitwise AND) and update the conditions flag. */
|
" tst r0, r1 \n"/* Perform r0 & r1 (bitwise AND) and update the conditions flag. */
|
||||||
|
@ -157,6 +159,8 @@ void vRaisePrivilege( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, control \n"/* Read the CONTROL register. */
|
" mrs r0, control \n"/* Read the CONTROL register. */
|
||||||
" movs r1, #1 \n"/* r1 = 1. */
|
" movs r1, #1 \n"/* r1 = 1. */
|
||||||
" bics r0, r1 \n"/* Clear the bit 0. */
|
" bics r0, r1 \n"/* Clear the bit 0. */
|
||||||
|
@ -171,6 +175,8 @@ void vResetPrivilege( void ) /* __attribute__ (( naked )) */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, control \n"/* r0 = CONTROL. */
|
" mrs r0, control \n"/* r0 = CONTROL. */
|
||||||
" movs r1, #1 \n"/* r1 = 1. */
|
" movs r1, #1 \n"/* r1 = 1. */
|
||||||
" orrs r0, r1 \n"/* r0 = r0 | r1. */
|
" orrs r0, r1 \n"/* r0 = r0 | r1. */
|
||||||
|
@ -185,6 +191,8 @@ void vStartFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */
|
" ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */
|
||||||
" ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */
|
" ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */
|
||||||
" ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */
|
" ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */
|
||||||
|
@ -206,6 +214,8 @@ uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCT
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, PRIMASK \n"
|
" mrs r0, PRIMASK \n"
|
||||||
" cpsid i \n"
|
" cpsid i \n"
|
||||||
" bx lr \n"
|
" bx lr \n"
|
||||||
|
@ -218,6 +228,8 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" msr PRIMASK, r0 \n"
|
" msr PRIMASK, r0 \n"
|
||||||
" bx lr \n"
|
" bx lr \n"
|
||||||
::: "memory"
|
::: "memory"
|
||||||
|
@ -413,6 +425,8 @@ void SVC_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" movs r0, #4 \n"
|
" movs r0, #4 \n"
|
||||||
" mov r1, lr \n"
|
" mov r1, lr \n"
|
||||||
" tst r0, r1 \n"
|
" tst r0, r1 \n"
|
||||||
|
@ -435,6 +449,8 @@ void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) /* __attribute__ (
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" svc %0 \n"/* Secure context is allocated in the supervisor call. */
|
" svc %0 \n"/* Secure context is allocated in the supervisor call. */
|
||||||
" bx lr \n"/* Return. */
|
" bx lr \n"/* Return. */
|
||||||
::"i" ( portSVC_ALLOCATE_SECURE_CONTEXT ) : "memory"
|
::"i" ( portSVC_ALLOCATE_SECURE_CONTEXT ) : "memory"
|
||||||
|
@ -446,6 +462,8 @@ void vPortFreeSecureContext( uint32_t * pulTCB ) /* __attribute__ (( naked )) PR
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" ldr r2, [r0] \n"/* The first item in the TCB is the top of the stack. */
|
" ldr r2, [r0] \n"/* The first item in the TCB is the top of the stack. */
|
||||||
" ldr r1, [r2] \n"/* The first item on the stack is the task's xSecureContext. */
|
" ldr r1, [r2] \n"/* The first item on the stack is the task's xSecureContext. */
|
||||||
" cmp r1, #0 \n"/* Raise svc if task's xSecureContext is not NULL. */
|
" cmp r1, #0 \n"/* Raise svc if task's xSecureContext is not NULL. */
|
||||||
|
|
|
@ -132,6 +132,8 @@ BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, control \n"/* r0 = CONTROL. */
|
" mrs r0, control \n"/* r0 = CONTROL. */
|
||||||
" movs r1, #1 \n"/* r1 = 1. */
|
" movs r1, #1 \n"/* r1 = 1. */
|
||||||
" tst r0, r1 \n"/* Perform r0 & r1 (bitwise AND) and update the conditions flag. */
|
" tst r0, r1 \n"/* Perform r0 & r1 (bitwise AND) and update the conditions flag. */
|
||||||
|
@ -152,6 +154,8 @@ void vRaisePrivilege( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, control \n"/* Read the CONTROL register. */
|
" mrs r0, control \n"/* Read the CONTROL register. */
|
||||||
" movs r1, #1 \n"/* r1 = 1. */
|
" movs r1, #1 \n"/* r1 = 1. */
|
||||||
" bics r0, r1 \n"/* Clear the bit 0. */
|
" bics r0, r1 \n"/* Clear the bit 0. */
|
||||||
|
@ -166,6 +170,8 @@ void vResetPrivilege( void ) /* __attribute__ (( naked )) */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, control \n"/* r0 = CONTROL. */
|
" mrs r0, control \n"/* r0 = CONTROL. */
|
||||||
" movs r1, #1 \n"/* r1 = 1. */
|
" movs r1, #1 \n"/* r1 = 1. */
|
||||||
" orrs r0, r1 \n"/* r0 = r0 | r1. */
|
" orrs r0, r1 \n"/* r0 = r0 | r1. */
|
||||||
|
@ -180,6 +186,8 @@ void vStartFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */
|
" ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */
|
||||||
" ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */
|
" ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */
|
||||||
" ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */
|
" ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */
|
||||||
|
@ -201,6 +209,8 @@ uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCT
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, PRIMASK \n"
|
" mrs r0, PRIMASK \n"
|
||||||
" cpsid i \n"
|
" cpsid i \n"
|
||||||
" bx lr \n"
|
" bx lr \n"
|
||||||
|
@ -213,6 +223,8 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" msr PRIMASK, r0 \n"
|
" msr PRIMASK, r0 \n"
|
||||||
" bx lr \n"
|
" bx lr \n"
|
||||||
::: "memory"
|
::: "memory"
|
||||||
|
@ -348,6 +360,8 @@ void SVC_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" movs r0, #4 \n"
|
" movs r0, #4 \n"
|
||||||
" mov r1, lr \n"
|
" mov r1, lr \n"
|
||||||
" tst r0, r1 \n"
|
" tst r0, r1 \n"
|
||||||
|
|
|
@ -135,6 +135,8 @@ BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, control \n"/* r0 = CONTROL. */
|
" mrs r0, control \n"/* r0 = CONTROL. */
|
||||||
" tst r0, #1 \n"/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */
|
" tst r0, #1 \n"/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */
|
||||||
" ite ne \n"
|
" ite ne \n"
|
||||||
|
@ -152,6 +154,8 @@ void vRaisePrivilege( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, control \n"/* Read the CONTROL register. */
|
" mrs r0, control \n"/* Read the CONTROL register. */
|
||||||
" bic r0, #1 \n"/* Clear the bit 0. */
|
" bic r0, #1 \n"/* Clear the bit 0. */
|
||||||
" msr control, r0 \n"/* Write back the new CONTROL value. */
|
" msr control, r0 \n"/* Write back the new CONTROL value. */
|
||||||
|
@ -165,6 +169,8 @@ void vResetPrivilege( void ) /* __attribute__ (( naked )) */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, control \n"/* r0 = CONTROL. */
|
" mrs r0, control \n"/* r0 = CONTROL. */
|
||||||
" orr r0, #1 \n"/* r0 = r0 | 1. */
|
" orr r0, #1 \n"/* r0 = r0 | 1. */
|
||||||
" msr control, r0 \n"/* CONTROL = r0. */
|
" msr control, r0 \n"/* CONTROL = r0. */
|
||||||
|
@ -178,6 +184,8 @@ void vStartFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */
|
" ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */
|
||||||
" ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */
|
" ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */
|
||||||
" ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */
|
" ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */
|
||||||
|
@ -200,6 +208,8 @@ uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCT
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, basepri \n"/* r0 = basepri. Return original basepri value. */
|
" mrs r0, basepri \n"/* r0 = basepri. Return original basepri value. */
|
||||||
" mov r1, %0 \n"/* r1 = configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
" mov r1, %0 \n"/* r1 = configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
||||||
" msr basepri, r1 \n"/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
" msr basepri, r1 \n"/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
||||||
|
@ -215,6 +225,8 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" msr basepri, r0 \n"/* basepri = ulMask. */
|
" msr basepri, r0 \n"/* basepri = ulMask. */
|
||||||
" dsb \n"
|
" dsb \n"
|
||||||
" isb \n"
|
" isb \n"
|
||||||
|
@ -412,6 +424,8 @@ void SVC_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" tst lr, #4 \n"
|
" tst lr, #4 \n"
|
||||||
" ite eq \n"
|
" ite eq \n"
|
||||||
" mrseq r0, msp \n"
|
" mrseq r0, msp \n"
|
||||||
|
@ -429,6 +443,8 @@ void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) /* __attribute__ (
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" svc %0 \n"/* Secure context is allocated in the supervisor call. */
|
" svc %0 \n"/* Secure context is allocated in the supervisor call. */
|
||||||
" bx lr \n"/* Return. */
|
" bx lr \n"/* Return. */
|
||||||
::"i" ( portSVC_ALLOCATE_SECURE_CONTEXT ) : "memory"
|
::"i" ( portSVC_ALLOCATE_SECURE_CONTEXT ) : "memory"
|
||||||
|
@ -440,6 +456,8 @@ void vPortFreeSecureContext( uint32_t * pulTCB ) /* __attribute__ (( naked )) PR
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" ldr r2, [r0] \n"/* The first item in the TCB is the top of the stack. */
|
" ldr r2, [r0] \n"/* The first item in the TCB is the top of the stack. */
|
||||||
" ldr r1, [r2] \n"/* The first item on the stack is the task's xSecureContext. */
|
" ldr r1, [r2] \n"/* The first item on the stack is the task's xSecureContext. */
|
||||||
" cmp r1, #0 \n"/* Raise svc if task's xSecureContext is not NULL. */
|
" cmp r1, #0 \n"/* Raise svc if task's xSecureContext is not NULL. */
|
||||||
|
|
|
@ -130,6 +130,8 @@ BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, control \n"/* r0 = CONTROL. */
|
" mrs r0, control \n"/* r0 = CONTROL. */
|
||||||
" tst r0, #1 \n"/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */
|
" tst r0, #1 \n"/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */
|
||||||
" ite ne \n"
|
" ite ne \n"
|
||||||
|
@ -147,6 +149,8 @@ void vRaisePrivilege( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, control \n"/* Read the CONTROL register. */
|
" mrs r0, control \n"/* Read the CONTROL register. */
|
||||||
" bic r0, #1 \n"/* Clear the bit 0. */
|
" bic r0, #1 \n"/* Clear the bit 0. */
|
||||||
" msr control, r0 \n"/* Write back the new CONTROL value. */
|
" msr control, r0 \n"/* Write back the new CONTROL value. */
|
||||||
|
@ -160,6 +164,8 @@ void vResetPrivilege( void ) /* __attribute__ (( naked )) */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, control \n"/* r0 = CONTROL. */
|
" mrs r0, control \n"/* r0 = CONTROL. */
|
||||||
" orr r0, #1 \n"/* r0 = r0 | 1. */
|
" orr r0, #1 \n"/* r0 = r0 | 1. */
|
||||||
" msr control, r0 \n"/* CONTROL = r0. */
|
" msr control, r0 \n"/* CONTROL = r0. */
|
||||||
|
@ -173,6 +179,8 @@ void vStartFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */
|
" ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */
|
||||||
" ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */
|
" ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */
|
||||||
" ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */
|
" ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */
|
||||||
|
@ -195,6 +203,8 @@ uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCT
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, basepri \n"/* r0 = basepri. Return original basepri value. */
|
" mrs r0, basepri \n"/* r0 = basepri. Return original basepri value. */
|
||||||
" mov r1, %0 \n"/* r1 = configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
" mov r1, %0 \n"/* r1 = configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
||||||
" msr basepri, r1 \n"/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
" msr basepri, r1 \n"/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
||||||
|
@ -210,6 +220,8 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" msr basepri, r0 \n"/* basepri = ulMask. */
|
" msr basepri, r0 \n"/* basepri = ulMask. */
|
||||||
" dsb \n"
|
" dsb \n"
|
||||||
" isb \n"
|
" isb \n"
|
||||||
|
@ -337,6 +349,8 @@ void SVC_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" tst lr, #4 \n"
|
" tst lr, #4 \n"
|
||||||
" ite eq \n"
|
" ite eq \n"
|
||||||
" mrseq r0, msp \n"
|
" mrseq r0, msp \n"
|
||||||
|
|
|
@ -137,6 +137,8 @@ BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, control \n"/* r0 = CONTROL. */
|
" mrs r0, control \n"/* r0 = CONTROL. */
|
||||||
" movs r1, #1 \n"/* r1 = 1. */
|
" movs r1, #1 \n"/* r1 = 1. */
|
||||||
" tst r0, r1 \n"/* Perform r0 & r1 (bitwise AND) and update the conditions flag. */
|
" tst r0, r1 \n"/* Perform r0 & r1 (bitwise AND) and update the conditions flag. */
|
||||||
|
@ -157,6 +159,8 @@ void vRaisePrivilege( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, control \n"/* Read the CONTROL register. */
|
" mrs r0, control \n"/* Read the CONTROL register. */
|
||||||
" movs r1, #1 \n"/* r1 = 1. */
|
" movs r1, #1 \n"/* r1 = 1. */
|
||||||
" bics r0, r1 \n"/* Clear the bit 0. */
|
" bics r0, r1 \n"/* Clear the bit 0. */
|
||||||
|
@ -171,6 +175,8 @@ void vResetPrivilege( void ) /* __attribute__ (( naked )) */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, control \n"/* r0 = CONTROL. */
|
" mrs r0, control \n"/* r0 = CONTROL. */
|
||||||
" movs r1, #1 \n"/* r1 = 1. */
|
" movs r1, #1 \n"/* r1 = 1. */
|
||||||
" orrs r0, r1 \n"/* r0 = r0 | r1. */
|
" orrs r0, r1 \n"/* r0 = r0 | r1. */
|
||||||
|
@ -185,6 +191,8 @@ void vStartFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */
|
" ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */
|
||||||
" ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */
|
" ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */
|
||||||
" ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */
|
" ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */
|
||||||
|
@ -206,6 +214,8 @@ uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCT
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, PRIMASK \n"
|
" mrs r0, PRIMASK \n"
|
||||||
" cpsid i \n"
|
" cpsid i \n"
|
||||||
" bx lr \n"
|
" bx lr \n"
|
||||||
|
@ -218,6 +228,8 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" msr PRIMASK, r0 \n"
|
" msr PRIMASK, r0 \n"
|
||||||
" bx lr \n"
|
" bx lr \n"
|
||||||
::: "memory"
|
::: "memory"
|
||||||
|
@ -413,6 +425,8 @@ void SVC_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" movs r0, #4 \n"
|
" movs r0, #4 \n"
|
||||||
" mov r1, lr \n"
|
" mov r1, lr \n"
|
||||||
" tst r0, r1 \n"
|
" tst r0, r1 \n"
|
||||||
|
@ -435,6 +449,8 @@ void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) /* __attribute__ (
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" svc %0 \n"/* Secure context is allocated in the supervisor call. */
|
" svc %0 \n"/* Secure context is allocated in the supervisor call. */
|
||||||
" bx lr \n"/* Return. */
|
" bx lr \n"/* Return. */
|
||||||
::"i" ( portSVC_ALLOCATE_SECURE_CONTEXT ) : "memory"
|
::"i" ( portSVC_ALLOCATE_SECURE_CONTEXT ) : "memory"
|
||||||
|
@ -446,6 +462,8 @@ void vPortFreeSecureContext( uint32_t * pulTCB ) /* __attribute__ (( naked )) PR
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" ldr r2, [r0] \n"/* The first item in the TCB is the top of the stack. */
|
" ldr r2, [r0] \n"/* The first item in the TCB is the top of the stack. */
|
||||||
" ldr r1, [r2] \n"/* The first item on the stack is the task's xSecureContext. */
|
" ldr r1, [r2] \n"/* The first item on the stack is the task's xSecureContext. */
|
||||||
" cmp r1, #0 \n"/* Raise svc if task's xSecureContext is not NULL. */
|
" cmp r1, #0 \n"/* Raise svc if task's xSecureContext is not NULL. */
|
||||||
|
|
|
@ -132,6 +132,8 @@ BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, control \n"/* r0 = CONTROL. */
|
" mrs r0, control \n"/* r0 = CONTROL. */
|
||||||
" movs r1, #1 \n"/* r1 = 1. */
|
" movs r1, #1 \n"/* r1 = 1. */
|
||||||
" tst r0, r1 \n"/* Perform r0 & r1 (bitwise AND) and update the conditions flag. */
|
" tst r0, r1 \n"/* Perform r0 & r1 (bitwise AND) and update the conditions flag. */
|
||||||
|
@ -152,6 +154,8 @@ void vRaisePrivilege( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, control \n"/* Read the CONTROL register. */
|
" mrs r0, control \n"/* Read the CONTROL register. */
|
||||||
" movs r1, #1 \n"/* r1 = 1. */
|
" movs r1, #1 \n"/* r1 = 1. */
|
||||||
" bics r0, r1 \n"/* Clear the bit 0. */
|
" bics r0, r1 \n"/* Clear the bit 0. */
|
||||||
|
@ -166,6 +170,8 @@ void vResetPrivilege( void ) /* __attribute__ (( naked )) */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, control \n"/* r0 = CONTROL. */
|
" mrs r0, control \n"/* r0 = CONTROL. */
|
||||||
" movs r1, #1 \n"/* r1 = 1. */
|
" movs r1, #1 \n"/* r1 = 1. */
|
||||||
" orrs r0, r1 \n"/* r0 = r0 | r1. */
|
" orrs r0, r1 \n"/* r0 = r0 | r1. */
|
||||||
|
@ -180,6 +186,8 @@ void vStartFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */
|
" ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */
|
||||||
" ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */
|
" ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */
|
||||||
" ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */
|
" ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */
|
||||||
|
@ -201,6 +209,8 @@ uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCT
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, PRIMASK \n"
|
" mrs r0, PRIMASK \n"
|
||||||
" cpsid i \n"
|
" cpsid i \n"
|
||||||
" bx lr \n"
|
" bx lr \n"
|
||||||
|
@ -213,6 +223,8 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" msr PRIMASK, r0 \n"
|
" msr PRIMASK, r0 \n"
|
||||||
" bx lr \n"
|
" bx lr \n"
|
||||||
::: "memory"
|
::: "memory"
|
||||||
|
@ -348,6 +360,8 @@ void SVC_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" movs r0, #4 \n"
|
" movs r0, #4 \n"
|
||||||
" mov r1, lr \n"
|
" mov r1, lr \n"
|
||||||
" tst r0, r1 \n"
|
" tst r0, r1 \n"
|
||||||
|
|
|
@ -135,6 +135,8 @@ BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, control \n"/* r0 = CONTROL. */
|
" mrs r0, control \n"/* r0 = CONTROL. */
|
||||||
" tst r0, #1 \n"/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */
|
" tst r0, #1 \n"/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */
|
||||||
" ite ne \n"
|
" ite ne \n"
|
||||||
|
@ -152,6 +154,8 @@ void vRaisePrivilege( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, control \n"/* Read the CONTROL register. */
|
" mrs r0, control \n"/* Read the CONTROL register. */
|
||||||
" bic r0, #1 \n"/* Clear the bit 0. */
|
" bic r0, #1 \n"/* Clear the bit 0. */
|
||||||
" msr control, r0 \n"/* Write back the new CONTROL value. */
|
" msr control, r0 \n"/* Write back the new CONTROL value. */
|
||||||
|
@ -165,6 +169,8 @@ void vResetPrivilege( void ) /* __attribute__ (( naked )) */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, control \n"/* r0 = CONTROL. */
|
" mrs r0, control \n"/* r0 = CONTROL. */
|
||||||
" orr r0, #1 \n"/* r0 = r0 | 1. */
|
" orr r0, #1 \n"/* r0 = r0 | 1. */
|
||||||
" msr control, r0 \n"/* CONTROL = r0. */
|
" msr control, r0 \n"/* CONTROL = r0. */
|
||||||
|
@ -178,6 +184,8 @@ void vStartFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */
|
" ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */
|
||||||
" ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */
|
" ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */
|
||||||
" ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */
|
" ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */
|
||||||
|
@ -200,6 +208,8 @@ uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCT
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, basepri \n"/* r0 = basepri. Return original basepri value. */
|
" mrs r0, basepri \n"/* r0 = basepri. Return original basepri value. */
|
||||||
" mov r1, %0 \n"/* r1 = configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
" mov r1, %0 \n"/* r1 = configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
||||||
" msr basepri, r1 \n"/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
" msr basepri, r1 \n"/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
||||||
|
@ -215,6 +225,8 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" msr basepri, r0 \n"/* basepri = ulMask. */
|
" msr basepri, r0 \n"/* basepri = ulMask. */
|
||||||
" dsb \n"
|
" dsb \n"
|
||||||
" isb \n"
|
" isb \n"
|
||||||
|
@ -412,6 +424,8 @@ void SVC_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" tst lr, #4 \n"
|
" tst lr, #4 \n"
|
||||||
" ite eq \n"
|
" ite eq \n"
|
||||||
" mrseq r0, msp \n"
|
" mrseq r0, msp \n"
|
||||||
|
@ -429,6 +443,8 @@ void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) /* __attribute__ (
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" svc %0 \n"/* Secure context is allocated in the supervisor call. */
|
" svc %0 \n"/* Secure context is allocated in the supervisor call. */
|
||||||
" bx lr \n"/* Return. */
|
" bx lr \n"/* Return. */
|
||||||
::"i" ( portSVC_ALLOCATE_SECURE_CONTEXT ) : "memory"
|
::"i" ( portSVC_ALLOCATE_SECURE_CONTEXT ) : "memory"
|
||||||
|
@ -440,6 +456,8 @@ void vPortFreeSecureContext( uint32_t * pulTCB ) /* __attribute__ (( naked )) PR
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" ldr r2, [r0] \n"/* The first item in the TCB is the top of the stack. */
|
" ldr r2, [r0] \n"/* The first item in the TCB is the top of the stack. */
|
||||||
" ldr r1, [r2] \n"/* The first item on the stack is the task's xSecureContext. */
|
" ldr r1, [r2] \n"/* The first item on the stack is the task's xSecureContext. */
|
||||||
" cmp r1, #0 \n"/* Raise svc if task's xSecureContext is not NULL. */
|
" cmp r1, #0 \n"/* Raise svc if task's xSecureContext is not NULL. */
|
||||||
|
|
|
@ -130,6 +130,8 @@ BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, control \n"/* r0 = CONTROL. */
|
" mrs r0, control \n"/* r0 = CONTROL. */
|
||||||
" tst r0, #1 \n"/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */
|
" tst r0, #1 \n"/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */
|
||||||
" ite ne \n"
|
" ite ne \n"
|
||||||
|
@ -147,6 +149,8 @@ void vRaisePrivilege( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, control \n"/* Read the CONTROL register. */
|
" mrs r0, control \n"/* Read the CONTROL register. */
|
||||||
" bic r0, #1 \n"/* Clear the bit 0. */
|
" bic r0, #1 \n"/* Clear the bit 0. */
|
||||||
" msr control, r0 \n"/* Write back the new CONTROL value. */
|
" msr control, r0 \n"/* Write back the new CONTROL value. */
|
||||||
|
@ -160,6 +164,8 @@ void vResetPrivilege( void ) /* __attribute__ (( naked )) */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, control \n"/* r0 = CONTROL. */
|
" mrs r0, control \n"/* r0 = CONTROL. */
|
||||||
" orr r0, #1 \n"/* r0 = r0 | 1. */
|
" orr r0, #1 \n"/* r0 = r0 | 1. */
|
||||||
" msr control, r0 \n"/* CONTROL = r0. */
|
" msr control, r0 \n"/* CONTROL = r0. */
|
||||||
|
@ -173,6 +179,8 @@ void vStartFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */
|
" ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */
|
||||||
" ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */
|
" ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */
|
||||||
" ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */
|
" ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */
|
||||||
|
@ -195,6 +203,8 @@ uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCT
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, basepri \n"/* r0 = basepri. Return original basepri value. */
|
" mrs r0, basepri \n"/* r0 = basepri. Return original basepri value. */
|
||||||
" mov r1, %0 \n"/* r1 = configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
" mov r1, %0 \n"/* r1 = configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
||||||
" msr basepri, r1 \n"/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
" msr basepri, r1 \n"/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
||||||
|
@ -210,6 +220,8 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" msr basepri, r0 \n"/* basepri = ulMask. */
|
" msr basepri, r0 \n"/* basepri = ulMask. */
|
||||||
" dsb \n"
|
" dsb \n"
|
||||||
" isb \n"
|
" isb \n"
|
||||||
|
@ -337,6 +349,8 @@ void SVC_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" tst lr, #4 \n"
|
" tst lr, #4 \n"
|
||||||
" ite eq \n"
|
" ite eq \n"
|
||||||
" mrseq r0, msp \n"
|
" mrseq r0, msp \n"
|
||||||
|
|
|
@ -135,6 +135,8 @@ BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, control \n"/* r0 = CONTROL. */
|
" mrs r0, control \n"/* r0 = CONTROL. */
|
||||||
" tst r0, #1 \n"/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */
|
" tst r0, #1 \n"/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */
|
||||||
" ite ne \n"
|
" ite ne \n"
|
||||||
|
@ -152,6 +154,8 @@ void vRaisePrivilege( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, control \n"/* Read the CONTROL register. */
|
" mrs r0, control \n"/* Read the CONTROL register. */
|
||||||
" bic r0, #1 \n"/* Clear the bit 0. */
|
" bic r0, #1 \n"/* Clear the bit 0. */
|
||||||
" msr control, r0 \n"/* Write back the new CONTROL value. */
|
" msr control, r0 \n"/* Write back the new CONTROL value. */
|
||||||
|
@ -165,6 +169,8 @@ void vResetPrivilege( void ) /* __attribute__ (( naked )) */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, control \n"/* r0 = CONTROL. */
|
" mrs r0, control \n"/* r0 = CONTROL. */
|
||||||
" orr r0, #1 \n"/* r0 = r0 | 1. */
|
" orr r0, #1 \n"/* r0 = r0 | 1. */
|
||||||
" msr control, r0 \n"/* CONTROL = r0. */
|
" msr control, r0 \n"/* CONTROL = r0. */
|
||||||
|
@ -178,6 +184,8 @@ void vStartFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */
|
" ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */
|
||||||
" ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */
|
" ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */
|
||||||
" ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */
|
" ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */
|
||||||
|
@ -200,6 +208,8 @@ uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCT
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, basepri \n"/* r0 = basepri. Return original basepri value. */
|
" mrs r0, basepri \n"/* r0 = basepri. Return original basepri value. */
|
||||||
" mov r1, %0 \n"/* r1 = configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
" mov r1, %0 \n"/* r1 = configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
||||||
" msr basepri, r1 \n"/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
" msr basepri, r1 \n"/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
||||||
|
@ -215,6 +225,8 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" msr basepri, r0 \n"/* basepri = ulMask. */
|
" msr basepri, r0 \n"/* basepri = ulMask. */
|
||||||
" dsb \n"
|
" dsb \n"
|
||||||
" isb \n"
|
" isb \n"
|
||||||
|
@ -412,6 +424,8 @@ void SVC_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" tst lr, #4 \n"
|
" tst lr, #4 \n"
|
||||||
" ite eq \n"
|
" ite eq \n"
|
||||||
" mrseq r0, msp \n"
|
" mrseq r0, msp \n"
|
||||||
|
@ -429,6 +443,8 @@ void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) /* __attribute__ (
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" svc %0 \n"/* Secure context is allocated in the supervisor call. */
|
" svc %0 \n"/* Secure context is allocated in the supervisor call. */
|
||||||
" bx lr \n"/* Return. */
|
" bx lr \n"/* Return. */
|
||||||
::"i" ( portSVC_ALLOCATE_SECURE_CONTEXT ) : "memory"
|
::"i" ( portSVC_ALLOCATE_SECURE_CONTEXT ) : "memory"
|
||||||
|
@ -440,6 +456,8 @@ void vPortFreeSecureContext( uint32_t * pulTCB ) /* __attribute__ (( naked )) PR
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" ldr r2, [r0] \n"/* The first item in the TCB is the top of the stack. */
|
" ldr r2, [r0] \n"/* The first item in the TCB is the top of the stack. */
|
||||||
" ldr r1, [r2] \n"/* The first item on the stack is the task's xSecureContext. */
|
" ldr r1, [r2] \n"/* The first item on the stack is the task's xSecureContext. */
|
||||||
" cmp r1, #0 \n"/* Raise svc if task's xSecureContext is not NULL. */
|
" cmp r1, #0 \n"/* Raise svc if task's xSecureContext is not NULL. */
|
||||||
|
|
|
@ -130,6 +130,8 @@ BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, control \n"/* r0 = CONTROL. */
|
" mrs r0, control \n"/* r0 = CONTROL. */
|
||||||
" tst r0, #1 \n"/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */
|
" tst r0, #1 \n"/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */
|
||||||
" ite ne \n"
|
" ite ne \n"
|
||||||
|
@ -147,6 +149,8 @@ void vRaisePrivilege( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, control \n"/* Read the CONTROL register. */
|
" mrs r0, control \n"/* Read the CONTROL register. */
|
||||||
" bic r0, #1 \n"/* Clear the bit 0. */
|
" bic r0, #1 \n"/* Clear the bit 0. */
|
||||||
" msr control, r0 \n"/* Write back the new CONTROL value. */
|
" msr control, r0 \n"/* Write back the new CONTROL value. */
|
||||||
|
@ -160,6 +164,8 @@ void vResetPrivilege( void ) /* __attribute__ (( naked )) */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, control \n"/* r0 = CONTROL. */
|
" mrs r0, control \n"/* r0 = CONTROL. */
|
||||||
" orr r0, #1 \n"/* r0 = r0 | 1. */
|
" orr r0, #1 \n"/* r0 = r0 | 1. */
|
||||||
" msr control, r0 \n"/* CONTROL = r0. */
|
" msr control, r0 \n"/* CONTROL = r0. */
|
||||||
|
@ -173,6 +179,8 @@ void vStartFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */
|
" ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */
|
||||||
" ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */
|
" ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */
|
||||||
" ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */
|
" ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */
|
||||||
|
@ -195,6 +203,8 @@ uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCT
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" mrs r0, basepri \n"/* r0 = basepri. Return original basepri value. */
|
" mrs r0, basepri \n"/* r0 = basepri. Return original basepri value. */
|
||||||
" mov r1, %0 \n"/* r1 = configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
" mov r1, %0 \n"/* r1 = configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
||||||
" msr basepri, r1 \n"/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
" msr basepri, r1 \n"/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */
|
||||||
|
@ -210,6 +220,8 @@ void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __att
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" msr basepri, r0 \n"/* basepri = ulMask. */
|
" msr basepri, r0 \n"/* basepri = ulMask. */
|
||||||
" dsb \n"
|
" dsb \n"
|
||||||
" isb \n"
|
" isb \n"
|
||||||
|
@ -337,6 +349,8 @@ void SVC_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
|
" .syntax unified \n"
|
||||||
|
" \n"
|
||||||
" tst lr, #4 \n"
|
" tst lr, #4 \n"
|
||||||
" ite eq \n"
|
" ite eq \n"
|
||||||
" mrseq r0, msp \n"
|
" mrseq r0, msp \n"
|
||||||
|
|
Loading…
Reference in a new issue