From: Warner Losh <imp@bsdimp.com>
To: qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
Stacey Son <sson@FreeBSD.org>, Kyle Evans <kevans@freebsd.org>,
Richard Henderson <richard.henderson@linaro.org>,
def@FreeBSD.org, jrtc27@FreeBSD.org, Warner Losh <imp@bsdimp.com>
Subject: [PULL 31/40] bsd-user/signal.c: setup_frame
Date: Mon, 31 Jan 2022 12:56:27 -0700 [thread overview]
Message-ID: <20220131195636.31991-32-imp@bsdimp.com> (raw)
In-Reply-To: <20220131195636.31991-1-imp@bsdimp.com>
setup_frame sets up a signalled stack frame. Associated routines to
extract the pointer to the stack frame and to support alternate stacks.
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/main.c | 5 +++
bsd-user/qemu.h | 3 +-
bsd-user/signal.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 90 insertions(+), 1 deletion(-)
diff --git a/bsd-user/main.c b/bsd-user/main.c
index 29cf4e15693..f1d58e905e7 100644
--- a/bsd-user/main.c
+++ b/bsd-user/main.c
@@ -217,6 +217,11 @@ void qemu_cpu_kick(CPUState *cpu)
/* Assumes contents are already zeroed. */
static void init_task_state(TaskState *ts)
{
+ ts->sigaltstack_used = (struct target_sigaltstack) {
+ .ss_sp = 0,
+ .ss_size = 0,
+ .ss_flags = TARGET_SS_DISABLE,
+ };
}
void gemu_log(const char *fmt, ...)
diff --git a/bsd-user/qemu.h b/bsd-user/qemu.h
index 1648a509b9c..de20650a00d 100644
--- a/bsd-user/qemu.h
+++ b/bsd-user/qemu.h
@@ -107,7 +107,8 @@ typedef struct TaskState {
*/
sigset_t signal_mask;
- uint8_t stack[];
+ /* This thread's sigaltstack, if it has one */
+ struct target_sigaltstack sigaltstack_used;
} __attribute__((aligned(16))) TaskState;
void stop_all_tasks(void);
diff --git a/bsd-user/signal.c b/bsd-user/signal.c
index 84dafa4e9fe..dbc13736073 100644
--- a/bsd-user/signal.c
+++ b/bsd-user/signal.c
@@ -35,6 +35,16 @@ static void host_signal_handler(int host_sig, siginfo_t *info, void *puc);
static void target_to_host_sigset_internal(sigset_t *d,
const target_sigset_t *s);
+static inline int on_sig_stack(TaskState *ts, unsigned long sp)
+{
+ return sp - ts->sigaltstack_used.ss_sp < ts->sigaltstack_used.ss_size;
+}
+
+static inline int sas_ss_flags(TaskState *ts, unsigned long sp)
+{
+ return ts->sigaltstack_used.ss_size == 0 ? SS_DISABLE :
+ on_sig_stack(ts, sp) ? SS_ONSTACK : 0;
+}
/*
* The BSD ABIs use the same singal numbers across all the CPU architectures, so
@@ -491,6 +501,79 @@ static void host_signal_handler(int host_sig, siginfo_t *info, void *puc)
cpu_exit(thread_cpu);
}
+static inline abi_ulong get_sigframe(struct target_sigaction *ka,
+ CPUArchState *env, size_t frame_size)
+{
+ TaskState *ts = (TaskState *)thread_cpu->opaque;
+ abi_ulong sp;
+
+ /* Use default user stack */
+ sp = get_sp_from_cpustate(env);
+
+ if ((ka->sa_flags & TARGET_SA_ONSTACK) && sas_ss_flags(ts, sp) == 0) {
+ sp = ts->sigaltstack_used.ss_sp + ts->sigaltstack_used.ss_size;
+ }
+
+/* TODO: make this a target_arch function / define */
+#if defined(TARGET_ARM)
+ return (sp - frame_size) & ~7;
+#elif defined(TARGET_AARCH64)
+ return (sp - frame_size) & ~15;
+#else
+ return sp - frame_size;
+#endif
+}
+
+/* compare to $M/$M/exec_machdep.c sendsig and sys/kern/kern_sig.c sigexit */
+
+static void setup_frame(int sig, int code, struct target_sigaction *ka,
+ target_sigset_t *set, target_siginfo_t *tinfo, CPUArchState *env)
+{
+ struct target_sigframe *frame;
+ abi_ulong frame_addr;
+ int i;
+
+ frame_addr = get_sigframe(ka, env, sizeof(*frame));
+ trace_user_setup_frame(env, frame_addr);
+ if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) {
+ unlock_user_struct(frame, frame_addr, 1);
+ dump_core_and_abort(TARGET_SIGILL);
+ return;
+ }
+
+ memset(frame, 0, sizeof(*frame));
+ setup_sigframe_arch(env, frame_addr, frame, 0);
+
+ for (i = 0; i < TARGET_NSIG_WORDS; i++) {
+ __put_user(set->__bits[i], &frame->sf_uc.uc_sigmask.__bits[i]);
+ }
+
+ if (tinfo) {
+ frame->sf_si.si_signo = tinfo->si_signo;
+ frame->sf_si.si_errno = tinfo->si_errno;
+ frame->sf_si.si_code = tinfo->si_code;
+ frame->sf_si.si_pid = tinfo->si_pid;
+ frame->sf_si.si_uid = tinfo->si_uid;
+ frame->sf_si.si_status = tinfo->si_status;
+ frame->sf_si.si_addr = tinfo->si_addr;
+ /* see host_to_target_siginfo_noswap() for more details */
+ frame->sf_si.si_value.sival_ptr = tinfo->si_value.sival_ptr;
+ /*
+ * At this point, whatever is in the _reason union is complete
+ * and in target order, so just copy the whole thing over, even
+ * if it's too large for this specific signal.
+ * host_to_target_siginfo_noswap() and tswap_siginfo() have ensured
+ * that's so.
+ */
+ memcpy(&frame->sf_si._reason, &tinfo->_reason,
+ sizeof(tinfo->_reason));
+ }
+
+ set_sigtramp_args(env, sig, frame, frame_addr, ka);
+
+ unlock_user_struct(frame, frame_addr, 1);
+}
+
void signal_init(void)
{
TaskState *ts = (TaskState *)thread_cpu->opaque;
--
2.33.1
next prev parent reply other threads:[~2022-01-31 20:38 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-31 19:55 [PULL 00/40] Bsd user arm 2022q1 patches Warner Losh
2022-01-31 19:55 ` [PULL 01/40] bsd-user: Complete FreeBSD siginfo Warner Losh
2022-01-31 19:55 ` [PULL 02/40] bsd-user: Create setup_sigframe_arch to setup sigframe context Warner Losh
2022-01-31 19:55 ` [PULL 03/40] bsd-user/arm/signal.c: Implement setup_sigframe_arch for arm Warner Losh
2022-01-31 19:56 ` [PULL 04/40] bsd-user/arm/signal.c: get_mcontext should zero vfp data Warner Losh
2022-01-31 19:56 ` [PULL 05/40] bsd-user: Remove vestiges of signal queueing code Warner Losh
2022-01-31 19:56 ` [PULL 06/40] bsd-user: Bring in docs from linux-user for signal_pending Warner Losh
2022-01-31 19:56 ` [PULL 07/40] bsd-user/arm/target_arch_cpu.h: Move EXCP_ATOMIC to match linux-user Warner Losh
2022-01-31 19:56 ` [PULL 08/40] bsd-user/signal.c: implement force_sig_fault Warner Losh
2022-01-31 19:56 ` [PULL 09/40] bsd-user/signal-common.h: Move signal functions prototypes to here Warner Losh
2022-01-31 19:56 ` [PULL 10/40] bsd-user/signal.c: Implement cpu_loop_exit_sigsegv Warner Losh
2022-01-31 19:56 ` [PULL 11/40] bsd-user/signal.c: implement cpu_loop_exit_sigbus Warner Losh
2022-01-31 19:56 ` [PULL 12/40] bsd-user/arm/arget_arch_cpu.h: Move EXCP_DEBUG and EXCP_BKPT together Warner Losh
2022-01-31 19:56 ` [PULL 13/40] bsd-user/arm/target_arch_cpu.h: Correct code pointer Warner Losh
2022-01-31 19:56 ` [PULL 14/40] bsd-user/arm/target_arch_cpu.h: Use force_sig_fault for EXCP_UDEF Warner Losh
2022-01-31 19:56 ` [PULL 15/40] bsd-user/arm/target_arch_cpu.h: Implement data faults Warner Losh
2022-01-31 19:56 ` [PULL 16/40] bsd-user/signal.c: implement abstract target / host signal translation Warner Losh
2022-01-31 19:56 ` [PULL 17/40] bsd-user/signal.c: Implement signal_init() Warner Losh
2022-01-31 19:56 ` [PULL 18/40] bsd-user/signal.c: Add si_type argument to queue_signal Warner Losh
2022-01-31 19:56 ` [PULL 19/40] bsd-user/host/arm/host-signal.h: Implement host_signal_* Warner Losh
2022-01-31 19:56 ` [PULL 20/40] bsd-user/host/i386/host-signal.h: " Warner Losh
2022-01-31 19:56 ` [PULL 21/40] bsd-user/host/x86_64/host-signal.h: " Warner Losh
2022-01-31 19:56 ` [PULL 22/40] bsd-user: Add host signals to the build Warner Losh
2022-01-31 19:56 ` [PULL 23/40] bsd-user: Add trace events for bsd-user Warner Losh
2022-01-31 19:56 ` [PULL 24/40] bsd-user/signal.c: host_to_target_siginfo_noswap Warner Losh
2022-01-31 19:56 ` [PULL 25/40] bsd-user/signal.c: Implement rewind_if_in_safe_syscall Warner Losh
2022-01-31 19:56 ` [PULL 26/40] bsd-user/signal.c: Implement host_signal_handler Warner Losh
2022-01-31 19:56 ` [PULL 27/40] bsd-user/strace.c: print_taken_signal Warner Losh
2022-01-31 19:56 ` [PULL 28/40] bsd-user/signal.c: Implement dump_core_and_abort Warner Losh
2022-01-31 19:56 ` [PULL 29/40] bsd-user/signal.c: Fill in queue_signal Warner Losh
2022-01-31 19:56 ` [PULL 30/40] bsd-user/signal.c: sigset manipulation routines Warner Losh
2022-01-31 19:56 ` Warner Losh [this message]
2022-01-31 19:56 ` [PULL 32/40] bsd-user/signal.c: handle_pending_signal Warner Losh
2022-01-31 19:56 ` [PULL 33/40] bsd-user/signal.c: tswap_siginfo Warner Losh
2022-01-31 19:56 ` [PULL 34/40] bsd-user/signal.c: process_pending_signals Warner Losh
2022-01-31 19:56 ` [PULL 35/40] bsd-user/signal.c: implement do_sigreturn Warner Losh
2022-01-31 19:56 ` [PULL 36/40] bsd-user/signal.c: implement do_sigaction Warner Losh
2022-01-31 19:56 ` [PULL 37/40] bsd-user/signal.c: do_sigaltstack Warner Losh
2022-01-31 19:56 ` [PULL 38/40] MAINTAINERS: Add tests/vm/*bsd to the list to get reviews on Warner Losh
2022-01-31 19:56 ` [PULL 39/40] bsd-user: Rename arg name for target_cpu_reset to env Warner Losh
2022-01-31 19:56 ` [PULL 40/40] bsd-user/freebsd/target_os_ucontext.h: Prefer env as arg name for CPUArchState args Warner Losh
2022-02-01 16:31 ` [PULL 00/40] Bsd user arm 2022q1 patches Peter Maydell
2022-02-01 21:03 ` Warner Losh
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220131195636.31991-32-imp@bsdimp.com \
--to=imp@bsdimp.com \
--cc=def@FreeBSD.org \
--cc=jrtc27@FreeBSD.org \
--cc=kevans@freebsd.org \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
--cc=sson@FreeBSD.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.