altos: ARM ABI requires 8-byte aligned stack
authorKeith Packard <keithp@keithp.com>
Tue, 19 Mar 2019 00:15:16 +0000 (17:15 -0700)
committerKeith Packard <keithp@keithp.com>
Tue, 19 Mar 2019 00:15:16 +0000 (17:15 -0700)
This makes doubles on the stack (as for var-args functions) work

Signed-off-by: Keith Packard <keithp@keithp.com>
src/kernel/ao_task.h

index d27ef060384b375100930fd886d0fb7506326d3f..03b629693c0e44baa9ba61a24caa39edc6d61ff4 100644 (file)
 #define HAS_TASK_INFO 1
 #endif
 
 #define HAS_TASK_INFO 1
 #endif
 
-/* arm stacks must be 32-bit aligned */
+/* arm stacks must be 64-bit aligned */
 #ifndef AO_STACK_ALIGNMENT
 #ifdef __arm__
 #ifndef AO_STACK_ALIGNMENT
 #ifdef __arm__
-#define AO_STACK_ALIGNMENT __attribute__ ((aligned(4)))
+#define AO_STACK_ALIGNMENT __attribute__ ((aligned(8)))
 #else
 #define AO_STACK_ALIGNMENT
 #endif
 #else
 #define AO_STACK_ALIGNMENT
 #endif
@@ -50,11 +50,11 @@ struct ao_task {
        struct ao_list  queue;
        struct ao_list  alarm_queue;
 #endif
        struct ao_list  queue;
        struct ao_list  alarm_queue;
 #endif
-       /* Provide both 32-bit and 8-bit stacks, always 32-bit aligned */
+       /* Provide both 32-bit and 8-bit stacks */
        union {
                uint32_t stack32[AO_STACK_SIZE>>2];
                uint8_t stack8[AO_STACK_SIZE];
        union {
                uint32_t stack32[AO_STACK_SIZE>>2];
                uint8_t stack8[AO_STACK_SIZE];
-       };
+       } AO_STACK_ALIGNMENT;
 #if HAS_SAMPLE_PROFILE
        uint32_t ticks;
        uint32_t yields;
 #if HAS_SAMPLE_PROFILE
        uint32_t ticks;
        uint32_t yields;