From 342fe19842c6d49fb0e71a27eef2cc74756d94ac Mon Sep 17 00:00:00 2001 From: Kinsey Moore Date: Fri, 12 Mar 2021 09:57:59 -0600 Subject: 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. --- .../score/cpu/aarch64/aarch64-context-validate.S | 29 ++++++++++++++-------- 1 file changed, 18 insertions(+), 11 deletions(-) (limited to 'cpukit') 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 #include +#include +/* 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 -- cgit v1.2.3