https://www.cs.princeton.edu/courses/archive/spr16/cos217/lectures/15_AssemblyFunctions.pdf
https://en.wikipedia.org/wiki/X86_calling_conventions
setjump+longjump:
https://danielmangum.com/posts/non-local-jumps-riscv/
use setjump+longjump impl c++ exception:
https://www.youtube.com/watch?v=XpRL7exdFL8&ab_channel=C%2FC%2B%2BDublinUserGroup
use setjump & longjump, rather than calling:
>>>The scheduler must be switched to instead of called because on
the multiprocessor it's not safe for it to use the calling process's
stack. If the scheduler used the calling process's stack, the
following bad sequence of events could happen:
process goes to sleep, calls suspend
sched runs, using process's stack
process becomes runnable, but another engine starts running it
current engine stays in sched looking for a process to run
Result: ==> two engines running on the same stack ???