The old strategy was to only do context switching
from within the PendSV handler. This worked fine
until now because all syscalls were handled either
atomically or just returned -EAGAIN if the
resource was locked or busy. However, with the
introduction of I/O wait, we need to be able to
sleep directly from within the kernel by moving
the context switching completely into the kernel.
It was inevitable, tbh. I really wanted to do
everything entirely from scratch, but all those
hardware registers are just too much to be
maintained by a single person. And since i plan
on supporting different boards at some point in
the future, it would be complete madness to redo
everything for that board.