cortex-M ports: Clarify hardware-saved exception frame size variable (#1314)

* cortex-M ports: Clarify hardware-saved exception frame size variable

- Rename ulStackFrameSize to ulHardwareSavedExceptionFrameSize to
reflect the hardware-saved exception frame (8 or 26 words based
on FPU/lazy stacking).
- Add comments explaining standard vs extended frames.
- Apply across Cortex-M ports.
- No functional change, improves readability.

Signed-off-by: Ahmed Ismail <Ahmed.Ismail@arm.com>
Signed-off-by: Gaurav Aggarwal <aggarg@amazon.com>

* kernel-checker-script: Modify Arm copyright header regex

Arm's copyright header regex is modified with the following:

* Accept both single year copyright headers (e.g., "2024")
and year range copyright headers (e.g., "2024-2025").

* Accept both single-line copyright header and also
multi-line header.

* Add the escape backslash to accept only literal dot
not any character.

Signed-off-by: Gaurav Aggarwal <aggarg@amazon.com>
Signed-off-by: Ahmed Ismail <Ahmed.Ismail@arm.com>

---------

Signed-off-by: Ahmed Ismail <Ahmed.Ismail@arm.com>
Signed-off-by: Gaurav Aggarwal <aggarg@amazon.com>
This commit is contained in:
Ahmed Ismail 2025-09-09 07:25:42 +01:00 committed by GitHub
parent ccabdec2f8
commit 44ae6cf61a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
27 changed files with 561 additions and 343 deletions

View file

@ -114,6 +114,10 @@ KERNEL_ARM_COLLAB_FILES_PATTERNS = [
r'.*portable/.*/ARM_CM35*', r'.*portable/.*/ARM_CM35*',
r'.*portable/.*/ARM_CM55*', r'.*portable/.*/ARM_CM55*',
r'.*portable/.*/ARM_CM85*', r'.*portable/.*/ARM_CM85*',
r'.*portable/.*/ARM_CM0*',
r'.*portable/.*/ARM_CM3_MPU*',
r'.*portable/.*/ARM_CM4_MPU*',
r'.*portable/.*/ARM_CM4F_MPU*',
] ]
KERNEL_HEADER = [ KERNEL_HEADER = [
@ -150,8 +154,8 @@ KERNEL_HEADER = [
FREERTOS_COPYRIGHT_REGEX = r"^(;|#)?( *(\/\*|\*|#|\/\/))? Copyright \(C\) 20\d\d Amazon.com, Inc. or its affiliates. All Rights Reserved\.( \*\/)?$" FREERTOS_COPYRIGHT_REGEX = r"^(;|#)?( *(\/\*|\*|#|\/\/))? Copyright \(C\) 20\d\d Amazon.com, Inc. or its affiliates. All Rights Reserved\.( \*\/)?$"
FREERTOS_ARM_COLLAB_COPYRIGHT_REGEX = r"(^(;|#)?( *(\/\*|\*|#|\/\/))? Copyright \(C\) 20\d\d Amazon.com, Inc. or its affiliates. All Rights Reserved\.( \*\/)?$)|" + \ FREERTOS_ARM_COLLAB_COPYRIGHT_REGEX = r"(^(;|#)?( *(\/\*|\*|#|\/\/))? Copyright \(C\) 20\d\d Amazon.com, Inc. or its affiliates. All Rights Reserved\.( \*\/)?$)|" + \
r"(^(;|#)?( *(\/\*|\*|#|\/\/))? Copyright 20\d\d Arm Limited and/or its affiliates( \*\/)?$)|" + \ r"(^(;|#)?( *(\/\*|\*|#|\/\/))? Copyright 20\d\d(-20\d\d)? Arm Limited and/or its affiliates( +<open-source-office@arm\.com>)?( \*\/)?$)|" + \
r"(^(;|#)?( *(\/\*|\*|#|\/\/))? <open-source-office@arm.com>( \*\/)?$)" r"(^(;|#)?( *(\/\*|\*|#|\/\/))? <open-source-office@arm\.com>( \*\/)?$)"
class KernelHeaderChecker(HeaderChecker): class KernelHeaderChecker(HeaderChecker):

View file

@ -1,7 +1,7 @@
/* /*
* FreeRTOS Kernel <DEVELOPMENT BRANCH> * FreeRTOS Kernel <DEVELOPMENT BRANCH>
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Copyright 2024 Arm Limited and/or its affiliates * Copyright 2024-2025 Arm Limited and/or its affiliates
* <open-source-office@arm.com> * <open-source-office@arm.com>
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
@ -1200,7 +1200,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ]; extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack; uint32_t * pulSystemCallStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1236,12 +1236,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack; pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1251,20 +1255,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */ /* Make space on the system call stack for the stack frame. */
pulSystemCallStack = pulSystemCallStack - ulStackFrameSize; pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulSystemCallStack[ i ] = pulTaskStack[ i ]; pulSystemCallStack[ i ] = pulTaskStack[ i ];
} }
@ -1300,7 +1304,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
/* Remember the location where we should copy the stack frame when we exit from /* Remember the location where we should copy the stack frame when we exit from
* the system call. */ * the system call. */
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize; pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer /* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */ * to be double word aligned. */
@ -1350,7 +1354,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern TaskHandle_t pxCurrentTCB; extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack; uint32_t * pulTaskStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1382,12 +1386,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack; pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1397,20 +1405,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */ /* Make space on the task stack for the stack frame. */
pulTaskStack = pulTaskStack - ulStackFrameSize; pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulTaskStack[ i ] = pulSystemCallStack[ i ]; pulTaskStack[ i ] = pulSystemCallStack[ i ];
} }

View file

@ -1,6 +1,8 @@
/* /*
* FreeRTOS Kernel <DEVELOPMENT BRANCH> * FreeRTOS Kernel <DEVELOPMENT BRANCH>
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Copyright 2025 Arm Limited and/or its affiliates
* <open-source-office@arm.com>
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
* *
@ -915,7 +917,10 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack; uint32_t * pulSystemCallStack;
uint32_t ulSystemCallLocation, i; uint32_t ulSystemCallLocation, i;
const uint32_t ulStackFrameSize = 8; /* Hardware Saved Stack Frame Size upon Exception entry:
* Basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
*/
const uint32_t ulHardwareSavedExceptionFrameSize = 8;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -955,10 +960,10 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack; pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
/* Make space on the system call stack for the stack frame. */ /* Make space on the system call stack for the stack frame. */
pulSystemCallStack = pulSystemCallStack - ulStackFrameSize; pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulSystemCallStack[ i ] = pulTaskStack[ i ]; pulSystemCallStack[ i ] = pulTaskStack[ i ];
} }
@ -981,7 +986,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
/* Remember the location where we should copy the stack frame when we exit from /* Remember the location where we should copy the stack frame when we exit from
* the system call. */ * the system call. */
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize; pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer /* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */ * to be double word aligned. */
@ -1036,7 +1041,10 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack; uint32_t * pulTaskStack;
uint32_t ulSystemCallLocation, i; uint32_t ulSystemCallLocation, i;
const uint32_t ulStackFrameSize = 8; /* Hardware Saved Stack Frame Size upon Exception entry:
* Basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
*/
const uint32_t ulHardwareSavedExceptionFrameSize = 8;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1072,10 +1080,10 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack; pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
/* Make space on the task stack for the stack frame. */ /* Make space on the task stack for the stack frame. */
pulTaskStack = pulTaskStack - ulStackFrameSize; pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulTaskStack[ i ] = pulSystemCallStack[ i ]; pulTaskStack[ i ] = pulSystemCallStack[ i ];
} }

View file

@ -1,7 +1,7 @@
/* /*
* FreeRTOS Kernel <DEVELOPMENT BRANCH> * FreeRTOS Kernel <DEVELOPMENT BRANCH>
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Copyright 2024 Arm Limited and/or its affiliates * Copyright 2024-2025 Arm Limited and/or its affiliates
* <open-source-office@arm.com> * <open-source-office@arm.com>
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
@ -1200,7 +1200,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ]; extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack; uint32_t * pulSystemCallStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1236,12 +1236,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack; pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1251,20 +1255,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */ /* Make space on the system call stack for the stack frame. */
pulSystemCallStack = pulSystemCallStack - ulStackFrameSize; pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulSystemCallStack[ i ] = pulTaskStack[ i ]; pulSystemCallStack[ i ] = pulTaskStack[ i ];
} }
@ -1300,7 +1304,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
/* Remember the location where we should copy the stack frame when we exit from /* Remember the location where we should copy the stack frame when we exit from
* the system call. */ * the system call. */
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize; pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer /* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */ * to be double word aligned. */
@ -1350,7 +1354,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern TaskHandle_t pxCurrentTCB; extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack; uint32_t * pulTaskStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1382,12 +1386,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack; pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1397,20 +1405,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */ /* Make space on the task stack for the stack frame. */
pulTaskStack = pulTaskStack - ulStackFrameSize; pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulTaskStack[ i ] = pulSystemCallStack[ i ]; pulTaskStack[ i ] = pulSystemCallStack[ i ];
} }

View file

@ -1,7 +1,7 @@
/* /*
* FreeRTOS Kernel <DEVELOPMENT BRANCH> * FreeRTOS Kernel <DEVELOPMENT BRANCH>
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Copyright 2024 Arm Limited and/or its affiliates * Copyright 2024-2025 Arm Limited and/or its affiliates
* <open-source-office@arm.com> * <open-source-office@arm.com>
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
@ -1200,7 +1200,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ]; extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack; uint32_t * pulSystemCallStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1236,12 +1236,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack; pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1251,20 +1255,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */ /* Make space on the system call stack for the stack frame. */
pulSystemCallStack = pulSystemCallStack - ulStackFrameSize; pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulSystemCallStack[ i ] = pulTaskStack[ i ]; pulSystemCallStack[ i ] = pulTaskStack[ i ];
} }
@ -1300,7 +1304,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
/* Remember the location where we should copy the stack frame when we exit from /* Remember the location where we should copy the stack frame when we exit from
* the system call. */ * the system call. */
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize; pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer /* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */ * to be double word aligned. */
@ -1350,7 +1354,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern TaskHandle_t pxCurrentTCB; extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack; uint32_t * pulTaskStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1382,12 +1386,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack; pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1397,20 +1405,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */ /* Make space on the task stack for the stack frame. */
pulTaskStack = pulTaskStack - ulStackFrameSize; pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulTaskStack[ i ] = pulSystemCallStack[ i ]; pulTaskStack[ i ] = pulSystemCallStack[ i ];
} }

View file

@ -1,7 +1,7 @@
/* /*
* FreeRTOS Kernel <DEVELOPMENT BRANCH> * FreeRTOS Kernel <DEVELOPMENT BRANCH>
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Copyright 2024 Arm Limited and/or its affiliates * Copyright 2024-2025 Arm Limited and/or its affiliates
* <open-source-office@arm.com> * <open-source-office@arm.com>
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
@ -1200,7 +1200,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ]; extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack; uint32_t * pulSystemCallStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1236,12 +1236,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack; pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1251,20 +1255,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */ /* Make space on the system call stack for the stack frame. */
pulSystemCallStack = pulSystemCallStack - ulStackFrameSize; pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulSystemCallStack[ i ] = pulTaskStack[ i ]; pulSystemCallStack[ i ] = pulTaskStack[ i ];
} }
@ -1300,7 +1304,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
/* Remember the location where we should copy the stack frame when we exit from /* Remember the location where we should copy the stack frame when we exit from
* the system call. */ * the system call. */
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize; pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer /* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */ * to be double word aligned. */
@ -1350,7 +1354,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern TaskHandle_t pxCurrentTCB; extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack; uint32_t * pulTaskStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1382,12 +1386,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack; pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1397,20 +1405,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */ /* Make space on the task stack for the stack frame. */
pulTaskStack = pulTaskStack - ulStackFrameSize; pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulTaskStack[ i ] = pulSystemCallStack[ i ]; pulTaskStack[ i ] = pulSystemCallStack[ i ];
} }

View file

@ -1,7 +1,7 @@
/* /*
* FreeRTOS Kernel <DEVELOPMENT BRANCH> * FreeRTOS Kernel <DEVELOPMENT BRANCH>
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Copyright 2024 Arm Limited and/or its affiliates * Copyright 2024-2025 Arm Limited and/or its affiliates
* <open-source-office@arm.com> * <open-source-office@arm.com>
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
@ -1200,7 +1200,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ]; extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack; uint32_t * pulSystemCallStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1236,12 +1236,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack; pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1251,20 +1255,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */ /* Make space on the system call stack for the stack frame. */
pulSystemCallStack = pulSystemCallStack - ulStackFrameSize; pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulSystemCallStack[ i ] = pulTaskStack[ i ]; pulSystemCallStack[ i ] = pulTaskStack[ i ];
} }
@ -1300,7 +1304,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
/* Remember the location where we should copy the stack frame when we exit from /* Remember the location where we should copy the stack frame when we exit from
* the system call. */ * the system call. */
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize; pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer /* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */ * to be double word aligned. */
@ -1350,7 +1354,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern TaskHandle_t pxCurrentTCB; extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack; uint32_t * pulTaskStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1382,12 +1386,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack; pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1397,20 +1405,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */ /* Make space on the task stack for the stack frame. */
pulTaskStack = pulTaskStack - ulStackFrameSize; pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulTaskStack[ i ] = pulSystemCallStack[ i ]; pulTaskStack[ i ] = pulSystemCallStack[ i ];
} }

View file

@ -1,7 +1,7 @@
/* /*
* FreeRTOS Kernel <DEVELOPMENT BRANCH> * FreeRTOS Kernel <DEVELOPMENT BRANCH>
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Copyright 2024 Arm Limited and/or its affiliates * Copyright 2024-2025 Arm Limited and/or its affiliates
* <open-source-office@arm.com> * <open-source-office@arm.com>
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
@ -1200,7 +1200,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ]; extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack; uint32_t * pulSystemCallStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1236,12 +1236,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack; pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1251,20 +1255,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */ /* Make space on the system call stack for the stack frame. */
pulSystemCallStack = pulSystemCallStack - ulStackFrameSize; pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulSystemCallStack[ i ] = pulTaskStack[ i ]; pulSystemCallStack[ i ] = pulTaskStack[ i ];
} }
@ -1300,7 +1304,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
/* Remember the location where we should copy the stack frame when we exit from /* Remember the location where we should copy the stack frame when we exit from
* the system call. */ * the system call. */
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize; pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer /* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */ * to be double word aligned. */
@ -1350,7 +1354,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern TaskHandle_t pxCurrentTCB; extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack; uint32_t * pulTaskStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1382,12 +1386,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack; pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1397,20 +1405,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */ /* Make space on the task stack for the stack frame. */
pulTaskStack = pulTaskStack - ulStackFrameSize; pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulTaskStack[ i ] = pulSystemCallStack[ i ]; pulTaskStack[ i ] = pulSystemCallStack[ i ];
} }

View file

@ -1,7 +1,7 @@
/* /*
* FreeRTOS Kernel <DEVELOPMENT BRANCH> * FreeRTOS Kernel <DEVELOPMENT BRANCH>
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Copyright 2024 Arm Limited and/or its affiliates * Copyright 2024-2025 Arm Limited and/or its affiliates
* <open-source-office@arm.com> * <open-source-office@arm.com>
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
@ -1200,7 +1200,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ]; extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack; uint32_t * pulSystemCallStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1236,12 +1236,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack; pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1251,20 +1255,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */ /* Make space on the system call stack for the stack frame. */
pulSystemCallStack = pulSystemCallStack - ulStackFrameSize; pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulSystemCallStack[ i ] = pulTaskStack[ i ]; pulSystemCallStack[ i ] = pulTaskStack[ i ];
} }
@ -1300,7 +1304,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
/* Remember the location where we should copy the stack frame when we exit from /* Remember the location where we should copy the stack frame when we exit from
* the system call. */ * the system call. */
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize; pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer /* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */ * to be double word aligned. */
@ -1350,7 +1354,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern TaskHandle_t pxCurrentTCB; extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack; uint32_t * pulTaskStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1382,12 +1386,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack; pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1397,20 +1405,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */ /* Make space on the task stack for the stack frame. */
pulTaskStack = pulTaskStack - ulStackFrameSize; pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulTaskStack[ i ] = pulSystemCallStack[ i ]; pulTaskStack[ i ] = pulSystemCallStack[ i ];
} }

View file

@ -1,6 +1,8 @@
/* /*
* FreeRTOS Kernel <DEVELOPMENT BRANCH> * FreeRTOS Kernel <DEVELOPMENT BRANCH>
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Copyright 2025 Arm Limited and/or its affiliates
* <open-source-office@arm.com>
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
* *
@ -484,7 +486,10 @@ void vSVCHandler_C( uint32_t * pulParam ) /* PRIVILEGED_FUNCTION */
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack; uint32_t * pulSystemCallStack;
uint32_t ulSystemCallLocation, i; uint32_t ulSystemCallLocation, i;
const uint32_t ulStackFrameSize = 8; /* Hardware Saved Stack Frame Size upon Exception entry:
* Basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
*/
const uint32_t ulHardwareSavedExceptionFrameSize = 8;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
/* Declaration when these variable are defined in code instead of being /* Declaration when these variable are defined in code instead of being
@ -520,10 +525,10 @@ void vSVCHandler_C( uint32_t * pulParam ) /* PRIVILEGED_FUNCTION */
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack; pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
/* Make space on the system call stack for the stack frame. */ /* Make space on the system call stack for the stack frame. */
pulSystemCallStack = pulSystemCallStack - ulStackFrameSize; pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulSystemCallStack[ i ] = pulTaskStack[ i ]; pulSystemCallStack[ i ] = pulTaskStack[ i ];
} }
@ -541,7 +546,7 @@ void vSVCHandler_C( uint32_t * pulParam ) /* PRIVILEGED_FUNCTION */
/* Remember the location where we should copy the stack frame when we exit from /* Remember the location where we should copy the stack frame when we exit from
* the system call. */ * the system call. */
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize; pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Store the value of the Link Register before the SVC was raised. /* Store the value of the Link Register before the SVC was raised.
* It contains the address of the caller of the System Call entry * It contains the address of the caller of the System Call entry
@ -594,7 +599,10 @@ void vSVCHandler_C( uint32_t * pulParam ) /* PRIVILEGED_FUNCTION */
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack; uint32_t * pulTaskStack;
uint32_t ulSystemCallLocation, i; uint32_t ulSystemCallLocation, i;
const uint32_t ulStackFrameSize = 8; /* Hardware Saved Stack Frame Size upon Exception entry:
* Basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
*/
const uint32_t ulHardwareSavedExceptionFrameSize = 8;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
/* Declaration when these variable are defined in code instead of being /* Declaration when these variable are defined in code instead of being
@ -626,10 +634,10 @@ void vSVCHandler_C( uint32_t * pulParam ) /* PRIVILEGED_FUNCTION */
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack; pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
/* Make space on the task stack for the stack frame. */ /* Make space on the task stack for the stack frame. */
pulTaskStack = pulTaskStack - ulStackFrameSize; pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulTaskStack[ i ] = pulSystemCallStack[ i ]; pulTaskStack[ i ] = pulSystemCallStack[ i ];
} }

View file

@ -1,6 +1,8 @@
/* /*
* FreeRTOS Kernel <DEVELOPMENT BRANCH> * FreeRTOS Kernel <DEVELOPMENT BRANCH>
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Copyright 2025 Arm Limited and/or its affiliates
* <open-source-office@arm.com>
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
* *
@ -518,7 +520,7 @@ void vSVCHandler_C( uint32_t * pulParam ) /* PRIVILEGED_FUNCTION */
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ]; extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack; uint32_t * pulSystemCallStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
/* Declaration when these variable are defined in code instead of being /* Declaration when these variable are defined in code instead of being
@ -553,10 +555,14 @@ void vSVCHandler_C( uint32_t * pulParam ) /* PRIVILEGED_FUNCTION */
{ {
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack; pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -566,14 +572,14 @@ void vSVCHandler_C( uint32_t * pulParam ) /* PRIVILEGED_FUNCTION */
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
/* Make space on the system call stack for the stack frame. */ /* Make space on the system call stack for the stack frame. */
pulSystemCallStack = pulSystemCallStack - ulStackFrameSize; pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulSystemCallStack[ i ] = pulTaskStack[ i ]; pulSystemCallStack[ i ] = pulTaskStack[ i ];
} }
@ -591,7 +597,7 @@ void vSVCHandler_C( uint32_t * pulParam ) /* PRIVILEGED_FUNCTION */
/* Remember the location where we should copy the stack frame when we exit from /* Remember the location where we should copy the stack frame when we exit from
* the system call. */ * the system call. */
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize; pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Store the value of the Link Register before the SVC was raised. /* Store the value of the Link Register before the SVC was raised.
* It contains the address of the caller of the System Call entry * It contains the address of the caller of the System Call entry
@ -644,7 +650,7 @@ void vSVCHandler_C( uint32_t * pulParam ) /* PRIVILEGED_FUNCTION */
extern TaskHandle_t pxCurrentTCB; extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack; uint32_t * pulTaskStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
/* Declaration when these variable are defined in code instead of being /* Declaration when these variable are defined in code instead of being
@ -675,10 +681,14 @@ void vSVCHandler_C( uint32_t * pulParam ) /* PRIVILEGED_FUNCTION */
{ {
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack; pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -688,14 +698,14 @@ void vSVCHandler_C( uint32_t * pulParam ) /* PRIVILEGED_FUNCTION */
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
/* Make space on the task stack for the stack frame. */ /* Make space on the task stack for the stack frame. */
pulTaskStack = pulTaskStack - ulStackFrameSize; pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulTaskStack[ i ] = pulSystemCallStack[ i ]; pulTaskStack[ i ] = pulSystemCallStack[ i ];
} }

View file

@ -1,7 +1,7 @@
/* /*
* FreeRTOS Kernel <DEVELOPMENT BRANCH> * FreeRTOS Kernel <DEVELOPMENT BRANCH>
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Copyright 2024 Arm Limited and/or its affiliates * Copyright 2024-2025 Arm Limited and/or its affiliates
* <open-source-office@arm.com> * <open-source-office@arm.com>
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
@ -1200,7 +1200,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ]; extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack; uint32_t * pulSystemCallStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1236,12 +1236,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack; pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1251,20 +1255,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */ /* Make space on the system call stack for the stack frame. */
pulSystemCallStack = pulSystemCallStack - ulStackFrameSize; pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulSystemCallStack[ i ] = pulTaskStack[ i ]; pulSystemCallStack[ i ] = pulTaskStack[ i ];
} }
@ -1300,7 +1304,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
/* Remember the location where we should copy the stack frame when we exit from /* Remember the location where we should copy the stack frame when we exit from
* the system call. */ * the system call. */
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize; pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer /* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */ * to be double word aligned. */
@ -1350,7 +1354,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern TaskHandle_t pxCurrentTCB; extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack; uint32_t * pulTaskStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1382,12 +1386,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack; pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1397,20 +1405,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */ /* Make space on the task stack for the stack frame. */
pulTaskStack = pulTaskStack - ulStackFrameSize; pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulTaskStack[ i ] = pulSystemCallStack[ i ]; pulTaskStack[ i ] = pulSystemCallStack[ i ];
} }

View file

@ -1,7 +1,7 @@
/* /*
* FreeRTOS Kernel <DEVELOPMENT BRANCH> * FreeRTOS Kernel <DEVELOPMENT BRANCH>
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Copyright 2024 Arm Limited and/or its affiliates * Copyright 2024-2025 Arm Limited and/or its affiliates
* <open-source-office@arm.com> * <open-source-office@arm.com>
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
@ -1200,7 +1200,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ]; extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack; uint32_t * pulSystemCallStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1236,12 +1236,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack; pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1251,20 +1255,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */ /* Make space on the system call stack for the stack frame. */
pulSystemCallStack = pulSystemCallStack - ulStackFrameSize; pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulSystemCallStack[ i ] = pulTaskStack[ i ]; pulSystemCallStack[ i ] = pulTaskStack[ i ];
} }
@ -1300,7 +1304,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
/* Remember the location where we should copy the stack frame when we exit from /* Remember the location where we should copy the stack frame when we exit from
* the system call. */ * the system call. */
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize; pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer /* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */ * to be double word aligned. */
@ -1350,7 +1354,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern TaskHandle_t pxCurrentTCB; extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack; uint32_t * pulTaskStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1382,12 +1386,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack; pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1397,20 +1405,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */ /* Make space on the task stack for the stack frame. */
pulTaskStack = pulTaskStack - ulStackFrameSize; pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulTaskStack[ i ] = pulSystemCallStack[ i ]; pulTaskStack[ i ] = pulSystemCallStack[ i ];
} }

View file

@ -1,7 +1,7 @@
/* /*
* FreeRTOS Kernel <DEVELOPMENT BRANCH> * FreeRTOS Kernel <DEVELOPMENT BRANCH>
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Copyright 2024 Arm Limited and/or its affiliates * Copyright 2024-2025 Arm Limited and/or its affiliates
* <open-source-office@arm.com> * <open-source-office@arm.com>
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
@ -1200,7 +1200,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ]; extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack; uint32_t * pulSystemCallStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1236,12 +1236,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack; pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1251,20 +1255,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */ /* Make space on the system call stack for the stack frame. */
pulSystemCallStack = pulSystemCallStack - ulStackFrameSize; pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulSystemCallStack[ i ] = pulTaskStack[ i ]; pulSystemCallStack[ i ] = pulTaskStack[ i ];
} }
@ -1300,7 +1304,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
/* Remember the location where we should copy the stack frame when we exit from /* Remember the location where we should copy the stack frame when we exit from
* the system call. */ * the system call. */
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize; pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer /* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */ * to be double word aligned. */
@ -1350,7 +1354,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern TaskHandle_t pxCurrentTCB; extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack; uint32_t * pulTaskStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1382,12 +1386,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack; pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1397,20 +1405,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */ /* Make space on the task stack for the stack frame. */
pulTaskStack = pulTaskStack - ulStackFrameSize; pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulTaskStack[ i ] = pulSystemCallStack[ i ]; pulTaskStack[ i ] = pulSystemCallStack[ i ];
} }

View file

@ -1,7 +1,7 @@
/* /*
* FreeRTOS Kernel <DEVELOPMENT BRANCH> * FreeRTOS Kernel <DEVELOPMENT BRANCH>
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Copyright 2024 Arm Limited and/or its affiliates * Copyright 2024-2025 Arm Limited and/or its affiliates
* <open-source-office@arm.com> * <open-source-office@arm.com>
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
@ -1200,7 +1200,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ]; extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack; uint32_t * pulSystemCallStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1236,12 +1236,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack; pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1251,20 +1255,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */ /* Make space on the system call stack for the stack frame. */
pulSystemCallStack = pulSystemCallStack - ulStackFrameSize; pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulSystemCallStack[ i ] = pulTaskStack[ i ]; pulSystemCallStack[ i ] = pulTaskStack[ i ];
} }
@ -1300,7 +1304,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
/* Remember the location where we should copy the stack frame when we exit from /* Remember the location where we should copy the stack frame when we exit from
* the system call. */ * the system call. */
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize; pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer /* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */ * to be double word aligned. */
@ -1350,7 +1354,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern TaskHandle_t pxCurrentTCB; extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack; uint32_t * pulTaskStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1382,12 +1386,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack; pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1397,20 +1405,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */ /* Make space on the task stack for the stack frame. */
pulTaskStack = pulTaskStack - ulStackFrameSize; pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulTaskStack[ i ] = pulSystemCallStack[ i ]; pulTaskStack[ i ] = pulSystemCallStack[ i ];
} }

View file

@ -1,7 +1,7 @@
/* /*
* FreeRTOS Kernel <DEVELOPMENT BRANCH> * FreeRTOS Kernel <DEVELOPMENT BRANCH>
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Copyright 2024 Arm Limited and/or its affiliates * Copyright 2024-2025 Arm Limited and/or its affiliates
* <open-source-office@arm.com> * <open-source-office@arm.com>
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
@ -1200,7 +1200,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ]; extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack; uint32_t * pulSystemCallStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1236,12 +1236,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack; pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1251,20 +1255,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */ /* Make space on the system call stack for the stack frame. */
pulSystemCallStack = pulSystemCallStack - ulStackFrameSize; pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulSystemCallStack[ i ] = pulTaskStack[ i ]; pulSystemCallStack[ i ] = pulTaskStack[ i ];
} }
@ -1300,7 +1304,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
/* Remember the location where we should copy the stack frame when we exit from /* Remember the location where we should copy the stack frame when we exit from
* the system call. */ * the system call. */
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize; pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer /* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */ * to be double word aligned. */
@ -1350,7 +1354,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern TaskHandle_t pxCurrentTCB; extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack; uint32_t * pulTaskStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1382,12 +1386,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack; pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1397,20 +1405,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */ /* Make space on the task stack for the stack frame. */
pulTaskStack = pulTaskStack - ulStackFrameSize; pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulTaskStack[ i ] = pulSystemCallStack[ i ]; pulTaskStack[ i ] = pulSystemCallStack[ i ];
} }

View file

@ -1,7 +1,7 @@
/* /*
* FreeRTOS Kernel <DEVELOPMENT BRANCH> * FreeRTOS Kernel <DEVELOPMENT BRANCH>
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Copyright 2024 Arm Limited and/or its affiliates * Copyright 2024-2025 Arm Limited and/or its affiliates
* <open-source-office@arm.com> * <open-source-office@arm.com>
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
@ -1200,7 +1200,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ]; extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack; uint32_t * pulSystemCallStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1236,12 +1236,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack; pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1251,20 +1255,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */ /* Make space on the system call stack for the stack frame. */
pulSystemCallStack = pulSystemCallStack - ulStackFrameSize; pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulSystemCallStack[ i ] = pulTaskStack[ i ]; pulSystemCallStack[ i ] = pulTaskStack[ i ];
} }
@ -1300,7 +1304,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
/* Remember the location where we should copy the stack frame when we exit from /* Remember the location where we should copy the stack frame when we exit from
* the system call. */ * the system call. */
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize; pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer /* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */ * to be double word aligned. */
@ -1350,7 +1354,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern TaskHandle_t pxCurrentTCB; extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack; uint32_t * pulTaskStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1382,12 +1386,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack; pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1397,20 +1405,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */ /* Make space on the task stack for the stack frame. */
pulTaskStack = pulTaskStack - ulStackFrameSize; pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulTaskStack[ i ] = pulSystemCallStack[ i ]; pulTaskStack[ i ] = pulSystemCallStack[ i ];
} }

View file

@ -1,7 +1,7 @@
/* /*
* FreeRTOS Kernel <DEVELOPMENT BRANCH> * FreeRTOS Kernel <DEVELOPMENT BRANCH>
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Copyright 2024 Arm Limited and/or its affiliates * Copyright 2024-2025 Arm Limited and/or its affiliates
* <open-source-office@arm.com> * <open-source-office@arm.com>
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
@ -1200,7 +1200,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ]; extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack; uint32_t * pulSystemCallStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1236,12 +1236,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack; pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1251,20 +1255,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */ /* Make space on the system call stack for the stack frame. */
pulSystemCallStack = pulSystemCallStack - ulStackFrameSize; pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulSystemCallStack[ i ] = pulTaskStack[ i ]; pulSystemCallStack[ i ] = pulTaskStack[ i ];
} }
@ -1300,7 +1304,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
/* Remember the location where we should copy the stack frame when we exit from /* Remember the location where we should copy the stack frame when we exit from
* the system call. */ * the system call. */
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize; pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer /* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */ * to be double word aligned. */
@ -1350,7 +1354,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern TaskHandle_t pxCurrentTCB; extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack; uint32_t * pulTaskStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1382,12 +1386,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack; pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1397,20 +1405,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */ /* Make space on the task stack for the stack frame. */
pulTaskStack = pulTaskStack - ulStackFrameSize; pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulTaskStack[ i ] = pulSystemCallStack[ i ]; pulTaskStack[ i ] = pulSystemCallStack[ i ];
} }

View file

@ -1,7 +1,7 @@
/* /*
* FreeRTOS Kernel <DEVELOPMENT BRANCH> * FreeRTOS Kernel <DEVELOPMENT BRANCH>
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Copyright 2024 Arm Limited and/or its affiliates * Copyright 2024-2025 Arm Limited and/or its affiliates
* <open-source-office@arm.com> * <open-source-office@arm.com>
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
@ -1200,7 +1200,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ]; extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack; uint32_t * pulSystemCallStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1236,12 +1236,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack; pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1251,20 +1255,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */ /* Make space on the system call stack for the stack frame. */
pulSystemCallStack = pulSystemCallStack - ulStackFrameSize; pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulSystemCallStack[ i ] = pulTaskStack[ i ]; pulSystemCallStack[ i ] = pulTaskStack[ i ];
} }
@ -1300,7 +1304,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
/* Remember the location where we should copy the stack frame when we exit from /* Remember the location where we should copy the stack frame when we exit from
* the system call. */ * the system call. */
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize; pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer /* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */ * to be double word aligned. */
@ -1350,7 +1354,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern TaskHandle_t pxCurrentTCB; extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack; uint32_t * pulTaskStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1382,12 +1386,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack; pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1397,20 +1405,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */ /* Make space on the task stack for the stack frame. */
pulTaskStack = pulTaskStack - ulStackFrameSize; pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulTaskStack[ i ] = pulSystemCallStack[ i ]; pulTaskStack[ i ] = pulSystemCallStack[ i ];
} }

View file

@ -1,7 +1,7 @@
/* /*
* FreeRTOS Kernel <DEVELOPMENT BRANCH> * FreeRTOS Kernel <DEVELOPMENT BRANCH>
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Copyright 2024 Arm Limited and/or its affiliates * Copyright 2024-2025 Arm Limited and/or its affiliates
* <open-source-office@arm.com> * <open-source-office@arm.com>
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
@ -1200,7 +1200,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ]; extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack; uint32_t * pulSystemCallStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1236,12 +1236,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack; pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1251,20 +1255,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */ /* Make space on the system call stack for the stack frame. */
pulSystemCallStack = pulSystemCallStack - ulStackFrameSize; pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulSystemCallStack[ i ] = pulTaskStack[ i ]; pulSystemCallStack[ i ] = pulTaskStack[ i ];
} }
@ -1300,7 +1304,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
/* Remember the location where we should copy the stack frame when we exit from /* Remember the location where we should copy the stack frame when we exit from
* the system call. */ * the system call. */
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize; pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer /* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */ * to be double word aligned. */
@ -1350,7 +1354,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern TaskHandle_t pxCurrentTCB; extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack; uint32_t * pulTaskStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1382,12 +1386,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack; pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1397,20 +1405,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */ /* Make space on the task stack for the stack frame. */
pulTaskStack = pulTaskStack - ulStackFrameSize; pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulTaskStack[ i ] = pulSystemCallStack[ i ]; pulTaskStack[ i ] = pulSystemCallStack[ i ];
} }

View file

@ -1,7 +1,7 @@
/* /*
* FreeRTOS Kernel <DEVELOPMENT BRANCH> * FreeRTOS Kernel <DEVELOPMENT BRANCH>
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Copyright 2024 Arm Limited and/or its affiliates * Copyright 2024-2025 Arm Limited and/or its affiliates
* <open-source-office@arm.com> * <open-source-office@arm.com>
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
@ -1200,7 +1200,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ]; extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack; uint32_t * pulSystemCallStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1236,12 +1236,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack; pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1251,20 +1255,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */ /* Make space on the system call stack for the stack frame. */
pulSystemCallStack = pulSystemCallStack - ulStackFrameSize; pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulSystemCallStack[ i ] = pulTaskStack[ i ]; pulSystemCallStack[ i ] = pulTaskStack[ i ];
} }
@ -1300,7 +1304,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
/* Remember the location where we should copy the stack frame when we exit from /* Remember the location where we should copy the stack frame when we exit from
* the system call. */ * the system call. */
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize; pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer /* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */ * to be double word aligned. */
@ -1350,7 +1354,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern TaskHandle_t pxCurrentTCB; extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack; uint32_t * pulTaskStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1382,12 +1386,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack; pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1397,20 +1405,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */ /* Make space on the task stack for the stack frame. */
pulTaskStack = pulTaskStack - ulStackFrameSize; pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulTaskStack[ i ] = pulSystemCallStack[ i ]; pulTaskStack[ i ] = pulSystemCallStack[ i ];
} }

View file

@ -1,6 +1,8 @@
/* /*
* FreeRTOS Kernel <DEVELOPMENT BRANCH> * FreeRTOS Kernel <DEVELOPMENT BRANCH>
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Copyright 2025 Arm Limited and/or its affiliates
* <open-source-office@arm.com>
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
* *
@ -459,7 +461,7 @@ void vPortSVCHandler_C( uint32_t * pulParam ) /* PRIVILEGED_FUNCTION */
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ]; extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack; uint32_t * pulSystemCallStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
/* Declaration when these variable are defined in code instead of being /* Declaration when these variable are defined in code instead of being
@ -494,10 +496,14 @@ void vPortSVCHandler_C( uint32_t * pulParam ) /* PRIVILEGED_FUNCTION */
{ {
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack; pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -507,14 +513,14 @@ void vPortSVCHandler_C( uint32_t * pulParam ) /* PRIVILEGED_FUNCTION */
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
/* Make space on the system call stack for the stack frame. */ /* Make space on the system call stack for the stack frame. */
pulSystemCallStack = pulSystemCallStack - ulStackFrameSize; pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulSystemCallStack[ i ] = pulTaskStack[ i ]; pulSystemCallStack[ i ] = pulTaskStack[ i ];
} }
@ -532,7 +538,7 @@ void vPortSVCHandler_C( uint32_t * pulParam ) /* PRIVILEGED_FUNCTION */
/* Remember the location where we should copy the stack frame when we exit from /* Remember the location where we should copy the stack frame when we exit from
* the system call. */ * the system call. */
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize; pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Store the value of the Link Register before the SVC was raised. /* Store the value of the Link Register before the SVC was raised.
* It contains the address of the caller of the System Call entry * It contains the address of the caller of the System Call entry
@ -586,7 +592,7 @@ void vPortSVCHandler_C( uint32_t * pulParam ) /* PRIVILEGED_FUNCTION */
extern TaskHandle_t pxCurrentTCB; extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack; uint32_t * pulTaskStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
/* Declaration when these variable are defined in code instead of being /* Declaration when these variable are defined in code instead of being
@ -617,10 +623,14 @@ void vPortSVCHandler_C( uint32_t * pulParam ) /* PRIVILEGED_FUNCTION */
{ {
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack; pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -630,14 +640,14 @@ void vPortSVCHandler_C( uint32_t * pulParam ) /* PRIVILEGED_FUNCTION */
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
/* Make space on the task stack for the stack frame. */ /* Make space on the task stack for the stack frame. */
pulTaskStack = pulTaskStack - ulStackFrameSize; pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulTaskStack[ i ] = pulSystemCallStack[ i ]; pulTaskStack[ i ] = pulSystemCallStack[ i ];
} }

View file

@ -1,7 +1,7 @@
/* /*
* FreeRTOS Kernel <DEVELOPMENT BRANCH> * FreeRTOS Kernel <DEVELOPMENT BRANCH>
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Copyright 2024 Arm Limited and/or its affiliates * Copyright 2024-2025 Arm Limited and/or its affiliates
* <open-source-office@arm.com> * <open-source-office@arm.com>
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
@ -1200,7 +1200,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ]; extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack; uint32_t * pulSystemCallStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1236,12 +1236,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack; pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1251,20 +1255,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */ /* Make space on the system call stack for the stack frame. */
pulSystemCallStack = pulSystemCallStack - ulStackFrameSize; pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulSystemCallStack[ i ] = pulTaskStack[ i ]; pulSystemCallStack[ i ] = pulTaskStack[ i ];
} }
@ -1300,7 +1304,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
/* Remember the location where we should copy the stack frame when we exit from /* Remember the location where we should copy the stack frame when we exit from
* the system call. */ * the system call. */
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize; pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer /* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */ * to be double word aligned. */
@ -1350,7 +1354,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern TaskHandle_t pxCurrentTCB; extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack; uint32_t * pulTaskStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1382,12 +1386,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack; pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1397,20 +1405,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */ /* Make space on the task stack for the stack frame. */
pulTaskStack = pulTaskStack - ulStackFrameSize; pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulTaskStack[ i ] = pulSystemCallStack[ i ]; pulTaskStack[ i ] = pulSystemCallStack[ i ];
} }

View file

@ -1,7 +1,7 @@
/* /*
* FreeRTOS Kernel <DEVELOPMENT BRANCH> * FreeRTOS Kernel <DEVELOPMENT BRANCH>
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Copyright 2024 Arm Limited and/or its affiliates * Copyright 2024-2025 Arm Limited and/or its affiliates
* <open-source-office@arm.com> * <open-source-office@arm.com>
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
@ -1200,7 +1200,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ]; extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack; uint32_t * pulSystemCallStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1236,12 +1236,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack; pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1251,20 +1255,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */ /* Make space on the system call stack for the stack frame. */
pulSystemCallStack = pulSystemCallStack - ulStackFrameSize; pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulSystemCallStack[ i ] = pulTaskStack[ i ]; pulSystemCallStack[ i ] = pulTaskStack[ i ];
} }
@ -1300,7 +1304,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
/* Remember the location where we should copy the stack frame when we exit from /* Remember the location where we should copy the stack frame when we exit from
* the system call. */ * the system call. */
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize; pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer /* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */ * to be double word aligned. */
@ -1350,7 +1354,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern TaskHandle_t pxCurrentTCB; extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack; uint32_t * pulTaskStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1382,12 +1386,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack; pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1397,20 +1405,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */ /* Make space on the task stack for the stack frame. */
pulTaskStack = pulTaskStack - ulStackFrameSize; pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulTaskStack[ i ] = pulSystemCallStack[ i ]; pulTaskStack[ i ] = pulSystemCallStack[ i ];
} }

View file

@ -1,7 +1,7 @@
/* /*
* FreeRTOS Kernel <DEVELOPMENT BRANCH> * FreeRTOS Kernel <DEVELOPMENT BRANCH>
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Copyright 2024 Arm Limited and/or its affiliates * Copyright 2024-2025 Arm Limited and/or its affiliates
* <open-source-office@arm.com> * <open-source-office@arm.com>
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
@ -1200,7 +1200,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ]; extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack; uint32_t * pulSystemCallStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1236,12 +1236,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack; pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1251,20 +1255,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */ /* Make space on the system call stack for the stack frame. */
pulSystemCallStack = pulSystemCallStack - ulStackFrameSize; pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulSystemCallStack[ i ] = pulTaskStack[ i ]; pulSystemCallStack[ i ] = pulTaskStack[ i ];
} }
@ -1300,7 +1304,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
/* Remember the location where we should copy the stack frame when we exit from /* Remember the location where we should copy the stack frame when we exit from
* the system call. */ * the system call. */
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize; pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer /* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */ * to be double word aligned. */
@ -1350,7 +1354,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern TaskHandle_t pxCurrentTCB; extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack; uint32_t * pulTaskStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1382,12 +1386,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack; pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1397,20 +1405,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */ /* Make space on the task stack for the stack frame. */
pulTaskStack = pulTaskStack - ulStackFrameSize; pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulTaskStack[ i ] = pulSystemCallStack[ i ]; pulTaskStack[ i ] = pulSystemCallStack[ i ];
} }

View file

@ -1,7 +1,7 @@
/* /*
* FreeRTOS Kernel <DEVELOPMENT BRANCH> * FreeRTOS Kernel <DEVELOPMENT BRANCH>
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Copyright 2024 Arm Limited and/or its affiliates * Copyright 2024-2025 Arm Limited and/or its affiliates
* <open-source-office@arm.com> * <open-source-office@arm.com>
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
@ -1200,7 +1200,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ]; extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack; uint32_t * pulSystemCallStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1236,12 +1236,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack; pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1251,20 +1255,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */ /* Make space on the system call stack for the stack frame. */
pulSystemCallStack = pulSystemCallStack - ulStackFrameSize; pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulSystemCallStack[ i ] = pulTaskStack[ i ]; pulSystemCallStack[ i ] = pulTaskStack[ i ];
} }
@ -1300,7 +1304,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
/* Remember the location where we should copy the stack frame when we exit from /* Remember the location where we should copy the stack frame when we exit from
* the system call. */ * the system call. */
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize; pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer /* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */ * to be double word aligned. */
@ -1350,7 +1354,7 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
extern TaskHandle_t pxCurrentTCB; extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack; uint32_t * pulTaskStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION ) #if defined( __ARMCC_VERSION )
@ -1382,12 +1386,16 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
{ {
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack; pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{ {
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
__asm volatile ( __asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */ " vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */ " vpop {s0} \n" /* Nullify the affect of the above instruction. */
@ -1397,20 +1405,20 @@ void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTIO
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
} }
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */ #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{ {
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
#endif /* configENABLE_FPU || configENABLE_MVE */ #endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */ /* Make space on the task stack for the stack frame. */
pulTaskStack = pulTaskStack - ulStackFrameSize; pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulTaskStack[ i ] = pulSystemCallStack[ i ]; pulTaskStack[ i ] = pulSystemCallStack[ i ];
} }

View file

@ -1,6 +1,8 @@
/* /*
* FreeRTOS Kernel <DEVELOPMENT BRANCH> * FreeRTOS Kernel <DEVELOPMENT BRANCH>
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Copyright 2025 Arm Limited and/or its affiliates
* <open-source-office@arm.com>
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
* *
@ -474,7 +476,7 @@ void vSVCHandler_C( uint32_t * pulParam )
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ]; extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack; uint32_t * pulSystemCallStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i, r1; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i, r1;
extern uint32_t __syscalls_flash_start__; extern uint32_t __syscalls_flash_start__;
extern uint32_t __syscalls_flash_end__; extern uint32_t __syscalls_flash_end__;
@ -500,23 +502,27 @@ void vSVCHandler_C( uint32_t * pulParam )
{ {
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack; pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
prvTriggerLazyStacking(); prvTriggerLazyStacking();
} }
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
/* Make space on the system call stack for the stack frame. */ /* Make space on the system call stack for the stack frame. */
pulSystemCallStack = pulSystemCallStack - ulStackFrameSize; pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulSystemCallStack[ i ] = pulTaskStack[ i ]; pulSystemCallStack[ i ] = pulTaskStack[ i ];
} }
@ -537,7 +543,7 @@ void vSVCHandler_C( uint32_t * pulParam )
/* Remember the location where we should copy the stack frame when we exit from /* Remember the location where we should copy the stack frame when we exit from
* the system call. */ * the system call. */
pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize; pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Store the value of the Link Register before the SVC was raised. /* Store the value of the Link Register before the SVC was raised.
* It contains the address of the caller of the System Call entry * It contains the address of the caller of the System Call entry
@ -592,7 +598,7 @@ void vSVCHandler_C( uint32_t * pulParam )
extern TaskHandle_t pxCurrentTCB; extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings; xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack; uint32_t * pulTaskStack;
uint32_t ulStackFrameSize, ulSystemCallLocation, i, r1; uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i, r1;
extern uint32_t __privileged_functions_start__; extern uint32_t __privileged_functions_start__;
extern uint32_t __privileged_functions_end__; extern uint32_t __privileged_functions_end__;
@ -614,23 +620,27 @@ void vSVCHandler_C( uint32_t * pulParam )
{ {
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack; pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
/* Hardware Saved Stack Frame Size upon Exception entry:
* - No FPU: basic frame (R0-R3, R12, LR, PC, and xPSR) = 8 words.
* - With FPU (lazy stacking): basic frame + S0S15 + FPSCR + reserved word = 26 words.
*/
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL ) if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{ {
/* Extended frame i.e. FPU in use. */ /* Extended frame i.e. FPU in use. */
ulStackFrameSize = 26; ulHardwareSavedExceptionFrameSize = 26;
prvTriggerLazyStacking(); prvTriggerLazyStacking();
} }
else else
{ {
/* Standard frame i.e. FPU not in use. */ /* Standard frame i.e. FPU not in use. */
ulStackFrameSize = 8; ulHardwareSavedExceptionFrameSize = 8;
} }
/* Make space on the task stack for the stack frame. */ /* Make space on the task stack for the stack frame. */
pulTaskStack = pulTaskStack - ulStackFrameSize; pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */ /* Copy the stack frame. */
for( i = 0; i < ulStackFrameSize; i++ ) for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{ {
pulTaskStack[ i ] = pulSystemCallStack[ i ]; pulTaskStack[ i ] = pulSystemCallStack[ i ];
} }