From 97de75f46fef724cdb03ede36fc44a1286b10311 Mon Sep 17 00:00:00 2001 From: Kaspar Schleiser Date: Tue, 5 Mar 2024 08:35:08 +0100 Subject: [PATCH] riot-rs-threads: cortex-m: ensure stacks are 8b aligned --- src/riot-rs-threads/src/arch/cortex_m.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/riot-rs-threads/src/arch/cortex_m.rs b/src/riot-rs-threads/src/arch/cortex_m.rs index b8d75e52e..a39096bc0 100644 --- a/src/riot-rs-threads/src/arch/cortex_m.rs +++ b/src/riot-rs-threads/src/arch/cortex_m.rs @@ -12,7 +12,13 @@ use crate::{cleanup, THREADS}; /// `func`. pub(crate) fn setup_stack(stack: &mut [u8], func: usize, arg: usize) -> usize { let stack_start = stack.as_ptr() as usize; - let stack_pos = ((stack_start + stack.len() - 36) & 0xFFFFFFFC) as *mut usize; + + // 1. The stack starts at the highest address and grows downwards. + // 2. A full stored context also contains R4-R11 and the stack pointer, + // thus an additional 36 bytes need to be reserved. + // 3. Cortex-M expects the SP to be 8 byte aligned, so we chop the lowest + // 7 bits by doing `& 0xFFFFFFF8`. + let stack_pos = ((stack_start + stack.len() - 36) & 0xFFFFFFF8) as *mut usize; unsafe { write_volatile(stack_pos.offset(0), arg); // -> R0