summaryrefslogtreecommitdiffstats
path: root/cpukit
diff options
context:
space:
mode:
authorKinsey Moore <kinsey.moore@oarcorp.com>2021-03-12 09:57:59 -0600
committerJoel Sherrill <joel@rtems.org>2021-05-26 16:08:25 -0500
commit342fe19842c6d49fb0e71a27eef2cc74756d94ac (patch)
treeb3276bfea199629f2f9e714f2549b41c016b4bfa /cpukit
parentde694b753ca11136adce7600d55642695c8ef39d (diff)
downloadrtems-342fe19842c6d49fb0e71a27eef2cc74756d94ac.tar.bz2
score/aarch64: Align context validation frame
Ensure the stack remains aligned by keeping the context frame at a multiple of 16 bytes. This avoids stack alignment exceptions which occur when the stack pointer is not 16 byte aligned.
Diffstat (limited to 'cpukit')
-rw-r--r--cpukit/score/cpu/aarch64/aarch64-context-validate.S29
1 files changed, 18 insertions, 11 deletions
diff --git a/cpukit/score/cpu/aarch64/aarch64-context-validate.S b/cpukit/score/cpu/aarch64/aarch64-context-validate.S
index 57f634934b..1e71bc5b3a 100644
--- a/cpukit/score/cpu/aarch64/aarch64-context-validate.S
+++ b/cpukit/score/cpu/aarch64/aarch64-context-validate.S
@@ -42,7 +42,9 @@
#include <rtems/asm.h>
#include <rtems/score/cpu.h>
+#include <rtems/score/basedefs.h>
+/* These must be 8 byte aligned to avoid misaligned accesses */
#define FRAME_OFFSET_X4 0x00
#define FRAME_OFFSET_X5 0x08
#define FRAME_OFFSET_X6 0x10
@@ -54,18 +56,23 @@
#define FRAME_OFFSET_LR 0x40
#ifdef AARCH64_MULTILIB_VFP
- #define FRAME_OFFSET_V8 0x48
- #define FRAME_OFFSET_V9 0x58
- #define FRAME_OFFSET_V10 0x68
- #define FRAME_OFFSET_V11 0x78
- #define FRAME_OFFSET_V12 0x88
- #define FRAME_OFFSET_V13 0x98
- #define FRAME_OFFSET_V14 0xA8
- #define FRAME_OFFSET_V15 0xB8
-
- #define FRAME_SIZE (FRAME_OFFSET_V15 + 0x10)
+ /* These must be 16 byte aligned to avoid misaligned accesses */
+ #define FRAME_OFFSET_V8 0x50
+ #define FRAME_OFFSET_V9 0x60
+ #define FRAME_OFFSET_V10 0x70
+ #define FRAME_OFFSET_V11 0x80
+ #define FRAME_OFFSET_V12 0x90
+ #define FRAME_OFFSET_V13 0xA0
+ #define FRAME_OFFSET_V14 0xB0
+ #define FRAME_OFFSET_V15 0xC0
+
+ /*
+ * Force 16 byte alignment of the frame size to avoid stack pointer alignment
+ * exceptions.
+ */
+ #define FRAME_SIZE RTEMS_ALIGN_UP( FRAME_OFFSET_V15, 16 )
#else
- #define FRAME_SIZE (FRAME_OFFSET_LR + 0x08)
+ #define FRAME_SIZE RTEMS_ALIGN_UP( FRAME_OFFSET_LR, 16 )
#endif
.section .text