summaryrefslogtreecommitdiffstats
path: root/bsd-user
diff options
context:
space:
mode:
authorWarner Losh2022-01-09 05:15:11 +0100
committerWarner Losh2022-01-28 23:53:41 +0100
commit38be620c950dcf629ba3217c6a183fee0e790fa8 (patch)
treec8236c8c943177a25b5ae1fa97f24d47e9d5df9f /bsd-user
parentbsd-user/signal.c: Implement dump_core_and_abort (diff)
downloadqemu-38be620c950dcf629ba3217c6a183fee0e790fa8.tar.gz
qemu-38be620c950dcf629ba3217c6a183fee0e790fa8.tar.xz
qemu-38be620c950dcf629ba3217c6a183fee0e790fa8.zip
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.h5
-rw-r--r--bsd-user/signal.c13
2 files changed, 17 insertions, 1 deletions
diff --git a/bsd-user/qemu.h b/bsd-user/qemu.h
index a7964776fd..1648a509b9 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 ccda7adbee..34663f7a28 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)