From ebbaf7ee57a7c70067b8d1cc1d148cbdaf14762f Mon Sep 17 00:00:00 2001 From: Damien George Date: Mon, 20 Mar 2017 18:56:46 +1100 Subject: [PATCH] stmhal/pendsv: Disable interrupts during a thread switch. We can actually handle interrupts during a thread switch (because we always have a valid stack), but only if those interrupts don't access any of the thread state (because the state may not correspond to the stack pointer). So to be on the safe side we disable interrupts during the very short period of the thread state+stack switch. --- stmhal/pendsv.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/stmhal/pendsv.c b/stmhal/pendsv.c index 4c2a14de1b..200d13a5a9 100644 --- a/stmhal/pendsv.c +++ b/stmhal/pendsv.c @@ -106,11 +106,14 @@ void pendsv_isr_handler(void) { ".no_obj:\n" // pendsv_object==NULL "push {r4-r11, lr}\n" "vpush {s16-s31}\n" + "mrs r5, primask\n" // save PRIMASK in r5 + "cpsid i\n" // disable interrupts while we change stacks "mov r0, sp\n" // pass sp to save "mov r4, lr\n" // save lr because we are making a call "bl pyb_thread_next\n" // get next thread to execute "mov lr, r4\n" // restore lr "mov sp, r0\n" // switch stacks + "msr primask, r5\n" // reenable interrupts "vpop {s16-s31}\n" "pop {r4-r11, lr}\n" "bx lr\n" // return from interrupt; will return to new thread