diff options
author | Warner Losh <imp@bsdimp.com> | 2022-01-08 21:15:11 -0700 |
---|---|---|
committer | Warner Losh <imp@bsdimp.com> | 2022-01-28 15:53:41 -0700 |
commit | 38be620c950dcf629ba3217c6a183fee0e790fa8 (patch) | |
tree | c8236c8c943177a25b5ae1fa97f24d47e9d5df9f /bsd-user | |
parent | 377145478339917491a850643bb920548907d956 (diff) | |
download | qemu-38be620c950dcf629ba3217c6a183fee0e790fa8.zip qemu-38be620c950dcf629ba3217c6a183fee0e790fa8.tar.gz qemu-38be620c950dcf629ba3217c6a183fee0e790fa8.tar.bz2 |
bsd-user/signal.c: Fill in queue_signal
Fill in queue signal implementation, as well as routines allocate and
delete elements of the signal queue.
Signed-off-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Kyle Evans <kevans@freebsd.org>
Signed-off-by: Warner Losh <imp@bsdimp.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Diffstat (limited to 'bsd-user')
-rw-r--r-- | bsd-user/qemu.h | 5 | ||||
-rw-r--r-- | bsd-user/signal.c | 13 |
2 files changed, 17 insertions, 1 deletions
diff --git a/bsd-user/qemu.h b/bsd-user/qemu.h index a796477..1648a50 100644 --- a/bsd-user/qemu.h +++ b/bsd-user/qemu.h @@ -85,6 +85,11 @@ typedef struct TaskState { struct bsd_binprm *bprm; struct image_info *info; + struct emulated_sigtable sync_signal; + /* + * TODO: Since we block all signals while returning to the main CPU + * loop, this needn't be an array + */ struct emulated_sigtable sigtab[TARGET_NSIG]; /* * Nonzero if process_pending_signals() needs to do something (either diff --git a/bsd-user/signal.c b/bsd-user/signal.c index ccda7ad..34663f7 100644 --- a/bsd-user/signal.c +++ b/bsd-user/signal.c @@ -255,7 +255,18 @@ static void QEMU_NORETURN dump_core_and_abort(int target_sig) void queue_signal(CPUArchState *env, int sig, int si_type, target_siginfo_t *info) { - qemu_log_mask(LOG_UNIMP, "No signal queueing, dropping signal %d\n", sig); + CPUState *cpu = env_cpu(env); + TaskState *ts = cpu->opaque; + + trace_user_queue_signal(env, sig); + + info->si_code = deposit32(info->si_code, 24, 8, si_type); + + ts->sync_signal.info = *info; + ts->sync_signal.pending = sig; + /* Signal that a new signal is pending. */ + qatomic_set(&ts->signal_pending, 1); + return; } static int fatal_signal(int sig) |