static inline void ao_arch_restore_stack(void) {
uint32_t sp;
+ uint32_t control;
+
+ asm("mrs %0,control" : "=&r" (control));
+ control |= (1 << 1);
+ asm("msr control,%0" : : "r" (control));
+ asm("isb");
+
sp = (uint32_t) ao_cur_task->sp;
/* Switch stacks */
#define HAS_SAMPLE_PROFILE 0
#endif
+#if DEBUG
+#define HAS_ARCH_VALIDATE_CUR_STACK 1
+
+static inline void
+ao_validate_cur_stack(void)
+{
+ uint8_t *psp;
+
+ asm("mrs %0,psp" : "=&r" (psp));
+ if (ao_cur_task &&
+ psp <= ao_cur_task->stack &&
+ psp >= ao_cur_task->stack - 256)
+ ao_panic(AO_PANIC_STACK);
+}
+#endif
+
#if !HAS_SAMPLE_PROFILE
#define HAS_ARCH_START_SCHEDULER 1
}
#endif
-#define ao_arch_isr_stack()
+static inline void ao_arch_isr_stack(void) {
+ uint32_t control;
+
+ asm("mrs %0,control" : "=&r" (control));
+ control &= ~(1 << 1);
+ asm("msr control,%0" : : "r" (control));
+ asm("isb");
+}
#endif