[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3 37/40] bsd-user/signal.c: do_sigaltstack
|
From: |
Warner Losh |
|
Subject: |
[PATCH v3 37/40] bsd-user/signal.c: do_sigaltstack |
|
Date: |
Fri, 28 Jan 2022 16:28:02 -0700 |
Implement the meat of the sigaltstack(2) system call with do_sigaltstack.
With that, all the stubbed out routines are complete, so remove
now-incorrect comment.
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>
---
bsd-user/signal.c | 72 +++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 67 insertions(+), 5 deletions(-)
diff --git a/bsd-user/signal.c b/bsd-user/signal.c
index 24074d629e2..65687fbe7dc 100644
--- a/bsd-user/signal.c
+++ b/bsd-user/signal.c
@@ -25,11 +25,6 @@
#include "hw/core/tcg-cpu-ops.h"
#include "host-signal.h"
-/*
- * Stubbed out routines until we merge signal support from bsd-user
- * fork.
- */
-
static struct target_sigaction sigact_table[TARGET_NSIG];
static void host_signal_handler(int host_sig, siginfo_t *info, void *puc);
static void target_to_host_sigset_internal(sigset_t *d,
@@ -573,6 +568,73 @@ static void host_signal_handler(int host_sig, siginfo_t
*info, void *puc)
cpu_exit(thread_cpu);
}
+/* do_sigaltstack() returns target values and errnos. */
+/* compare to kern/kern_sig.c sys_sigaltstack() and kern_sigaltstack() */
+abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong uoss_addr, abi_ulong sp)
+{
+ TaskState *ts = (TaskState *)thread_cpu->opaque;
+ int ret;
+ target_stack_t oss;
+
+ if (uoss_addr) {
+ /* Save current signal stack params */
+ oss.ss_sp = tswapl(ts->sigaltstack_used.ss_sp);
+ oss.ss_size = tswapl(ts->sigaltstack_used.ss_size);
+ oss.ss_flags = tswapl(sas_ss_flags(ts, sp));
+ }
+
+ if (uss_addr) {
+ target_stack_t *uss;
+ target_stack_t ss;
+ size_t minstacksize = TARGET_MINSIGSTKSZ;
+
+ ret = -TARGET_EFAULT;
+ if (!lock_user_struct(VERIFY_READ, uss, uss_addr, 1)) {
+ goto out;
+ }
+ __get_user(ss.ss_sp, &uss->ss_sp);
+ __get_user(ss.ss_size, &uss->ss_size);
+ __get_user(ss.ss_flags, &uss->ss_flags);
+ unlock_user_struct(uss, uss_addr, 0);
+
+ ret = -TARGET_EPERM;
+ if (on_sig_stack(ts, sp)) {
+ goto out;
+ }
+
+ ret = -TARGET_EINVAL;
+ if (ss.ss_flags != TARGET_SS_DISABLE
+ && ss.ss_flags != TARGET_SS_ONSTACK
+ && ss.ss_flags != 0) {
+ goto out;
+ }
+
+ if (ss.ss_flags == TARGET_SS_DISABLE) {
+ ss.ss_size = 0;
+ ss.ss_sp = 0;
+ } else {
+ ret = -TARGET_ENOMEM;
+ if (ss.ss_size < minstacksize) {
+ goto out;
+ }
+ }
+
+ ts->sigaltstack_used.ss_sp = ss.ss_sp;
+ ts->sigaltstack_used.ss_size = ss.ss_size;
+ }
+
+ if (uoss_addr) {
+ ret = -TARGET_EFAULT;
+ if (copy_to_user(uoss_addr, &oss, sizeof(oss))) {
+ goto out;
+ }
+ }
+
+ ret = 0;
+out:
+ return ret;
+}
+
/* do_sigaction() return host values and errnos */
int do_sigaction(int sig, const struct target_sigaction *act,
struct target_sigaction *oact)
--
2.33.1
- [PATCH v3 24/40] bsd-user/signal.c: host_to_target_siginfo_noswap, (continued)
- [PATCH v3 24/40] bsd-user/signal.c: host_to_target_siginfo_noswap, Warner Losh, 2022/01/28
- [PATCH v3 25/40] bsd-user/signal.c: Implement rewind_if_in_safe_syscall, Warner Losh, 2022/01/28
- [PATCH v3 17/40] bsd-user/signal.c: Implement signal_init(), Warner Losh, 2022/01/28
- [PATCH v3 22/40] bsd-user: Add host signals to the build, Warner Losh, 2022/01/28
- [PATCH v3 23/40] bsd-user: Add trace events for bsd-user, Warner Losh, 2022/01/28
- [PATCH v3 28/40] bsd-user/signal.c: Implement dump_core_and_abort, Warner Losh, 2022/01/28
- [PATCH v3 32/40] bsd-user/signal.c: handle_pending_signal, Warner Losh, 2022/01/28
- [PATCH v3 40/40] bsd-user/freebsd/target_os_ucontext.h: Prefer env as arg name for CPUArchState args, Warner Losh, 2022/01/28
- [PATCH v3 39/40] bsd-user: Rename arg name for target_cpu_reset to env, Warner Losh, 2022/01/28
- [PATCH v3 30/40] bsd-user/signal.c: sigset manipulation routines., Warner Losh, 2022/01/28
- [PATCH v3 37/40] bsd-user/signal.c: do_sigaltstack,
Warner Losh <=
- [PATCH v3 19/40] bsd-user/host/arm/host-signal.h: Implement host_signal_*, Warner Losh, 2022/01/28
- [PATCH v3 29/40] bsd-user/signal.c: Fill in queue_signal, Warner Losh, 2022/01/28
- [PATCH v3 31/40] bsd-user/signal.c: setup_frame, Warner Losh, 2022/01/28
- [PATCH v3 27/40] bsd-user/strace.c: print_taken_signal, Warner Losh, 2022/01/28
- [PATCH v3 33/40] bsd-user/signal.c: tswap_siginfo, Warner Losh, 2022/01/28
- [PATCH v3 34/40] bsd-user/signal.c: process_pending_signals, Warner Losh, 2022/01/28
- [PATCH v3 38/40] MAINTAINERS: Add tests/vm/*bsd to the list to get reviews on, Warner Losh, 2022/01/28