coroutine: support SafeStack in ucontext backend
commit58ebc2c31337734a8a79b0566b31b19040deb2ea
authorDaniele Buono <dbuono@linux.vnet.ibm.com>
Fri, 29 May 2020 20:51:19 +0000 (29 16:51 -0400)
committerStefan Hajnoczi <stefanha@redhat.com>
Tue, 23 Jun 2020 14:46:05 +0000 (23 15:46 +0100)
tree0d085b3db59d811a055a23bea18537aa60da5d14
parentddd633e525fec68437d04b074130aedc9d461331
coroutine: support SafeStack in ucontext backend

LLVM's SafeStack instrumentation does not yet support programs that make
use of the APIs in ucontext.h
With the current implementation of coroutine-ucontext, the resulting
binary is incorrect, with different coroutines sharing the same unsafe
stack and producing undefined behavior at runtime.
This fix allocates an additional unsafe stack area for each coroutine,
and sets the new unsafe stack pointer before calling swapcontext() in
qemu_coroutine_new.
This is the only place where the pointer needs to be manually updated,
since sigsetjmp/siglongjmp are already instrumented by LLVM to properly
support SafeStack.
The additional stack is then freed in qemu_coroutine_delete.

Signed-off-by: Daniele Buono <dbuono@linux.vnet.ibm.com>
Message-id: 20200529205122.714-2-dbuono@linux.vnet.ibm.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
include/qemu/coroutine_int.h
util/coroutine-ucontext.c