aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2023-05-16 01:42:35 +0200
committerDario Nieuwenhuis <[email protected]>2023-05-16 01:42:35 +0200
commit56c3a949af87a6179eee655c19c89144604d17a2 (patch)
treec3d4803c043d56077735db61476edc833c4e6e96
parent0c18a13cc056d4d54ca7261289615b2d03769a76 (diff)
rp/multicore: ensure stack is 8-byte aligned.
-rw-r--r--embassy-rp/src/multicore.rs7
1 files changed, 6 insertions, 1 deletions
diff --git a/embassy-rp/src/multicore.rs b/embassy-rp/src/multicore.rs
index 9a445c26e..bbc775105 100644
--- a/embassy-rp/src/multicore.rs
+++ b/embassy-rp/src/multicore.rs
@@ -153,7 +153,12 @@ where
153 psm.frce_off().modify(|w| w.set_proc1(false)); 153 psm.frce_off().modify(|w| w.set_proc1(false));
154 } 154 }
155 155
156 let mem = unsafe { core::slice::from_raw_parts_mut(stack.mem.as_mut_ptr() as *mut usize, stack.mem.len() / 4) }; 156 // The ARM AAPCS ABI requires 8-byte stack alignment.
157 // #[align] on `struct Stack` ensures the bottom is aligned, but the top could still be
158 // unaligned if the user chooses a stack size that's not multiple of 8.
159 // So, we round down to the next multiple of 8.
160 let stack_words = stack.mem.len() / 8 * 2;
161 let mem = unsafe { core::slice::from_raw_parts_mut(stack.mem.as_mut_ptr() as *mut usize, stack_words) };
157 162
158 // Set up the stack 163 // Set up the stack
159 let mut stack_ptr = unsafe { mem.as_mut_ptr().add(mem.len()) }; 164 let mut stack_ptr = unsafe { mem.as_mut_ptr().add(mem.len()) };