summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2013-10-07 21:53:53 -0700
committerKeith Packard <keithp@keithp.com>2013-10-07 21:53:53 -0700
commit8f7edcee2db30652ce0b147f282de3396c3786ad (patch)
tree4be74830f12ad85e82eb159d7a73dc4aa0bb181f
parent4254de22864de2ed7ae5928c6b8bfd9df1c8a3fb (diff)
altos/lpc, altos/stm: ARM requires ISB after switching stack pointers
This sticks a barrier in the CPU to prevent using the wrong stack register past the change. Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--src/lpc/ao_arch_funcs.h1
-rw-r--r--src/stm/ao_arch_funcs.h1
2 files changed, 2 insertions, 0 deletions
diff --git a/src/lpc/ao_arch_funcs.h b/src/lpc/ao_arch_funcs.h
index 9a3219a2..0891903e 100644
--- a/src/lpc/ao_arch_funcs.h
+++ b/src/lpc/ao_arch_funcs.h
@@ -235,6 +235,7 @@ static inline void ao_arch_start_scheduler(void) {
asm("mrs %0,control" : "=&r" (control));
control |= (1 << 1);
asm("msr control,%0" : : "r" (control));
+ asm("isb");
}
#endif /* _AO_ARCH_FUNCS_H_ */
diff --git a/src/stm/ao_arch_funcs.h b/src/stm/ao_arch_funcs.h
index 9bb2d7cd..4bcc1023 100644
--- a/src/stm/ao_arch_funcs.h
+++ b/src/stm/ao_arch_funcs.h
@@ -354,6 +354,7 @@ static inline void ao_arch_start_scheduler(void) {
asm("mrs %0,control" : "=&r" (control));
control |= (1 << 1);
asm("msr control,%0" : : "r" (control));
+ asm("isb");
}
#endif