On Sun, Jan 23, 2022 at 6:38 PM Richard Henderson <
richard.hender...@linaro.org> wrote:

> On 1/10/22 3:19 AM, Warner Losh wrote:
> > Initialize the signal state for the emulator. Setup a set of sane
> > default signal handlers, mirroring the host's signals. For fatal signals
> > (those that exit by default), establish our own set of signal
> > handlers. Stub out the actual signal handler we use for the moment.
> >
> > Signed-off-by: Stacey Son <s...@freebsd.org>
> > Signed-off-by: Kyle Evans <kev...@freebsd.org>
> > Signed-off-by: Warner Losh <i...@bsdimp.com>
> > ---
> >   bsd-user/qemu.h   |  1 +
> >   bsd-user/signal.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++
> >   2 files changed, 69 insertions(+)
> >
> > diff --git a/bsd-user/qemu.h b/bsd-user/qemu.h
> > index 334f8b1d715..0e0b8db708b 100644
> > --- a/bsd-user/qemu.h
> > +++ b/bsd-user/qemu.h
> > @@ -97,6 +97,7 @@ typedef struct TaskState {
> >       struct qemu_sigqueue sigqueue_table[MAX_SIGQUEUE_SIZE]; /* siginfo
> queue */
> >       struct qemu_sigqueue *first_free; /* first free siginfo queue
> entry */
> >       int signal_pending; /* non zero if a signal may be pending */
> > +    sigset_t signal_mask;
> >
> >       uint8_t stack[];
> >   } __attribute__((aligned(16))) TaskState;
> > diff --git a/bsd-user/signal.c b/bsd-user/signal.c
> > index 7ea86149981..b2c91c39379 100644
> > --- a/bsd-user/signal.c
> > +++ b/bsd-user/signal.c
> > @@ -28,6 +28,9 @@
> >    * fork.
> >    */
> >
> > +static struct target_sigaction sigact_table[TARGET_NSIG];
> > +static void host_signal_handler(int host_sig, siginfo_t *info, void
> *puc);
> > +
> >   int host_to_target_signal(int sig)
> >   {
> >       return sig;
> > @@ -47,6 +50,28 @@ void queue_signal(CPUArchState *env, int sig,
> target_siginfo_t *info)
> >       qemu_log_mask(LOG_UNIMP, "No signal queueing, dropping signal
> %d\n", sig);
> >   }
> >
> > +static int fatal_signal(int sig)
> > +{
> > +
> > +    switch (sig) {
> > +    case TARGET_SIGCHLD:
> > +    case TARGET_SIGURG:
> > +    case TARGET_SIGWINCH:
> > +    case TARGET_SIGINFO:
> > +        /* Ignored by default. */
> > +        return 0;
> > +    case TARGET_SIGCONT:
> > +    case TARGET_SIGSTOP:
> > +    case TARGET_SIGTSTP:
> > +    case TARGET_SIGTTIN:
> > +    case TARGET_SIGTTOU:
> > +        /* Job control signals.  */
> > +        return 0;
> > +    default:
> > +        return 1;
> > +    }
> > +}
> > +
> >   /*
> >    * Force a synchronously taken QEMU_SI_FAULT signal. For QEMU the
> >    * 'force' part is handled in process_pending_signals().
> > @@ -64,8 +89,51 @@ void force_sig_fault(int sig, int code, abi_ulong
> addr)
> >       queue_signal(env, sig, &info);
> >   }
> >
> > +static void host_signal_handler(int host_sig, siginfo_t *info, void
> *puc)
> > +{
> > +}
> > +
> >   void signal_init(void)
> >   {
> > +    TaskState *ts = (TaskState *)thread_cpu->opaque;
> > +    struct sigaction act;
> > +    struct sigaction oact;
> > +    int i;
> > +    int host_sig;
> > +
> > +    /* Set the signal mask from the host mask. */
> > +    sigprocmask(0, 0, &ts->signal_mask);
> > +
> > +    /*
> > +     * Set all host signal handlers. ALL signals are blocked during the
> > +     * handlers to serialize them.
> > +     */
> > +    memset(sigact_table, 0, sizeof(sigact_table));
> > +
> > +    sigfillset(&act.sa_mask);
> > +    act.sa_sigaction = host_signal_handler;
> > +    act.sa_flags = SA_SIGINFO;
> > +
> > +    for (i = 1; i <= TARGET_NSIG; i++) {
> > +        host_sig = target_to_host_signal(i);
> > +        sigaction(host_sig, NULL, &oact);
>
> Missing test for CONFIG_GPROF + SIGPROF.  Otherwise,
>
> Reviewed-by: Richard Henderson <richard.hender...@linaro.org>
>

Gotcha. Will add.

Warner

Reply via email to