All of lore.kernel.org
 help / color / mirror / Atom feed
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: [PATCH v2 24/40] bsd-user/signal.c: host_to_target_siginfo_noswap
Date: Mon, 24 Jan 2022 18:29:31 -0700	[thread overview]
Message-ID: <20220125012947.14974-25-imp@bsdimp.com> (raw)
In-Reply-To: <20220125012947.14974-1-imp@bsdimp.com>

Implement conversion of host to target siginfo.

Signed-off-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Kyle Evans <kevans@freebsd.org>
Signed-off-by: Warner Losh <imp@bsdimp.com>
---
 bsd-user/signal.c | 113 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 113 insertions(+)

diff --git a/bsd-user/signal.c b/bsd-user/signal.c
index cb0036acb61..db8cf0a08f1 100644
--- a/bsd-user/signal.c
+++ b/bsd-user/signal.c
@@ -48,6 +48,119 @@ int target_to_host_signal(int sig)
     return sig;
 }
 
+static bool has_trapno(int tsig)
+{
+    return tsig == TARGET_SIGILL ||
+        tsig == TARGET_SIGFPE ||
+        tsig == TARGET_SIGSEGV ||
+        tsig == TARGET_SIGBUS ||
+        tsig == TARGET_SIGTRAP;
+}
+
+
+/* Siginfo conversion. */
+
+/*
+ * Populate tinfo w/o swapping based on guessing which fields are valid.
+ */
+static inline void host_to_target_siginfo_noswap(target_siginfo_t *tinfo,
+        const siginfo_t *info)
+{
+    int sig = host_to_target_signal(info->si_signo);
+    int si_code = info->si_code;
+    int si_type;
+
+    /*
+     * Make sure we that the variable portion of the target siginfo is zeroed
+     * out so we don't leak anything into that.
+     */
+    memset(&tinfo->_reason, 0, sizeof(tinfo->_reason));
+
+    /*
+     * This is awkward, because we have to use a combination of the si_code and
+     * si_signo to figure out which of the union's members are valid.o We
+     * therefore make our best guess.
+     *
+     * Once we have made our guess, we record it in the top 16 bits of
+     * the si_code, so that tswap_siginfo() later can use it.
+     * tswap_siginfo() will strip these top bits out before writing
+     * si_code to the guest (sign-extending the lower bits).
+     */
+    tinfo->si_signo = sig;
+    tinfo->si_errno = info->si_errno;
+    tinfo->si_code = info->si_code;
+    tinfo->si_pid = info->si_pid;
+    tinfo->si_uid = info->si_uid;
+    tinfo->si_status = info->si_status;
+    tinfo->si_addr = (abi_ulong)(unsigned long)info->si_addr;
+    /*
+     * si_value is opaque to kernel. On all FreeBSD platforms,
+     * sizeof(sival_ptr) >= sizeof(sival_int) so the following
+     * always will copy the larger element.
+     */
+    tinfo->si_value.sival_ptr =
+        (abi_ulong)(unsigned long)info->si_value.sival_ptr;
+
+    switch (si_code) {
+        /*
+         * All the SI_xxx codes that are defined here are global to
+         * all the signals (they have values that none of the other,
+         * more specific signal info will set).
+         */
+    case SI_USER:
+    case SI_LWP:
+    case SI_KERNEL:
+    case SI_QUEUE:
+    case SI_ASYNCIO:
+        /*
+         * Only the fixed parts are valid (though FreeBSD doesn't always
+         * set all the fields to non-zero values.
+         */
+        si_type = QEMU_SI_NOINFO;
+        break;
+    case SI_TIMER:
+        tinfo->_reason._timer._timerid = info->_reason._timer._timerid;
+        tinfo->_reason._timer._overrun = info->_reason._timer._overrun;
+        si_type = QEMU_SI_TIMER;
+        break;
+    case SI_MESGQ:
+        tinfo->_reason._mesgq._mqd = info->_reason._mesgq._mqd;
+        si_type = QEMU_SI_MESGQ;
+        break;
+    default:
+        /*
+         * We have to go based on the signal number now to figure out
+         * what's valid.
+         */
+        if (has_trapno(sig)) {
+            tinfo->_reason._fault._trapno = info->_reason._fault._trapno;
+            si_type = QEMU_SI_FAULT;
+        }
+#ifdef TARGET_SIGPOLL
+        /*
+         * FreeBSD never had SIGPOLL, but emulates it for Linux so there's
+         * a chance it may popup in the future.
+         */
+        if (sig == TARGET_SIGPOLL) {
+            tinfo->_reason._poll._band = info->_reason._poll._band;
+            si_type = QEMU_SI_POLL;
+        }
+#endif
+        /*
+         * Unsure that this can actually be generated, and our support for
+         * capsicum is somewhere between weak and non-existant, but if we get
+         * one, then we know what to save.
+         */
+        if (sig == TARGET_SIGTRAP) {
+            tinfo->_reason._capsicum._syscall =
+                info->_reason._capsicum._syscall;
+            si_type = QEMU_SI_CAPSICUM;
+        }
+        break;
+    }
+    tinfo->si_code = deposit32(si_code, 24, 8, si_type);
+}
+
 /*
  * Queue a signal so that it will be send to the virtual CPU as soon as
  * possible.
-- 
2.33.1



  parent reply	other threads:[~2022-01-25  2:04 UTC|newest]

Thread overview: 72+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-01-25  1:29 [PATCH v2 00/40] bsd-user: upstream our signal implementation Warner Losh
2022-01-25  1:29 ` [PATCH v2 01/40] bsd-user: Complete FreeBSD siginfo Warner Losh
2022-01-27  5:43   ` Richard Henderson
2022-01-25  1:29 ` [PATCH v2 02/40] bsd-user: Create setup_sigframe_arch to setup sigframe context Warner Losh
2022-01-27  5:45   ` Richard Henderson
2022-01-25  1:29 ` [PATCH v2 03/40] bsd-user/arm/signal.c: Implement setup_sigframe_arch for arm Warner Losh
2022-01-27  5:56   ` Richard Henderson
2022-01-27 16:42     ` Warner Losh
2022-01-25  1:29 ` [PATCH v2 04/40] bsd-user/arm/signal.c: get_mcontext should zero vfp data Warner Losh
2022-01-27  5:59   ` Richard Henderson
2022-01-27 15:44     ` Warner Losh
2022-01-25  1:29 ` [PATCH v2 05/40] bsd-user: Remove vestiges of signal queueing code Warner Losh
2022-01-27  6:16   ` Richard Henderson
2022-01-25  1:29 ` [PATCH v2 06/40] bsd-user: Bring in docs from linux-user for signal_pending Warner Losh
2022-01-27  6:16   ` Richard Henderson
2022-01-25  1:29 ` [PATCH v2 07/40] bsd-user/arm/target_arch_cpu.h: Move EXCP_ATOMIC to match linux-user Warner Losh
2022-01-25  1:29 ` [PATCH v2 08/40] bsd-user/signal.c: implement force_sig_fault Warner Losh
2022-01-25  1:29 ` [PATCH v2 09/40] bsd-user/signal-common.h: Move signal functions prototypes to here Warner Losh
2022-01-27  6:17   ` Richard Henderson
2022-01-25  1:29 ` [PATCH v2 10/40] bsd-user/signal.c: Implement cpu_loop_exit_sigsegv Warner Losh
2022-01-25  1:29 ` [PATCH v2 11/40] bsd-user/signal.c: implement cpu_loop_exit_sigbus Warner Losh
2022-01-25  1:29 ` [PATCH v2 12/40] bsd-user/arm/arget_arch_cpu.h: Move EXCP_DEBUG and EXCP_BKPT together Warner Losh
2022-01-25  1:29 ` [PATCH v2 13/40] bsd-user/arm/target_arch_cpu.h: Correct code pointer Warner Losh
2022-01-25  1:29 ` [PATCH v2 14/40] bsd-user/arm/target_arch_cpu.h: Use force_sig_fault for EXCP_UDEF Warner Losh
2022-01-27  6:27   ` Richard Henderson
2022-01-27 15:40     ` Warner Losh
2022-01-25  1:29 ` [PATCH v2 15/40] bsd-user/arm/target_arch_cpu.h: Implement data faults Warner Losh
2022-01-25  1:29 ` [PATCH v2 16/40] bsd-user/signal.c: implement abstract target / host signal translation Warner Losh
2022-01-27  6:29   ` Richard Henderson
2022-01-25  1:29 ` [PATCH v2 17/40] bsd-user/signal.c: Implement signal_init() Warner Losh
2022-01-25  1:29 ` [PATCH v2 18/40] bsd-user/signal.c: Add si_type argument to queue_signal Warner Losh
2022-01-27  6:38   ` Richard Henderson
2022-01-25  1:29 ` [PATCH v2 19/40] bsd-user/host/arm/host-signal.h: Implement host_signal_* Warner Losh
2022-01-27  6:38   ` Richard Henderson
2022-01-25  1:29 ` [PATCH v2 20/40] bsd-user/host/i386/host-signal.h: " Warner Losh
2022-01-25  1:29 ` [PATCH v2 21/40] bsd-user/host/x86_64/host-signal.h: " Warner Losh
2022-01-25  1:29 ` [PATCH v2 22/40] bsd-user: Add host signals to the build Warner Losh
2022-01-25  1:29 ` [PATCH v2 23/40] bsd-user: Add trace events for bsd-user Warner Losh
2022-01-25  1:29 ` Warner Losh [this message]
2022-01-27  7:40   ` [PATCH v2 24/40] bsd-user/signal.c: host_to_target_siginfo_noswap Richard Henderson
2022-01-25  1:29 ` [PATCH v2 25/40] bsd-user/signal.c: Implement rewind_if_in_safe_syscall Warner Losh
2022-01-25  1:29 ` [PATCH v2 26/40] bsd-user/signal.c: Implement host_signal_handler Warner Losh
2022-01-27  7:42   ` Richard Henderson
2022-01-25  1:29 ` [PATCH v2 27/40] bsd-user/strace.c: print_taken_signal Warner Losh
2022-01-25  1:29 ` [PATCH v2 28/40] bsd-user/signal.c: Implement dump_core_and_abort Warner Losh
2022-01-25  1:29 ` [PATCH v2 29/40] bsd-user/signal.c: Fill in queue_signal Warner Losh
2022-01-27  7:44   ` Richard Henderson
2022-01-27 15:34     ` Warner Losh
2022-01-25  1:29 ` [PATCH v2 30/40] bsd-user/signal.c: sigset manipulation routines Warner Losh
2022-01-27  7:45   ` Richard Henderson
2022-01-25  1:29 ` [PATCH v2 31/40] bsd-user/signal.c: setup_frame Warner Losh
2022-01-27  7:47   ` Richard Henderson
2022-01-27 15:30     ` Warner Losh
2022-01-25  1:29 ` [PATCH v2 32/40] bsd-user/signal.c: handle_pending_signal Warner Losh
2022-01-27  7:51   ` Richard Henderson
2022-01-25  1:29 ` [PATCH v2 33/40] bsd-user/signal.c: tswap_siginfo Warner Losh
2022-01-27  7:52   ` Richard Henderson
2022-01-25  1:29 ` [PATCH v2 34/40] bsd-user/signal.c: process_pending_signals Warner Losh
2022-01-27  7:54   ` Richard Henderson
2022-01-25  1:29 ` [PATCH v2 35/40] bsd-user/signal.c: implement do_sigreturn Warner Losh
2022-01-27 23:05   ` Warner Losh
2022-01-25  1:29 ` [PATCH v2 36/40] bsd-user/signal.c: implement do_sigaction Warner Losh
2022-01-27 22:46   ` Warner Losh
2022-01-28 10:37     ` Peter Maydell
2022-01-25  1:29 ` [PATCH v2 37/40] bsd-user/signal.c: do_sigaltstack Warner Losh
2022-01-27  8:00   ` Richard Henderson
2022-01-25  1:29 ` [PATCH v2 38/40] MAINTAINERS: Add tests/vm/*bsd to the list to get reviews on Warner Losh
2022-01-27  8:00   ` Richard Henderson
2022-01-25  1:29 ` [PATCH v2 39/40] bsd-user: Rename arg name for target_cpu_reset to env Warner Losh
2022-01-27  8:00   ` Richard Henderson
2022-01-25  1:29 ` [PATCH v2 40/40] bsd-user/freebsd/target_os_ucontext.h: Prefer env as arg name for CPUArchState args Warner Losh
2022-01-27  8:00   ` Richard Henderson

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=20220125012947.14974-25-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.