xtensa/asm2: Fix stack pointer during preemption spills
When returning into a different thread than we interrupted, we obviously need to spill all the existing register windows to make sure all their values are in the old thread's stack. But the code to do this forgot to reset the current stack pointer to the value it had at interrupt time (it was still pointing to the saved context below that), so the caller of the interrupted function was spilling to the wrong spot. This wouldn't show up as an instant failure, it would only happen when switching BACK to the improperly-spilled thread. And even then it would be a noop if the original interrupt handler was deep enough to have spilled that function naturally. In practice, this happened only in some instances on ESP-32 (which has more windowed registers than qemu) when interrupting the idle thread (which is very shallow) with a (very simple) timer interrupt. Trivial to see, hard to find. See https://github.com/zephyrproject-rtos/zephyr/issues/6346 for more detail. Signed-off-by:Andy Ross <andrew.j.ross@intel.com>
Loading
Please sign in to comment