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>
diff --git a/.github/scripts/kernel_checker.py b/.github/scripts/kernel_checker.py
index 2282570..3e770fe 100755
--- a/.github/scripts/kernel_checker.py
+++ b/.github/scripts/kernel_checker.py
@@ -114,6 +114,10 @@
r'.*portable/.*/ARM_CM35*',
r'.*portable/.*/ARM_CM55*',
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 = [
@@ -150,8 +154,8 @@
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\.( \*\/)?$)|" + \
- r"(^(;|#)?( *(\/\*|\*|#|\/\/))? Copyright 20\d\d Arm Limited and/or its affiliates( \*\/)?$)|" + \
- r"(^(;|#)?( *(\/\*|\*|#|\/\/))? <open-source-office@arm.com>( \*\/)?$)"
+ 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>( \*\/)?$)"
class KernelHeaderChecker(HeaderChecker):
diff --git a/portable/ARMv8M/non_secure/port.c b/portable/ARMv8M/non_secure/port.c
index a7fb054..76d2b24 100644
--- a/portable/ARMv8M/non_secure/port.c
+++ b/portable/ARMv8M/non_secure/port.c
@@ -1,7 +1,7 @@
/*
* FreeRTOS Kernel <DEVELOPMENT BRANCH>
* 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>
*
* SPDX-License-Identifier: MIT
@@ -1200,7 +1200,7 @@
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1236,12 +1236,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1251,20 +1255,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */
- pulSystemCallStack = pulSystemCallStack - ulStackFrameSize;
+ pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulSystemCallStack[ i ] = pulTaskStack[ i ];
}
@@ -1300,7 +1304,7 @@
/* Remember the location where we should copy the stack frame when we exit from
* the system call. */
- pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize;
+ pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */
@@ -1350,7 +1354,7 @@
extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1382,12 +1386,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1397,20 +1405,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */
- pulTaskStack = pulTaskStack - ulStackFrameSize;
+ pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulTaskStack[ i ] = pulSystemCallStack[ i ];
}
diff --git a/portable/GCC/ARM_CM0/port.c b/portable/GCC/ARM_CM0/port.c
index c3053c5..fd3229a 100644
--- a/portable/GCC/ARM_CM0/port.c
+++ b/portable/GCC/ARM_CM0/port.c
@@ -1,6 +1,8 @@
/*
* FreeRTOS Kernel <DEVELOPMENT BRANCH>
* 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
*
@@ -915,7 +917,10 @@
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack;
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 )
@@ -955,10 +960,10 @@
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
/* Make space on the system call stack for the stack frame. */
- pulSystemCallStack = pulSystemCallStack - ulStackFrameSize;
+ pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulSystemCallStack[ i ] = pulTaskStack[ i ];
}
@@ -981,7 +986,7 @@
/* Remember the location where we should copy the stack frame when we exit from
* the system call. */
- pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize;
+ pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */
@@ -1036,7 +1041,10 @@
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack;
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 )
@@ -1072,10 +1080,10 @@
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
/* Make space on the task stack for the stack frame. */
- pulTaskStack = pulTaskStack - ulStackFrameSize;
+ pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulTaskStack[ i ] = pulSystemCallStack[ i ];
}
diff --git a/portable/GCC/ARM_CM23/non_secure/port.c b/portable/GCC/ARM_CM23/non_secure/port.c
index a7fb054..76d2b24 100644
--- a/portable/GCC/ARM_CM23/non_secure/port.c
+++ b/portable/GCC/ARM_CM23/non_secure/port.c
@@ -1,7 +1,7 @@
/*
* FreeRTOS Kernel <DEVELOPMENT BRANCH>
* 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>
*
* SPDX-License-Identifier: MIT
@@ -1200,7 +1200,7 @@
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1236,12 +1236,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1251,20 +1255,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */
- pulSystemCallStack = pulSystemCallStack - ulStackFrameSize;
+ pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulSystemCallStack[ i ] = pulTaskStack[ i ];
}
@@ -1300,7 +1304,7 @@
/* Remember the location where we should copy the stack frame when we exit from
* the system call. */
- pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize;
+ pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */
@@ -1350,7 +1354,7 @@
extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1382,12 +1386,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1397,20 +1405,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */
- pulTaskStack = pulTaskStack - ulStackFrameSize;
+ pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulTaskStack[ i ] = pulSystemCallStack[ i ];
}
diff --git a/portable/GCC/ARM_CM23_NTZ/non_secure/port.c b/portable/GCC/ARM_CM23_NTZ/non_secure/port.c
index a7fb054..76d2b24 100644
--- a/portable/GCC/ARM_CM23_NTZ/non_secure/port.c
+++ b/portable/GCC/ARM_CM23_NTZ/non_secure/port.c
@@ -1,7 +1,7 @@
/*
* FreeRTOS Kernel <DEVELOPMENT BRANCH>
* 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>
*
* SPDX-License-Identifier: MIT
@@ -1200,7 +1200,7 @@
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1236,12 +1236,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1251,20 +1255,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */
- pulSystemCallStack = pulSystemCallStack - ulStackFrameSize;
+ pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulSystemCallStack[ i ] = pulTaskStack[ i ];
}
@@ -1300,7 +1304,7 @@
/* Remember the location where we should copy the stack frame when we exit from
* the system call. */
- pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize;
+ pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */
@@ -1350,7 +1354,7 @@
extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1382,12 +1386,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1397,20 +1405,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */
- pulTaskStack = pulTaskStack - ulStackFrameSize;
+ pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulTaskStack[ i ] = pulSystemCallStack[ i ];
}
diff --git a/portable/GCC/ARM_CM33/non_secure/port.c b/portable/GCC/ARM_CM33/non_secure/port.c
index a7fb054..76d2b24 100644
--- a/portable/GCC/ARM_CM33/non_secure/port.c
+++ b/portable/GCC/ARM_CM33/non_secure/port.c
@@ -1,7 +1,7 @@
/*
* FreeRTOS Kernel <DEVELOPMENT BRANCH>
* 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>
*
* SPDX-License-Identifier: MIT
@@ -1200,7 +1200,7 @@
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1236,12 +1236,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1251,20 +1255,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */
- pulSystemCallStack = pulSystemCallStack - ulStackFrameSize;
+ pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulSystemCallStack[ i ] = pulTaskStack[ i ];
}
@@ -1300,7 +1304,7 @@
/* Remember the location where we should copy the stack frame when we exit from
* the system call. */
- pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize;
+ pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */
@@ -1350,7 +1354,7 @@
extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1382,12 +1386,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1397,20 +1405,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */
- pulTaskStack = pulTaskStack - ulStackFrameSize;
+ pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulTaskStack[ i ] = pulSystemCallStack[ i ];
}
diff --git a/portable/GCC/ARM_CM33_NTZ/non_secure/port.c b/portable/GCC/ARM_CM33_NTZ/non_secure/port.c
index a7fb054..76d2b24 100644
--- a/portable/GCC/ARM_CM33_NTZ/non_secure/port.c
+++ b/portable/GCC/ARM_CM33_NTZ/non_secure/port.c
@@ -1,7 +1,7 @@
/*
* FreeRTOS Kernel <DEVELOPMENT BRANCH>
* 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>
*
* SPDX-License-Identifier: MIT
@@ -1200,7 +1200,7 @@
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1236,12 +1236,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1251,20 +1255,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */
- pulSystemCallStack = pulSystemCallStack - ulStackFrameSize;
+ pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulSystemCallStack[ i ] = pulTaskStack[ i ];
}
@@ -1300,7 +1304,7 @@
/* Remember the location where we should copy the stack frame when we exit from
* the system call. */
- pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize;
+ pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */
@@ -1350,7 +1354,7 @@
extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1382,12 +1386,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1397,20 +1405,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */
- pulTaskStack = pulTaskStack - ulStackFrameSize;
+ pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulTaskStack[ i ] = pulSystemCallStack[ i ];
}
diff --git a/portable/GCC/ARM_CM35P/non_secure/port.c b/portable/GCC/ARM_CM35P/non_secure/port.c
index a7fb054..76d2b24 100644
--- a/portable/GCC/ARM_CM35P/non_secure/port.c
+++ b/portable/GCC/ARM_CM35P/non_secure/port.c
@@ -1,7 +1,7 @@
/*
* FreeRTOS Kernel <DEVELOPMENT BRANCH>
* 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>
*
* SPDX-License-Identifier: MIT
@@ -1200,7 +1200,7 @@
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1236,12 +1236,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1251,20 +1255,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */
- pulSystemCallStack = pulSystemCallStack - ulStackFrameSize;
+ pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulSystemCallStack[ i ] = pulTaskStack[ i ];
}
@@ -1300,7 +1304,7 @@
/* Remember the location where we should copy the stack frame when we exit from
* the system call. */
- pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize;
+ pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */
@@ -1350,7 +1354,7 @@
extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1382,12 +1386,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1397,20 +1405,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */
- pulTaskStack = pulTaskStack - ulStackFrameSize;
+ pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulTaskStack[ i ] = pulSystemCallStack[ i ];
}
diff --git a/portable/GCC/ARM_CM35P_NTZ/non_secure/port.c b/portable/GCC/ARM_CM35P_NTZ/non_secure/port.c
index a7fb054..76d2b24 100644
--- a/portable/GCC/ARM_CM35P_NTZ/non_secure/port.c
+++ b/portable/GCC/ARM_CM35P_NTZ/non_secure/port.c
@@ -1,7 +1,7 @@
/*
* FreeRTOS Kernel <DEVELOPMENT BRANCH>
* 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>
*
* SPDX-License-Identifier: MIT
@@ -1200,7 +1200,7 @@
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1236,12 +1236,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1251,20 +1255,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */
- pulSystemCallStack = pulSystemCallStack - ulStackFrameSize;
+ pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulSystemCallStack[ i ] = pulTaskStack[ i ];
}
@@ -1300,7 +1304,7 @@
/* Remember the location where we should copy the stack frame when we exit from
* the system call. */
- pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize;
+ pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */
@@ -1350,7 +1354,7 @@
extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1382,12 +1386,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1397,20 +1405,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */
- pulTaskStack = pulTaskStack - ulStackFrameSize;
+ pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulTaskStack[ i ] = pulSystemCallStack[ i ];
}
diff --git a/portable/GCC/ARM_CM3_MPU/port.c b/portable/GCC/ARM_CM3_MPU/port.c
index cc91c56..8c4dd78 100644
--- a/portable/GCC/ARM_CM3_MPU/port.c
+++ b/portable/GCC/ARM_CM3_MPU/port.c
@@ -1,6 +1,8 @@
/*
* FreeRTOS Kernel <DEVELOPMENT BRANCH>
* 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
*
@@ -484,7 +486,10 @@
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack;
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 )
/* Declaration when these variable are defined in code instead of being
@@ -520,10 +525,10 @@
pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;
/* Make space on the system call stack for the stack frame. */
- pulSystemCallStack = pulSystemCallStack - ulStackFrameSize;
+ pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulSystemCallStack[ i ] = pulTaskStack[ i ];
}
@@ -541,7 +546,7 @@
/* Remember the location where we should copy the stack frame when we exit from
* 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.
* It contains the address of the caller of the System Call entry
@@ -594,7 +599,10 @@
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack;
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 )
/* Declaration when these variable are defined in code instead of being
@@ -626,10 +634,10 @@
pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;
/* Make space on the task stack for the stack frame. */
- pulTaskStack = pulTaskStack - ulStackFrameSize;
+ pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulTaskStack[ i ] = pulSystemCallStack[ i ];
}
diff --git a/portable/GCC/ARM_CM4_MPU/port.c b/portable/GCC/ARM_CM4_MPU/port.c
index d6a4931..79f5e76 100644
--- a/portable/GCC/ARM_CM4_MPU/port.c
+++ b/portable/GCC/ARM_CM4_MPU/port.c
@@ -1,6 +1,8 @@
/*
* FreeRTOS Kernel <DEVELOPMENT BRANCH>
* 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
*
@@ -518,7 +520,7 @@
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
/* Declaration when these variable are defined in code instead of being
@@ -553,10 +555,14 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -566,14 +572,14 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
/* Make space on the system call stack for the stack frame. */
- pulSystemCallStack = pulSystemCallStack - ulStackFrameSize;
+ pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulSystemCallStack[ i ] = pulTaskStack[ i ];
}
@@ -591,7 +597,7 @@
/* Remember the location where we should copy the stack frame when we exit from
* 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.
* It contains the address of the caller of the System Call entry
@@ -644,7 +650,7 @@
extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
/* Declaration when these variable are defined in code instead of being
@@ -675,10 +681,14 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -688,14 +698,14 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
/* Make space on the task stack for the stack frame. */
- pulTaskStack = pulTaskStack - ulStackFrameSize;
+ pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulTaskStack[ i ] = pulSystemCallStack[ i ];
}
diff --git a/portable/GCC/ARM_CM55/non_secure/port.c b/portable/GCC/ARM_CM55/non_secure/port.c
index a7fb054..76d2b24 100644
--- a/portable/GCC/ARM_CM55/non_secure/port.c
+++ b/portable/GCC/ARM_CM55/non_secure/port.c
@@ -1,7 +1,7 @@
/*
* FreeRTOS Kernel <DEVELOPMENT BRANCH>
* 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>
*
* SPDX-License-Identifier: MIT
@@ -1200,7 +1200,7 @@
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1236,12 +1236,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1251,20 +1255,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */
- pulSystemCallStack = pulSystemCallStack - ulStackFrameSize;
+ pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulSystemCallStack[ i ] = pulTaskStack[ i ];
}
@@ -1300,7 +1304,7 @@
/* Remember the location where we should copy the stack frame when we exit from
* the system call. */
- pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize;
+ pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */
@@ -1350,7 +1354,7 @@
extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1382,12 +1386,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1397,20 +1405,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */
- pulTaskStack = pulTaskStack - ulStackFrameSize;
+ pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulTaskStack[ i ] = pulSystemCallStack[ i ];
}
diff --git a/portable/GCC/ARM_CM55_NTZ/non_secure/port.c b/portable/GCC/ARM_CM55_NTZ/non_secure/port.c
index a7fb054..76d2b24 100644
--- a/portable/GCC/ARM_CM55_NTZ/non_secure/port.c
+++ b/portable/GCC/ARM_CM55_NTZ/non_secure/port.c
@@ -1,7 +1,7 @@
/*
* FreeRTOS Kernel <DEVELOPMENT BRANCH>
* 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>
*
* SPDX-License-Identifier: MIT
@@ -1200,7 +1200,7 @@
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1236,12 +1236,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1251,20 +1255,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */
- pulSystemCallStack = pulSystemCallStack - ulStackFrameSize;
+ pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulSystemCallStack[ i ] = pulTaskStack[ i ];
}
@@ -1300,7 +1304,7 @@
/* Remember the location where we should copy the stack frame when we exit from
* the system call. */
- pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize;
+ pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */
@@ -1350,7 +1354,7 @@
extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1382,12 +1386,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1397,20 +1405,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */
- pulTaskStack = pulTaskStack - ulStackFrameSize;
+ pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulTaskStack[ i ] = pulSystemCallStack[ i ];
}
diff --git a/portable/GCC/ARM_CM85/non_secure/port.c b/portable/GCC/ARM_CM85/non_secure/port.c
index a7fb054..76d2b24 100644
--- a/portable/GCC/ARM_CM85/non_secure/port.c
+++ b/portable/GCC/ARM_CM85/non_secure/port.c
@@ -1,7 +1,7 @@
/*
* FreeRTOS Kernel <DEVELOPMENT BRANCH>
* 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>
*
* SPDX-License-Identifier: MIT
@@ -1200,7 +1200,7 @@
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1236,12 +1236,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1251,20 +1255,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */
- pulSystemCallStack = pulSystemCallStack - ulStackFrameSize;
+ pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulSystemCallStack[ i ] = pulTaskStack[ i ];
}
@@ -1300,7 +1304,7 @@
/* Remember the location where we should copy the stack frame when we exit from
* the system call. */
- pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize;
+ pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */
@@ -1350,7 +1354,7 @@
extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1382,12 +1386,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1397,20 +1405,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */
- pulTaskStack = pulTaskStack - ulStackFrameSize;
+ pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulTaskStack[ i ] = pulSystemCallStack[ i ];
}
diff --git a/portable/GCC/ARM_CM85_NTZ/non_secure/port.c b/portable/GCC/ARM_CM85_NTZ/non_secure/port.c
index a7fb054..76d2b24 100644
--- a/portable/GCC/ARM_CM85_NTZ/non_secure/port.c
+++ b/portable/GCC/ARM_CM85_NTZ/non_secure/port.c
@@ -1,7 +1,7 @@
/*
* FreeRTOS Kernel <DEVELOPMENT BRANCH>
* 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>
*
* SPDX-License-Identifier: MIT
@@ -1200,7 +1200,7 @@
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1236,12 +1236,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1251,20 +1255,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */
- pulSystemCallStack = pulSystemCallStack - ulStackFrameSize;
+ pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulSystemCallStack[ i ] = pulTaskStack[ i ];
}
@@ -1300,7 +1304,7 @@
/* Remember the location where we should copy the stack frame when we exit from
* the system call. */
- pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize;
+ pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */
@@ -1350,7 +1354,7 @@
extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1382,12 +1386,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1397,20 +1405,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */
- pulTaskStack = pulTaskStack - ulStackFrameSize;
+ pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulTaskStack[ i ] = pulSystemCallStack[ i ];
}
diff --git a/portable/IAR/ARM_CM23/non_secure/port.c b/portable/IAR/ARM_CM23/non_secure/port.c
index a7fb054..76d2b24 100644
--- a/portable/IAR/ARM_CM23/non_secure/port.c
+++ b/portable/IAR/ARM_CM23/non_secure/port.c
@@ -1,7 +1,7 @@
/*
* FreeRTOS Kernel <DEVELOPMENT BRANCH>
* 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>
*
* SPDX-License-Identifier: MIT
@@ -1200,7 +1200,7 @@
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1236,12 +1236,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1251,20 +1255,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */
- pulSystemCallStack = pulSystemCallStack - ulStackFrameSize;
+ pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulSystemCallStack[ i ] = pulTaskStack[ i ];
}
@@ -1300,7 +1304,7 @@
/* Remember the location where we should copy the stack frame when we exit from
* the system call. */
- pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize;
+ pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */
@@ -1350,7 +1354,7 @@
extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1382,12 +1386,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1397,20 +1405,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */
- pulTaskStack = pulTaskStack - ulStackFrameSize;
+ pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulTaskStack[ i ] = pulSystemCallStack[ i ];
}
diff --git a/portable/IAR/ARM_CM23_NTZ/non_secure/port.c b/portable/IAR/ARM_CM23_NTZ/non_secure/port.c
index a7fb054..76d2b24 100644
--- a/portable/IAR/ARM_CM23_NTZ/non_secure/port.c
+++ b/portable/IAR/ARM_CM23_NTZ/non_secure/port.c
@@ -1,7 +1,7 @@
/*
* FreeRTOS Kernel <DEVELOPMENT BRANCH>
* 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>
*
* SPDX-License-Identifier: MIT
@@ -1200,7 +1200,7 @@
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1236,12 +1236,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1251,20 +1255,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */
- pulSystemCallStack = pulSystemCallStack - ulStackFrameSize;
+ pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulSystemCallStack[ i ] = pulTaskStack[ i ];
}
@@ -1300,7 +1304,7 @@
/* Remember the location where we should copy the stack frame when we exit from
* the system call. */
- pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize;
+ pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */
@@ -1350,7 +1354,7 @@
extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1382,12 +1386,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1397,20 +1405,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */
- pulTaskStack = pulTaskStack - ulStackFrameSize;
+ pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulTaskStack[ i ] = pulSystemCallStack[ i ];
}
diff --git a/portable/IAR/ARM_CM33/non_secure/port.c b/portable/IAR/ARM_CM33/non_secure/port.c
index a7fb054..76d2b24 100644
--- a/portable/IAR/ARM_CM33/non_secure/port.c
+++ b/portable/IAR/ARM_CM33/non_secure/port.c
@@ -1,7 +1,7 @@
/*
* FreeRTOS Kernel <DEVELOPMENT BRANCH>
* 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>
*
* SPDX-License-Identifier: MIT
@@ -1200,7 +1200,7 @@
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1236,12 +1236,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1251,20 +1255,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */
- pulSystemCallStack = pulSystemCallStack - ulStackFrameSize;
+ pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulSystemCallStack[ i ] = pulTaskStack[ i ];
}
@@ -1300,7 +1304,7 @@
/* Remember the location where we should copy the stack frame when we exit from
* the system call. */
- pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize;
+ pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */
@@ -1350,7 +1354,7 @@
extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1382,12 +1386,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1397,20 +1405,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */
- pulTaskStack = pulTaskStack - ulStackFrameSize;
+ pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulTaskStack[ i ] = pulSystemCallStack[ i ];
}
diff --git a/portable/IAR/ARM_CM33_NTZ/non_secure/port.c b/portable/IAR/ARM_CM33_NTZ/non_secure/port.c
index a7fb054..76d2b24 100644
--- a/portable/IAR/ARM_CM33_NTZ/non_secure/port.c
+++ b/portable/IAR/ARM_CM33_NTZ/non_secure/port.c
@@ -1,7 +1,7 @@
/*
* FreeRTOS Kernel <DEVELOPMENT BRANCH>
* 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>
*
* SPDX-License-Identifier: MIT
@@ -1200,7 +1200,7 @@
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1236,12 +1236,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1251,20 +1255,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */
- pulSystemCallStack = pulSystemCallStack - ulStackFrameSize;
+ pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulSystemCallStack[ i ] = pulTaskStack[ i ];
}
@@ -1300,7 +1304,7 @@
/* Remember the location where we should copy the stack frame when we exit from
* the system call. */
- pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize;
+ pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */
@@ -1350,7 +1354,7 @@
extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1382,12 +1386,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1397,20 +1405,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */
- pulTaskStack = pulTaskStack - ulStackFrameSize;
+ pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulTaskStack[ i ] = pulSystemCallStack[ i ];
}
diff --git a/portable/IAR/ARM_CM35P/non_secure/port.c b/portable/IAR/ARM_CM35P/non_secure/port.c
index a7fb054..76d2b24 100644
--- a/portable/IAR/ARM_CM35P/non_secure/port.c
+++ b/portable/IAR/ARM_CM35P/non_secure/port.c
@@ -1,7 +1,7 @@
/*
* FreeRTOS Kernel <DEVELOPMENT BRANCH>
* 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>
*
* SPDX-License-Identifier: MIT
@@ -1200,7 +1200,7 @@
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1236,12 +1236,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1251,20 +1255,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */
- pulSystemCallStack = pulSystemCallStack - ulStackFrameSize;
+ pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulSystemCallStack[ i ] = pulTaskStack[ i ];
}
@@ -1300,7 +1304,7 @@
/* Remember the location where we should copy the stack frame when we exit from
* the system call. */
- pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize;
+ pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */
@@ -1350,7 +1354,7 @@
extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1382,12 +1386,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1397,20 +1405,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */
- pulTaskStack = pulTaskStack - ulStackFrameSize;
+ pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulTaskStack[ i ] = pulSystemCallStack[ i ];
}
diff --git a/portable/IAR/ARM_CM35P_NTZ/non_secure/port.c b/portable/IAR/ARM_CM35P_NTZ/non_secure/port.c
index a7fb054..76d2b24 100644
--- a/portable/IAR/ARM_CM35P_NTZ/non_secure/port.c
+++ b/portable/IAR/ARM_CM35P_NTZ/non_secure/port.c
@@ -1,7 +1,7 @@
/*
* FreeRTOS Kernel <DEVELOPMENT BRANCH>
* 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>
*
* SPDX-License-Identifier: MIT
@@ -1200,7 +1200,7 @@
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1236,12 +1236,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1251,20 +1255,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */
- pulSystemCallStack = pulSystemCallStack - ulStackFrameSize;
+ pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulSystemCallStack[ i ] = pulTaskStack[ i ];
}
@@ -1300,7 +1304,7 @@
/* Remember the location where we should copy the stack frame when we exit from
* the system call. */
- pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize;
+ pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */
@@ -1350,7 +1354,7 @@
extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1382,12 +1386,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1397,20 +1405,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */
- pulTaskStack = pulTaskStack - ulStackFrameSize;
+ pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulTaskStack[ i ] = pulSystemCallStack[ i ];
}
diff --git a/portable/IAR/ARM_CM4F_MPU/port.c b/portable/IAR/ARM_CM4F_MPU/port.c
index 66092df..720138f 100644
--- a/portable/IAR/ARM_CM4F_MPU/port.c
+++ b/portable/IAR/ARM_CM4F_MPU/port.c
@@ -1,6 +1,8 @@
/*
* FreeRTOS Kernel <DEVELOPMENT BRANCH>
* 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
*
@@ -459,7 +461,7 @@
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
/* Declaration when these variable are defined in code instead of being
@@ -494,10 +496,14 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -507,14 +513,14 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
/* Make space on the system call stack for the stack frame. */
- pulSystemCallStack = pulSystemCallStack - ulStackFrameSize;
+ pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulSystemCallStack[ i ] = pulTaskStack[ i ];
}
@@ -532,7 +538,7 @@
/* Remember the location where we should copy the stack frame when we exit from
* 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.
* It contains the address of the caller of the System Call entry
@@ -586,7 +592,7 @@
extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
/* Declaration when these variable are defined in code instead of being
@@ -617,10 +623,14 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -630,14 +640,14 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
/* Make space on the task stack for the stack frame. */
- pulTaskStack = pulTaskStack - ulStackFrameSize;
+ pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulTaskStack[ i ] = pulSystemCallStack[ i ];
}
diff --git a/portable/IAR/ARM_CM55/non_secure/port.c b/portable/IAR/ARM_CM55/non_secure/port.c
index a7fb054..76d2b24 100644
--- a/portable/IAR/ARM_CM55/non_secure/port.c
+++ b/portable/IAR/ARM_CM55/non_secure/port.c
@@ -1,7 +1,7 @@
/*
* FreeRTOS Kernel <DEVELOPMENT BRANCH>
* 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>
*
* SPDX-License-Identifier: MIT
@@ -1200,7 +1200,7 @@
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1236,12 +1236,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1251,20 +1255,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */
- pulSystemCallStack = pulSystemCallStack - ulStackFrameSize;
+ pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulSystemCallStack[ i ] = pulTaskStack[ i ];
}
@@ -1300,7 +1304,7 @@
/* Remember the location where we should copy the stack frame when we exit from
* the system call. */
- pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize;
+ pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */
@@ -1350,7 +1354,7 @@
extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1382,12 +1386,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1397,20 +1405,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */
- pulTaskStack = pulTaskStack - ulStackFrameSize;
+ pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulTaskStack[ i ] = pulSystemCallStack[ i ];
}
diff --git a/portable/IAR/ARM_CM55_NTZ/non_secure/port.c b/portable/IAR/ARM_CM55_NTZ/non_secure/port.c
index a7fb054..76d2b24 100644
--- a/portable/IAR/ARM_CM55_NTZ/non_secure/port.c
+++ b/portable/IAR/ARM_CM55_NTZ/non_secure/port.c
@@ -1,7 +1,7 @@
/*
* FreeRTOS Kernel <DEVELOPMENT BRANCH>
* 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>
*
* SPDX-License-Identifier: MIT
@@ -1200,7 +1200,7 @@
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1236,12 +1236,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1251,20 +1255,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */
- pulSystemCallStack = pulSystemCallStack - ulStackFrameSize;
+ pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulSystemCallStack[ i ] = pulTaskStack[ i ];
}
@@ -1300,7 +1304,7 @@
/* Remember the location where we should copy the stack frame when we exit from
* the system call. */
- pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize;
+ pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */
@@ -1350,7 +1354,7 @@
extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1382,12 +1386,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1397,20 +1405,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */
- pulTaskStack = pulTaskStack - ulStackFrameSize;
+ pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulTaskStack[ i ] = pulSystemCallStack[ i ];
}
diff --git a/portable/IAR/ARM_CM85/non_secure/port.c b/portable/IAR/ARM_CM85/non_secure/port.c
index a7fb054..76d2b24 100644
--- a/portable/IAR/ARM_CM85/non_secure/port.c
+++ b/portable/IAR/ARM_CM85/non_secure/port.c
@@ -1,7 +1,7 @@
/*
* FreeRTOS Kernel <DEVELOPMENT BRANCH>
* 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>
*
* SPDX-License-Identifier: MIT
@@ -1200,7 +1200,7 @@
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1236,12 +1236,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1251,20 +1255,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */
- pulSystemCallStack = pulSystemCallStack - ulStackFrameSize;
+ pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulSystemCallStack[ i ] = pulTaskStack[ i ];
}
@@ -1300,7 +1304,7 @@
/* Remember the location where we should copy the stack frame when we exit from
* the system call. */
- pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize;
+ pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */
@@ -1350,7 +1354,7 @@
extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1382,12 +1386,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1397,20 +1405,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */
- pulTaskStack = pulTaskStack - ulStackFrameSize;
+ pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulTaskStack[ i ] = pulSystemCallStack[ i ];
}
diff --git a/portable/IAR/ARM_CM85_NTZ/non_secure/port.c b/portable/IAR/ARM_CM85_NTZ/non_secure/port.c
index a7fb054..76d2b24 100644
--- a/portable/IAR/ARM_CM85_NTZ/non_secure/port.c
+++ b/portable/IAR/ARM_CM85_NTZ/non_secure/port.c
@@ -1,7 +1,7 @@
/*
* FreeRTOS Kernel <DEVELOPMENT BRANCH>
* 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>
*
* SPDX-License-Identifier: MIT
@@ -1200,7 +1200,7 @@
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulSystemCallStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1236,12 +1236,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1251,20 +1255,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the system call stack for the stack frame. */
- pulSystemCallStack = pulSystemCallStack - ulStackFrameSize;
+ pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulSystemCallStack[ i ] = pulTaskStack[ i ];
}
@@ -1300,7 +1304,7 @@
/* Remember the location where we should copy the stack frame when we exit from
* the system call. */
- pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize;
+ pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulHardwareSavedExceptionFrameSize;
/* Record if the hardware used padding to force the stack pointer
* to be double word aligned. */
@@ -1350,7 +1354,7 @@
extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings;
uint32_t * pulTaskStack;
- uint32_t ulStackFrameSize, ulSystemCallLocation, i;
+ uint32_t ulHardwareSavedExceptionFrameSize, ulSystemCallLocation, i;
#if defined( __ARMCC_VERSION )
@@ -1382,12 +1386,16 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )
{
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
__asm volatile (
" vpush {s0} \n" /* Trigger lazy stacking. */
" vpop {s0} \n" /* Nullify the affect of the above instruction. */
@@ -1397,20 +1405,20 @@
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
}
#else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */
{
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
#endif /* configENABLE_FPU || configENABLE_MVE */
/* Make space on the task stack for the stack frame. */
- pulTaskStack = pulTaskStack - ulStackFrameSize;
+ pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulTaskStack[ i ] = pulSystemCallStack[ i ];
}
diff --git a/portable/RVDS/ARM_CM4_MPU/port.c b/portable/RVDS/ARM_CM4_MPU/port.c
index 307ae6d..450b862 100644
--- a/portable/RVDS/ARM_CM4_MPU/port.c
+++ b/portable/RVDS/ARM_CM4_MPU/port.c
@@ -1,6 +1,8 @@
/*
* FreeRTOS Kernel <DEVELOPMENT BRANCH>
* 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
*
@@ -474,7 +476,7 @@
extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];
xMPU_SETTINGS * pxMpuSettings;
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_end__;
@@ -500,23 +502,27 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
prvTriggerLazyStacking();
}
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
/* Make space on the system call stack for the stack frame. */
- pulSystemCallStack = pulSystemCallStack - ulStackFrameSize;
+ pulSystemCallStack = pulSystemCallStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulSystemCallStack[ i ] = pulTaskStack[ i ];
}
@@ -537,7 +543,7 @@
/* Remember the location where we should copy the stack frame when we exit from
* 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.
* It contains the address of the caller of the System Call entry
@@ -592,7 +598,7 @@
extern TaskHandle_t pxCurrentTCB;
xMPU_SETTINGS * pxMpuSettings;
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_end__;
@@ -614,23 +620,27 @@
{
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 + S0–S15 + FPSCR + reserved word = 26 words.
+ */
if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )
{
/* Extended frame i.e. FPU in use. */
- ulStackFrameSize = 26;
+ ulHardwareSavedExceptionFrameSize = 26;
prvTriggerLazyStacking();
}
else
{
/* Standard frame i.e. FPU not in use. */
- ulStackFrameSize = 8;
+ ulHardwareSavedExceptionFrameSize = 8;
}
/* Make space on the task stack for the stack frame. */
- pulTaskStack = pulTaskStack - ulStackFrameSize;
+ pulTaskStack = pulTaskStack - ulHardwareSavedExceptionFrameSize;
/* Copy the stack frame. */
- for( i = 0; i < ulStackFrameSize; i++ )
+ for( i = 0; i < ulHardwareSavedExceptionFrameSize; i++ )
{
pulTaskStack[ i ] = pulSystemCallStack[ i ];
}