mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-08 18:23:57 -06:00
Pull request
-----BEGIN PGP SIGNATURE----- iQEzBAABCAAdFiEEhpWov9P5fNqsNXdanKSrs4Grc8gFAl7zJJUACgkQnKSrs4Gr c8ix3Qf/ZpEKTCWJcZZuJPEI4CSgHZTsmDilkhnI/SoSBIK+6do+oBtCWrNdfP/m BpAZspaGsKUu5kJe6HGl4Rvmjd/sTg+9+F6UnQVrWccttwmJgr+y0r9uTMEgxgdm 2xeTzkzfwfxRLn4wb8k1kX/weQUcsbJUe2F9Nvm3HzeKGkaxWlYsRwqXAluC7gjx ZK0yHBz9JXKAreAfBRmNduLDElyzc6yYikY2gsJEOYTA7/h/ksmuNWYqNPRzWYGQ wRjAPyRMg+q+pZhoir5+6qgKLt6vNk5uQOjPaiLYhSMi7fiTIXrrVrO0dSx1Pkun 2vlb2WOF7nbj5T1veJQE29/onKPhzA== =IYfR -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/stefanha/tags/block-pull-request' into staging Pull request # gpg: Signature made Wed 24 Jun 2020 11:01:57 BST # gpg: using RSA key 8695A8BFD3F97CDAAC35775A9CA4ABB381AB73C8 # gpg: Good signature from "Stefan Hajnoczi <stefanha@redhat.com>" [full] # gpg: aka "Stefan Hajnoczi <stefanha@gmail.com>" [full] # Primary key fingerprint: 8695 A8BF D3F9 7CDA AC35 775A 9CA4 ABB3 81AB 73C8 * remotes/stefanha/tags/block-pull-request: block/nvme: support nested aio_poll() block/nvme: keep BDRVNVMeState pointer in NVMeQueuePair block/nvme: clarify that free_req_queue is protected by q->lock block/nvme: switch to a NVMeRequest freelist block/nvme: don't access CQE after moving cq.head block/nvme: drop tautologous assertion block/nvme: poll queues without q->lock check-block: enable iotests with SafeStack configure: add flags to support SafeStack coroutine: add check for SafeStack in sigaltstack coroutine: support SafeStack in ucontext backend minikconf: explicitly set encoding to UTF-8 Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
87fb952da8
8 changed files with 284 additions and 66 deletions
|
@ -30,6 +30,10 @@
|
|||
#include "qemu-common.h"
|
||||
#include "qemu/coroutine_int.h"
|
||||
|
||||
#ifdef CONFIG_SAFESTACK
|
||||
#error "SafeStack is not compatible with code run in alternate signal stacks"
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
Coroutine base;
|
||||
void *stack;
|
||||
|
|
|
@ -45,6 +45,11 @@ typedef struct {
|
|||
Coroutine base;
|
||||
void *stack;
|
||||
size_t stack_size;
|
||||
#ifdef CONFIG_SAFESTACK
|
||||
/* Need an unsafe stack for each coroutine */
|
||||
void *unsafe_stack;
|
||||
size_t unsafe_stack_size;
|
||||
#endif
|
||||
sigjmp_buf env;
|
||||
|
||||
void *tsan_co_fiber;
|
||||
|
@ -179,6 +184,10 @@ Coroutine *qemu_coroutine_new(void)
|
|||
co = g_malloc0(sizeof(*co));
|
||||
co->stack_size = COROUTINE_STACK_SIZE;
|
||||
co->stack = qemu_alloc_stack(&co->stack_size);
|
||||
#ifdef CONFIG_SAFESTACK
|
||||
co->unsafe_stack_size = COROUTINE_STACK_SIZE;
|
||||
co->unsafe_stack = qemu_alloc_stack(&co->unsafe_stack_size);
|
||||
#endif
|
||||
co->base.entry_arg = &old_env; /* stash away our jmp_buf */
|
||||
|
||||
uc.uc_link = &old_uc;
|
||||
|
@ -203,6 +212,22 @@ Coroutine *qemu_coroutine_new(void)
|
|||
COROUTINE_YIELD,
|
||||
&fake_stack_save,
|
||||
co->stack, co->stack_size, co->tsan_co_fiber);
|
||||
|
||||
#ifdef CONFIG_SAFESTACK
|
||||
/*
|
||||
* Before we swap the context, set the new unsafe stack
|
||||
* The unsafe stack grows just like the normal stack, so start from
|
||||
* the last usable location of the memory area.
|
||||
* NOTE: we don't have to re-set the usp afterwards because we are
|
||||
* coming back to this context through a siglongjmp.
|
||||
* The compiler already wrapped the corresponding sigsetjmp call with
|
||||
* code that saves the usp on the (safe) stack before the call, and
|
||||
* restores it right after (which is where we return with siglongjmp).
|
||||
*/
|
||||
void *usp = co->unsafe_stack + co->unsafe_stack_size;
|
||||
__safestack_unsafe_stack_ptr = usp;
|
||||
#endif
|
||||
|
||||
swapcontext(&old_uc, &uc);
|
||||
}
|
||||
|
||||
|
@ -235,6 +260,9 @@ void qemu_coroutine_delete(Coroutine *co_)
|
|||
#endif
|
||||
|
||||
qemu_free_stack(co->stack, co->stack_size);
|
||||
#ifdef CONFIG_SAFESTACK
|
||||
qemu_free_stack(co->unsafe_stack, co->unsafe_stack_size);
|
||||
#endif
|
||||
g_free(co);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue