2 * Emulation of BSD signals
4 * Copyright (c) 2003 - 2008 Fabrice Bellard
5 * Copyright (c) 2013 Stacey Son
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, see <http://www.gnu.org/licenses/>.
21 #include "qemu/osdep.h"
24 #include "exec/page-protection.h"
25 #include "user/tswap-target.h"
26 #include "gdbstub/user.h"
27 #include "signal-common.h"
29 #include "hw/core/tcg-cpu-ops.h"
30 #include "host-signal.h"
32 /* target_siginfo_t must fit in gdbstub's siginfo save area. */
33 QEMU_BUILD_BUG_ON(sizeof(target_siginfo_t
) > MAX_SIGINFO_LENGTH
);
35 static struct target_sigaction sigact_table
[TARGET_NSIG
];
36 static void host_signal_handler(int host_sig
, siginfo_t
*info
, void *puc
);
37 static void target_to_host_sigset_internal(sigset_t
*d
,
38 const target_sigset_t
*s
);
40 static inline int on_sig_stack(TaskState
*ts
, unsigned long sp
)
42 return sp
- ts
->sigaltstack_used
.ss_sp
< ts
->sigaltstack_used
.ss_size
;
45 static inline int sas_ss_flags(TaskState
*ts
, unsigned long sp
)
47 return ts
->sigaltstack_used
.ss_size
== 0 ? SS_DISABLE
:
48 on_sig_stack(ts
, sp
) ? SS_ONSTACK
: 0;
52 * The BSD ABIs use the same signal numbers across all the CPU architectures, so
53 * (unlike Linux) these functions are just the identity mapping. This might not
54 * be true for XyzBSD running on AbcBSD, which doesn't currently work.
56 int host_to_target_signal(int sig
)
61 int target_to_host_signal(int sig
)
66 static inline void target_sigemptyset(target_sigset_t
*set
)
68 memset(set
, 0, sizeof(*set
));
71 static inline void target_sigaddset(target_sigset_t
*set
, int signum
)
74 uint32_t mask
= (uint32_t)1 << (signum
% TARGET_NSIG_BPW
);
75 set
->__bits
[signum
/ TARGET_NSIG_BPW
] |= mask
;
78 static inline int target_sigismember(const target_sigset_t
*set
, int signum
)
81 abi_ulong mask
= (abi_ulong
)1 << (signum
% TARGET_NSIG_BPW
);
82 return (set
->__bits
[signum
/ TARGET_NSIG_BPW
] & mask
) != 0;
85 /* Adjust the signal context to rewind out of safe-syscall if we're in it */
86 static inline void rewind_if_in_safe_syscall(void *puc
)
88 ucontext_t
*uc
= (ucontext_t
*)puc
;
89 uintptr_t pcreg
= host_signal_pc(uc
);
91 if (pcreg
> (uintptr_t)safe_syscall_start
92 && pcreg
< (uintptr_t)safe_syscall_end
) {
93 host_signal_set_pc(uc
, (uintptr_t)safe_syscall_start
);
98 * Note: The following take advantage of the BSD signal property that all
99 * signals are available on all architectures.
101 static void host_to_target_sigset_internal(target_sigset_t
*d
,
106 target_sigemptyset(d
);
107 for (i
= 1; i
<= NSIG
; i
++) {
108 if (sigismember(s
, i
)) {
109 target_sigaddset(d
, host_to_target_signal(i
));
114 void host_to_target_sigset(target_sigset_t
*d
, const sigset_t
*s
)
119 host_to_target_sigset_internal(&d1
, s
);
120 for (i
= 0; i
< _SIG_WORDS
; i
++) {
121 d
->__bits
[i
] = tswap32(d1
.__bits
[i
]);
125 static void target_to_host_sigset_internal(sigset_t
*d
,
126 const target_sigset_t
*s
)
131 for (i
= 1; i
<= TARGET_NSIG
; i
++) {
132 if (target_sigismember(s
, i
)) {
133 sigaddset(d
, target_to_host_signal(i
));
138 void target_to_host_sigset(sigset_t
*d
, const target_sigset_t
*s
)
143 for (i
= 0; i
< TARGET_NSIG_WORDS
; i
++) {
144 s1
.__bits
[i
] = tswap32(s
->__bits
[i
]);
146 target_to_host_sigset_internal(d
, &s1
);
149 static bool has_trapno(int tsig
)
151 return tsig
== TARGET_SIGILL
||
152 tsig
== TARGET_SIGFPE
||
153 tsig
== TARGET_SIGSEGV
||
154 tsig
== TARGET_SIGBUS
||
155 tsig
== TARGET_SIGTRAP
;
158 /* Siginfo conversion. */
161 * Populate tinfo w/o swapping based on guessing which fields are valid.
163 static inline void host_to_target_siginfo_noswap(target_siginfo_t
*tinfo
,
164 const siginfo_t
*info
)
166 int sig
= host_to_target_signal(info
->si_signo
);
167 int si_code
= info
->si_code
;
171 * Make sure we that the variable portion of the target siginfo is zeroed
172 * out so we don't leak anything into that.
174 memset(&tinfo
->_reason
, 0, sizeof(tinfo
->_reason
));
177 * This is awkward, because we have to use a combination of the si_code and
178 * si_signo to figure out which of the union's members are valid.o We
179 * therefore make our best guess.
181 * Once we have made our guess, we record it in the top 16 bits of
182 * the si_code, so that tswap_siginfo() later can use it.
183 * tswap_siginfo() will strip these top bits out before writing
184 * si_code to the guest (sign-extending the lower bits).
186 tinfo
->si_signo
= sig
;
187 tinfo
->si_errno
= info
->si_errno
;
188 tinfo
->si_code
= info
->si_code
;
189 tinfo
->si_pid
= info
->si_pid
;
190 tinfo
->si_uid
= info
->si_uid
;
191 tinfo
->si_status
= info
->si_status
;
192 tinfo
->si_addr
= (abi_ulong
)(unsigned long)info
->si_addr
;
194 * si_value is opaque to kernel. On all FreeBSD platforms,
195 * sizeof(sival_ptr) >= sizeof(sival_int) so the following
196 * always will copy the larger element.
198 tinfo
->si_value
.sival_ptr
=
199 (abi_ulong
)(unsigned long)info
->si_value
.sival_ptr
;
203 * All the SI_xxx codes that are defined here are global to
204 * all the signals (they have values that none of the other,
205 * more specific signal info will set).
213 * Only the fixed parts are valid (though FreeBSD doesn't always
214 * set all the fields to non-zero values.
216 si_type
= QEMU_SI_NOINFO
;
219 tinfo
->_reason
._timer
._timerid
= info
->_reason
._timer
._timerid
;
220 tinfo
->_reason
._timer
._overrun
= info
->_reason
._timer
._overrun
;
221 si_type
= QEMU_SI_TIMER
;
224 tinfo
->_reason
._mesgq
._mqd
= info
->_reason
._mesgq
._mqd
;
225 si_type
= QEMU_SI_MESGQ
;
229 * We have to go based on the signal number now to figure out
232 si_type
= QEMU_SI_NOINFO
;
233 if (has_trapno(sig
)) {
234 tinfo
->_reason
._fault
._trapno
= info
->_reason
._fault
._trapno
;
235 si_type
= QEMU_SI_FAULT
;
237 #ifdef TARGET_SIGPOLL
239 * FreeBSD never had SIGPOLL, but emulates it for Linux so there's
240 * a chance it may popup in the future.
242 if (sig
== TARGET_SIGPOLL
) {
243 tinfo
->_reason
._poll
._band
= info
->_reason
._poll
._band
;
244 si_type
= QEMU_SI_POLL
;
248 * Unsure that this can actually be generated, and our support for
249 * capsicum is somewhere between weak and non-existent, but if we get
250 * one, then we know what to save.
252 #ifdef QEMU_SI_CAPSICUM
253 if (sig
== TARGET_SIGTRAP
) {
254 tinfo
->_reason
._capsicum
._syscall
=
255 info
->_reason
._capsicum
._syscall
;
256 si_type
= QEMU_SI_CAPSICUM
;
261 tinfo
->si_code
= deposit32(si_code
, 24, 8, si_type
);
264 static void tswap_siginfo(target_siginfo_t
*tinfo
, const target_siginfo_t
*info
)
266 int si_type
= extract32(info
->si_code
, 24, 8);
267 int si_code
= sextract32(info
->si_code
, 0, 24);
269 __put_user(info
->si_signo
, &tinfo
->si_signo
);
270 __put_user(info
->si_errno
, &tinfo
->si_errno
);
271 __put_user(si_code
, &tinfo
->si_code
); /* Zero out si_type, it's internal */
272 __put_user(info
->si_pid
, &tinfo
->si_pid
);
273 __put_user(info
->si_uid
, &tinfo
->si_uid
);
274 __put_user(info
->si_status
, &tinfo
->si_status
);
275 __put_user(info
->si_addr
, &tinfo
->si_addr
);
277 * Unswapped, because we passed it through mostly untouched. si_value is
278 * opaque to the kernel, so we didn't bother with potentially wasting cycles
279 * to swap it into host byte order.
281 tinfo
->si_value
.sival_ptr
= info
->si_value
.sival_ptr
;
284 * We can use our internal marker of which fields in the structure
285 * are valid, rather than duplicating the guesswork of
286 * host_to_target_siginfo_noswap() here.
289 case QEMU_SI_NOINFO
: /* No additional info */
292 __put_user(info
->_reason
._fault
._trapno
,
293 &tinfo
->_reason
._fault
._trapno
);
296 __put_user(info
->_reason
._timer
._timerid
,
297 &tinfo
->_reason
._timer
._timerid
);
298 __put_user(info
->_reason
._timer
._overrun
,
299 &tinfo
->_reason
._timer
._overrun
);
302 __put_user(info
->_reason
._mesgq
._mqd
, &tinfo
->_reason
._mesgq
._mqd
);
305 /* Note: Not generated on FreeBSD */
306 __put_user(info
->_reason
._poll
._band
, &tinfo
->_reason
._poll
._band
);
308 #ifdef QEMU_SI_CAPSICUM
309 case QEMU_SI_CAPSICUM
:
310 __put_user(info
->_reason
._capsicum
._syscall
,
311 &tinfo
->_reason
._capsicum
._syscall
);
315 g_assert_not_reached();
319 void host_to_target_siginfo(target_siginfo_t
*tinfo
, const siginfo_t
*info
)
321 host_to_target_siginfo_noswap(tinfo
, info
);
322 tswap_siginfo(tinfo
, tinfo
);
325 int block_signals(void)
327 TaskState
*ts
= get_task_state(thread_cpu
);
331 * It's OK to block everything including SIGSEGV, because we won't run any
332 * further guest code before unblocking signals in
333 * process_pending_signals(). We depend on the FreeBSD behavior here where
334 * this will only affect this thread's signal mask. We don't use
335 * pthread_sigmask which might seem more correct because that routine also
336 * does odd things with SIGCANCEL to implement pthread_cancel().
339 sigprocmask(SIG_SETMASK
, &set
, 0);
341 return qatomic_xchg(&ts
->signal_pending
, 1);
344 /* Returns 1 if given signal should dump core if not handled. */
345 static int core_dump_signal(int sig
)
361 /* Abort execution with signal. */
363 void dump_core_and_abort(int target_sig
)
365 CPUState
*cpu
= thread_cpu
;
366 CPUArchState
*env
= cpu_env(cpu
);
367 TaskState
*ts
= get_task_state(cpu
);
370 struct sigaction act
;
372 host_sig
= target_to_host_signal(target_sig
);
373 gdb_signalled(env
, target_sig
);
375 /* Dump core if supported by target binary format */
376 if (core_dump_signal(target_sig
) && (ts
->bprm
->core_dump
!= NULL
)) {
379 ((*ts
->bprm
->core_dump
)(target_sig
, env
) == 0);
382 struct rlimit nodump
;
385 * We already dumped the core of target process, we don't want
386 * a coredump of qemu itself.
388 getrlimit(RLIMIT_CORE
, &nodump
);
390 setrlimit(RLIMIT_CORE
, &nodump
);
391 (void) fprintf(stderr
, "qemu: uncaught target signal %d (%s) "
392 "- %s\n", target_sig
, strsignal(host_sig
), "core dumped");
396 * The proper exit code for dying from an uncaught signal is
397 * -<signal>. The kernel doesn't allow exit() or _exit() to pass
398 * a negative value. To get the proper exit code we need to
399 * actually die from an uncaught signal. Here the default signal
400 * handler is installed, we send ourself a signal and we wait for
403 memset(&act
, 0, sizeof(act
));
404 sigfillset(&act
.sa_mask
);
405 act
.sa_handler
= SIG_DFL
;
406 sigaction(host_sig
, &act
, NULL
);
408 kill(getpid(), host_sig
);
411 * Make sure the signal isn't masked (just reuse the mask inside
414 sigdelset(&act
.sa_mask
, host_sig
);
415 sigsuspend(&act
.sa_mask
);
422 * Queue a signal so that it will be send to the virtual CPU as soon as
425 void queue_signal(CPUArchState
*env
, int sig
, int si_type
,
426 target_siginfo_t
*info
)
428 CPUState
*cpu
= env_cpu(env
);
429 TaskState
*ts
= get_task_state(cpu
);
431 trace_user_queue_signal(env
, sig
);
433 info
->si_code
= deposit32(info
->si_code
, 24, 8, si_type
);
435 ts
->sync_signal
.info
= *info
;
436 ts
->sync_signal
.pending
= sig
;
437 /* Signal that a new signal is pending. */
438 qatomic_set(&ts
->signal_pending
, 1);
442 static int fatal_signal(int sig
)
448 case TARGET_SIGWINCH
:
450 /* Ignored by default. */
457 /* Job control signals. */
465 * Force a synchronously taken QEMU_SI_FAULT signal. For QEMU the
466 * 'force' part is handled in process_pending_signals().
468 void force_sig_fault(int sig
, int code
, abi_ulong addr
)
470 CPUState
*cpu
= thread_cpu
;
471 target_siginfo_t info
= {};
477 queue_signal(cpu_env(cpu
), sig
, QEMU_SI_FAULT
, &info
);
480 static void host_signal_handler(int host_sig
, siginfo_t
*info
, void *puc
)
482 CPUState
*cpu
= thread_cpu
;
483 TaskState
*ts
= get_task_state(cpu
);
484 target_siginfo_t tinfo
;
485 ucontext_t
*uc
= puc
;
486 struct emulated_sigtable
*k
;
489 bool sync_sig
= false;
492 * Non-spoofed SIGSEGV and SIGBUS are synchronous, and need special
493 * handling wrt signal blocking and unwinding.
495 if ((host_sig
== SIGSEGV
|| host_sig
== SIGBUS
) && info
->si_code
> 0) {
496 MMUAccessType access_type
;
501 host_addr
= (uintptr_t)info
->si_addr
;
504 * Convert forcefully to guest address space: addresses outside
505 * reserved_va are still valid to report via SEGV_MAPERR.
507 guest_addr
= h2g_nocheck(host_addr
);
509 pc
= host_signal_pc(uc
);
510 is_write
= host_signal_write(info
, uc
);
511 access_type
= adjust_signal_pc(&pc
, is_write
);
513 if (host_sig
== SIGSEGV
) {
516 if (info
->si_code
== SEGV_ACCERR
&& h2g_valid(host_addr
)) {
517 /* If this was a write to a TB protected page, restart. */
519 handle_sigsegv_accerr_write(cpu
, &uc
->uc_sigmask
,
525 * With reserved_va, the whole address space is PROT_NONE,
526 * which means that we may get ACCERR when we want MAPERR.
528 if (page_get_flags(guest_addr
) & PAGE_VALID
) {
531 info
->si_code
= SEGV_MAPERR
;
535 sigprocmask(SIG_SETMASK
, &uc
->uc_sigmask
, NULL
);
536 cpu_loop_exit_sigsegv(cpu
, guest_addr
, access_type
, maperr
, pc
);
538 sigprocmask(SIG_SETMASK
, &uc
->uc_sigmask
, NULL
);
539 if (info
->si_code
== BUS_ADRALN
) {
540 cpu_loop_exit_sigbus(cpu
, guest_addr
, access_type
, pc
);
547 /* Get the target signal number. */
548 guest_sig
= host_to_target_signal(host_sig
);
549 if (guest_sig
< 1 || guest_sig
> TARGET_NSIG
) {
552 trace_user_host_signal(cpu
, host_sig
, guest_sig
);
554 host_to_target_siginfo_noswap(&tinfo
, info
);
556 k
= &ts
->sigtab
[guest_sig
- 1];
558 k
->pending
= guest_sig
;
559 ts
->signal_pending
= 1;
562 * For synchronous signals, unwind the cpu state to the faulting
563 * insn and then exit back to the main loop so that the signal
564 * is delivered immediately.
567 cpu
->exception_index
= EXCP_INTERRUPT
;
568 cpu_loop_exit_restore(cpu
, pc
);
571 rewind_if_in_safe_syscall(puc
);
574 * Block host signals until target signal handler entered. We
575 * can't block SIGSEGV or SIGBUS while we're executing guest
576 * code in case the guest code provokes one in the window between
577 * now and it getting out to the main loop. Signals will be
578 * unblocked again in process_pending_signals().
580 sigfillset(&uc
->uc_sigmask
);
581 sigdelset(&uc
->uc_sigmask
, SIGSEGV
);
582 sigdelset(&uc
->uc_sigmask
, SIGBUS
);
584 /* Interrupt the virtual CPU as soon as possible. */
585 cpu_exit(thread_cpu
);
588 /* do_sigaltstack() returns target values and errnos. */
589 /* compare to kern/kern_sig.c sys_sigaltstack() and kern_sigaltstack() */
590 abi_long
do_sigaltstack(abi_ulong uss_addr
, abi_ulong uoss_addr
, abi_ulong sp
)
592 TaskState
*ts
= get_task_state(thread_cpu
);
597 /* Save current signal stack params */
598 oss
.ss_sp
= tswapl(ts
->sigaltstack_used
.ss_sp
);
599 oss
.ss_size
= tswapl(ts
->sigaltstack_used
.ss_size
);
600 oss
.ss_flags
= tswapl(sas_ss_flags(ts
, sp
));
606 size_t minstacksize
= TARGET_MINSIGSTKSZ
;
608 ret
= -TARGET_EFAULT
;
609 if (!lock_user_struct(VERIFY_READ
, uss
, uss_addr
, 1)) {
612 __get_user(ss
.ss_sp
, &uss
->ss_sp
);
613 __get_user(ss
.ss_size
, &uss
->ss_size
);
614 __get_user(ss
.ss_flags
, &uss
->ss_flags
);
615 unlock_user_struct(uss
, uss_addr
, 0);
618 if (on_sig_stack(ts
, sp
)) {
622 ret
= -TARGET_EINVAL
;
623 if (ss
.ss_flags
!= TARGET_SS_DISABLE
624 && ss
.ss_flags
!= TARGET_SS_ONSTACK
625 && ss
.ss_flags
!= 0) {
629 if (ss
.ss_flags
== TARGET_SS_DISABLE
) {
633 ret
= -TARGET_ENOMEM
;
634 if (ss
.ss_size
< minstacksize
) {
639 ts
->sigaltstack_used
.ss_sp
= ss
.ss_sp
;
640 ts
->sigaltstack_used
.ss_size
= ss
.ss_size
;
644 ret
= -TARGET_EFAULT
;
645 if (copy_to_user(uoss_addr
, &oss
, sizeof(oss
))) {
655 /* do_sigaction() return host values and errnos */
656 int do_sigaction(int sig
, const struct target_sigaction
*act
,
657 struct target_sigaction
*oact
)
659 struct target_sigaction
*k
;
660 struct sigaction act1
;
664 if (sig
< 1 || sig
> TARGET_NSIG
) {
665 return -TARGET_EINVAL
;
668 if ((sig
== TARGET_SIGKILL
|| sig
== TARGET_SIGSTOP
) &&
669 act
!= NULL
&& act
->_sa_handler
!= TARGET_SIG_DFL
) {
670 return -TARGET_EINVAL
;
673 if (block_signals()) {
674 return -TARGET_ERESTART
;
677 k
= &sigact_table
[sig
- 1];
679 oact
->_sa_handler
= tswapal(k
->_sa_handler
);
680 oact
->sa_flags
= tswap32(k
->sa_flags
);
681 oact
->sa_mask
= k
->sa_mask
;
684 k
->_sa_handler
= tswapal(act
->_sa_handler
);
685 k
->sa_flags
= tswap32(act
->sa_flags
);
686 k
->sa_mask
= act
->sa_mask
;
688 /* Update the host signal state. */
689 host_sig
= target_to_host_signal(sig
);
690 if (host_sig
!= SIGSEGV
&& host_sig
!= SIGBUS
) {
691 memset(&act1
, 0, sizeof(struct sigaction
));
692 sigfillset(&act1
.sa_mask
);
693 act1
.sa_flags
= SA_SIGINFO
;
694 if (k
->sa_flags
& TARGET_SA_RESTART
) {
695 act1
.sa_flags
|= SA_RESTART
;
698 * Note: It is important to update the host kernel signal mask to
699 * avoid getting unexpected interrupted system calls.
701 if (k
->_sa_handler
== TARGET_SIG_IGN
) {
702 act1
.sa_sigaction
= (void *)SIG_IGN
;
703 } else if (k
->_sa_handler
== TARGET_SIG_DFL
) {
704 if (fatal_signal(sig
)) {
705 act1
.sa_sigaction
= host_signal_handler
;
707 act1
.sa_sigaction
= (void *)SIG_DFL
;
710 act1
.sa_sigaction
= host_signal_handler
;
712 ret
= sigaction(host_sig
, &act1
, NULL
);
718 static inline abi_ulong
get_sigframe(struct target_sigaction
*ka
,
719 CPUArchState
*env
, size_t frame_size
)
721 TaskState
*ts
= get_task_state(thread_cpu
);
724 /* Use default user stack */
725 sp
= get_sp_from_cpustate(env
);
727 if ((ka
->sa_flags
& TARGET_SA_ONSTACK
) && sas_ss_flags(ts
, sp
) == 0) {
728 sp
= ts
->sigaltstack_used
.ss_sp
+ ts
->sigaltstack_used
.ss_size
;
731 /* TODO: make this a target_arch function / define */
732 #if defined(TARGET_ARM)
733 return (sp
- frame_size
) & ~7;
734 #elif defined(TARGET_AARCH64)
735 return (sp
- frame_size
) & ~15;
737 return sp
- frame_size
;
741 /* compare to $M/$M/exec_machdep.c sendsig and sys/kern/kern_sig.c sigexit */
743 static void setup_frame(int sig
, int code
, struct target_sigaction
*ka
,
744 target_sigset_t
*set
, target_siginfo_t
*tinfo
, CPUArchState
*env
)
746 struct target_sigframe
*frame
;
747 abi_ulong frame_addr
;
750 frame_addr
= get_sigframe(ka
, env
, sizeof(*frame
));
751 trace_user_setup_frame(env
, frame_addr
);
752 if (!lock_user_struct(VERIFY_WRITE
, frame
, frame_addr
, 0)) {
753 unlock_user_struct(frame
, frame_addr
, 1);
754 dump_core_and_abort(TARGET_SIGILL
);
758 memset(frame
, 0, sizeof(*frame
));
759 setup_sigframe_arch(env
, frame_addr
, frame
, 0);
761 for (i
= 0; i
< TARGET_NSIG_WORDS
; i
++) {
762 __put_user(set
->__bits
[i
], &frame
->sf_uc
.uc_sigmask
.__bits
[i
]);
766 frame
->sf_si
.si_signo
= tinfo
->si_signo
;
767 frame
->sf_si
.si_errno
= tinfo
->si_errno
;
768 frame
->sf_si
.si_code
= tinfo
->si_code
;
769 frame
->sf_si
.si_pid
= tinfo
->si_pid
;
770 frame
->sf_si
.si_uid
= tinfo
->si_uid
;
771 frame
->sf_si
.si_status
= tinfo
->si_status
;
772 frame
->sf_si
.si_addr
= tinfo
->si_addr
;
773 /* see host_to_target_siginfo_noswap() for more details */
774 frame
->sf_si
.si_value
.sival_ptr
= tinfo
->si_value
.sival_ptr
;
776 * At this point, whatever is in the _reason union is complete
777 * and in target order, so just copy the whole thing over, even
778 * if it's too large for this specific signal.
779 * host_to_target_siginfo_noswap() and tswap_siginfo() have ensured
782 memcpy(&frame
->sf_si
._reason
, &tinfo
->_reason
,
783 sizeof(tinfo
->_reason
));
786 set_sigtramp_args(env
, sig
, frame
, frame_addr
, ka
);
788 unlock_user_struct(frame
, frame_addr
, 1);
791 static int reset_signal_mask(target_ucontext_t
*ucontext
)
795 target_sigset_t target_set
;
796 TaskState
*ts
= get_task_state(thread_cpu
);
798 for (i
= 0; i
< TARGET_NSIG_WORDS
; i
++) {
799 __get_user(target_set
.__bits
[i
], &ucontext
->uc_sigmask
.__bits
[i
]);
801 target_to_host_sigset_internal(&blocked
, &target_set
);
802 ts
->signal_mask
= blocked
;
807 /* See sys/$M/$M/exec_machdep.c sigreturn() */
808 long do_sigreturn(CPUArchState
*env
, abi_ulong addr
)
811 abi_ulong target_ucontext
;
812 target_ucontext_t
*ucontext
= NULL
;
814 /* Get the target ucontext address from the stack frame */
815 ret
= get_ucontext_sigreturn(env
, addr
, &target_ucontext
);
819 trace_user_do_sigreturn(env
, addr
);
820 if (!lock_user_struct(VERIFY_READ
, ucontext
, target_ucontext
, 0)) {
824 /* Set the register state back to before the signal. */
825 if (set_mcontext(env
, &ucontext
->uc_mcontext
, 1)) {
829 /* And reset the signal mask. */
830 if (reset_signal_mask(ucontext
)) {
834 unlock_user_struct(ucontext
, target_ucontext
, 0);
835 return -TARGET_EJUSTRETURN
;
838 if (ucontext
!= NULL
) {
839 unlock_user_struct(ucontext
, target_ucontext
, 0);
841 return -TARGET_EFAULT
;
844 void signal_init(void)
846 TaskState
*ts
= get_task_state(thread_cpu
);
847 struct sigaction act
;
848 struct sigaction oact
;
852 /* Set the signal mask from the host mask. */
853 sigprocmask(0, 0, &ts
->signal_mask
);
855 sigfillset(&act
.sa_mask
);
856 act
.sa_sigaction
= host_signal_handler
;
857 act
.sa_flags
= SA_SIGINFO
;
859 for (i
= 1; i
<= TARGET_NSIG
; i
++) {
860 host_sig
= target_to_host_signal(i
);
861 sigaction(host_sig
, NULL
, &oact
);
862 if (oact
.sa_sigaction
== (void *)SIG_IGN
) {
863 sigact_table
[i
- 1]._sa_handler
= TARGET_SIG_IGN
;
864 } else if (oact
.sa_sigaction
== (void *)SIG_DFL
) {
865 sigact_table
[i
- 1]._sa_handler
= TARGET_SIG_DFL
;
868 * If there's already a handler installed then something has
869 * gone horribly wrong, so don't even try to handle that case.
870 * Install some handlers for our own use. We need at least
871 * SIGSEGV and SIGBUS, to detect exceptions. We can not just
872 * trap all signals because it affects syscall interrupt
873 * behavior. But do trap all default-fatal signals.
875 if (fatal_signal(i
)) {
876 sigaction(host_sig
, &act
, NULL
);
881 static void handle_pending_signal(CPUArchState
*env
, int sig
,
882 struct emulated_sigtable
*k
)
884 CPUState
*cpu
= env_cpu(env
);
885 TaskState
*ts
= get_task_state(cpu
);
886 struct target_sigaction
*sa
;
890 target_siginfo_t tinfo
;
891 target_sigset_t target_old_set
;
893 trace_user_handle_signal(env
, sig
);
897 sig
= gdb_handlesig(cpu
, sig
, NULL
, &k
->info
, sizeof(k
->info
));
900 handler
= TARGET_SIG_IGN
;
902 sa
= &sigact_table
[sig
- 1];
903 handler
= sa
->_sa_handler
;
907 print_taken_signal(sig
, &k
->info
);
910 if (handler
== TARGET_SIG_DFL
) {
912 * default handler : ignore some signal. The other are job
915 if (sig
== TARGET_SIGTSTP
|| sig
== TARGET_SIGTTIN
||
916 sig
== TARGET_SIGTTOU
) {
917 kill(getpid(), SIGSTOP
);
918 } else if (sig
!= TARGET_SIGCHLD
&& sig
!= TARGET_SIGURG
&&
919 sig
!= TARGET_SIGINFO
&& sig
!= TARGET_SIGWINCH
&&
920 sig
!= TARGET_SIGCONT
) {
921 dump_core_and_abort(sig
);
923 } else if (handler
== TARGET_SIG_IGN
) {
925 } else if (handler
== TARGET_SIG_ERR
) {
926 dump_core_and_abort(sig
);
928 /* compute the blocked signals during the handler execution */
929 sigset_t
*blocked_set
;
931 target_to_host_sigset(&set
, &sa
->sa_mask
);
933 * SA_NODEFER indicates that the current signal should not be
934 * blocked during the handler.
936 if (!(sa
->sa_flags
& TARGET_SA_NODEFER
)) {
937 sigaddset(&set
, target_to_host_signal(sig
));
941 * Save the previous blocked signal state to restore it at the
942 * end of the signal execution (see do_sigreturn).
944 host_to_target_sigset_internal(&target_old_set
, &ts
->signal_mask
);
946 blocked_set
= ts
->in_sigsuspend
?
947 &ts
->sigsuspend_mask
: &ts
->signal_mask
;
948 sigorset(&ts
->signal_mask
, blocked_set
, &set
);
949 ts
->in_sigsuspend
= false;
950 sigprocmask(SIG_SETMASK
, &ts
->signal_mask
, NULL
);
952 /* XXX VM86 on x86 ??? */
954 code
= k
->info
.si_code
; /* From host, so no si_type */
955 /* prepare the stack frame of the virtual CPU */
956 if (sa
->sa_flags
& TARGET_SA_SIGINFO
) {
957 tswap_siginfo(&tinfo
, &k
->info
);
958 setup_frame(sig
, code
, sa
, &target_old_set
, &tinfo
, env
);
960 setup_frame(sig
, code
, sa
, &target_old_set
, NULL
, env
);
962 if (sa
->sa_flags
& TARGET_SA_RESETHAND
) {
963 sa
->_sa_handler
= TARGET_SIG_DFL
;
968 void process_pending_signals(CPUArchState
*env
)
970 CPUState
*cpu
= env_cpu(env
);
972 sigset_t
*blocked_set
, set
;
973 struct emulated_sigtable
*k
;
974 TaskState
*ts
= get_task_state(cpu
);
976 while (qatomic_read(&ts
->signal_pending
)) {
978 sigprocmask(SIG_SETMASK
, &set
, 0);
981 sig
= ts
->sync_signal
.pending
;
984 * Synchronous signals are forced by the emulated CPU in some way.
985 * If they are set to ignore, restore the default handler (see
986 * sys/kern_sig.c trapsignal() and execsigs() for this behavior)
987 * though maybe this is done only when forcing exit for non SIGCHLD.
989 if (sigismember(&ts
->signal_mask
, target_to_host_signal(sig
)) ||
990 sigact_table
[sig
- 1]._sa_handler
== TARGET_SIG_IGN
) {
991 sigdelset(&ts
->signal_mask
, target_to_host_signal(sig
));
992 sigact_table
[sig
- 1]._sa_handler
= TARGET_SIG_DFL
;
994 handle_pending_signal(env
, sig
, &ts
->sync_signal
);
998 for (sig
= 1; sig
<= TARGET_NSIG
; sig
++, k
++) {
999 blocked_set
= ts
->in_sigsuspend
?
1000 &ts
->sigsuspend_mask
: &ts
->signal_mask
;
1002 !sigismember(blocked_set
, target_to_host_signal(sig
))) {
1003 handle_pending_signal(env
, sig
, k
);
1005 * Restart scan from the beginning, as handle_pending_signal
1006 * might have resulted in a new synchronous signal (eg SIGSEGV).
1013 * Unblock signals and check one more time. Unblocking signals may cause
1014 * us to take another host signal, which will set signal_pending again.
1016 qatomic_set(&ts
->signal_pending
, 0);
1017 ts
->in_sigsuspend
= false;
1018 set
= ts
->signal_mask
;
1019 sigdelset(&set
, SIGSEGV
);
1020 sigdelset(&set
, SIGBUS
);
1021 sigprocmask(SIG_SETMASK
, &set
, 0);
1023 ts
->in_sigsuspend
= false;
1026 void cpu_loop_exit_sigsegv(CPUState
*cpu
, target_ulong addr
,
1027 MMUAccessType access_type
, bool maperr
, uintptr_t ra
)
1029 const TCGCPUOps
*tcg_ops
= CPU_GET_CLASS(cpu
)->tcg_ops
;
1031 if (tcg_ops
->record_sigsegv
) {
1032 tcg_ops
->record_sigsegv(cpu
, addr
, access_type
, maperr
, ra
);
1035 force_sig_fault(TARGET_SIGSEGV
,
1036 maperr
? TARGET_SEGV_MAPERR
: TARGET_SEGV_ACCERR
,
1038 cpu
->exception_index
= EXCP_INTERRUPT
;
1039 cpu_loop_exit_restore(cpu
, ra
);
1042 void cpu_loop_exit_sigbus(CPUState
*cpu
, target_ulong addr
,
1043 MMUAccessType access_type
, uintptr_t ra
)
1045 const TCGCPUOps
*tcg_ops
= CPU_GET_CLASS(cpu
)->tcg_ops
;
1047 if (tcg_ops
->record_sigbus
) {
1048 tcg_ops
->record_sigbus(cpu
, addr
, access_type
, ra
);
1051 force_sig_fault(TARGET_SIGBUS
, TARGET_BUS_ADRALN
, addr
);
1052 cpu
->exception_index
= EXCP_INTERRUPT
;
1053 cpu_loop_exit_restore(cpu
, ra
);