mirror of
https://github.com/zephyrproject-rtos/zephyr
synced 2025-09-02 00:21:55 +00:00
This patch reworks the current ARM __swap() function into a C function. Due to some issues with using svc calls withing fault handlers, we needed to change the way we initiate a swap by removing the dependence on svc #0. Before __swap() is called, the system has already done an irq_lock(). Upon return from __swap(), the equivalent of an irq_lock() is done due to restoration of the key value from the irq_lock preceeding the call. For ARM V6M (M0/M0+), the pendsv bit is toggled and the irqs are enabled. There is no priority masking in v6m, so it's just a global enable. For ARM V7M, the priority mask has to be set to 0x0 to allow for the pendsv IRQ to be taken. This is done for both via a call to irq_unlock(0). After this unlock, a pendsv irq will be taken, either at the tail end of the current irq handling if we are in handler mode, or immediately due to the pendsv being asserted (no other outstanding irqs). The next thread will be scheduled. Upon return from the context switch to the original thread, the priority mask will already be correct due to the pendsv processing. Signed-off-by: Andy Gross <andy.gross@linaro.org> |
||
---|---|---|
.. | ||
arc | ||
arm | ||
common | ||
nios2 | ||
posix | ||
riscv32 | ||
x86 | ||
xtensa | ||
CMakeLists.txt | ||
Kconfig |