Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FreeRTOS/FreeRTOS-Kernel.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichardBarry <3073890+RichardBarry@users.noreply.github.com>2023-12-09 12:19:39 +0300
committerGitHub <noreply@github.com>2023-12-09 12:19:39 +0300
commit553caa18ced4906cf5060823ada7a10e73c7b535 (patch)
tree3dce009cf7187b71fa84dc0b5fe2a8370d6494a4
parenta79752a04a4334fc0b51d6555ebbb84f0ed71204 (diff)
Update the memory alignment within the Cortex-A9 port asm code (#426)
Update alignment in ARM_CA9 port.
-rw-r--r--portable/GCC/ARM_CA9/portASM.S19
1 files changed, 16 insertions, 3 deletions
diff --git a/portable/GCC/ARM_CA9/portASM.S b/portable/GCC/ARM_CA9/portASM.S
index 150cfabad..55baabbd3 100644
--- a/portable/GCC/ARM_CA9/portASM.S
+++ b/portable/GCC/ARM_CA9/portASM.S
@@ -75,9 +75,9 @@
/* Save the floating point context, if any. */
FMRXNE R1, FPSCR
+ PUSHNE {R1}
VPUSHNE {D0-D15}
VPUSHNE {D16-D31}
- PUSHNE {R1}
/* Save ulPortTaskHasFPUContext itself. */
PUSH {R3}
@@ -106,9 +106,9 @@
CMP R1, #0
/* Restore the floating point context, if any. */
- POPNE {R0}
VPOPNE {D16-D31}
VPOPNE {D0-D15}
+ POPNE {R0}
VMSRNE FPSCR, R0
/* Restore the critical section nesting depth. */
@@ -145,8 +145,15 @@
FreeRTOS_SWI_Handler:
/* Save the context of the current task and select a new task to run. */
portSAVE_CONTEXT
+
+ /* Ensure bit 2 of the stack pointer is clear. */
+ MOV r2, sp
+ AND r2, r2, #4
+ SUB sp, sp, r2
+
LDR R0, vTaskSwitchContextConst
BLX R0
+
portRESTORE_CONTEXT
@@ -256,7 +263,13 @@ switch_before_exit:
/* Call the function that selects the new task to execute.
vTaskSwitchContext() if vTaskSwitchContext() uses LDRD or STRD
instructions, or 8 byte aligned stack allocated data. LR does not need
- saving as a new LR will be loaded by portRESTORE_CONTEXT anyway. */
+ saving as a new LR will be loaded by portRESTORE_CONTEXT anyway.
+ Ensure bit 2 of the stack pointer is clear. r2 holds the bit 2 value for
+ future use. */
+ MOV r2, sp
+ AND r2, r2, #4
+ SUB sp, sp, r2
+
LDR R0, vTaskSwitchContextConst
BLX R0