blob: 44b2d3b35a0d8855122d9284c5dba47ce6ba7590 [file] [log] [blame]
bellard31e31b82003-02-18 22:55:36 +00001/*
bellard66fb9762003-03-23 01:06:05 +00002 * Emulation of Linux signals
ths5fafdf22007-09-16 21:08:06 +00003 *
bellard31e31b82003-02-18 22:55:36 +00004 * Copyright (c) 2003 Fabrice Bellard
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
Blue Swirl8167ee82009-07-16 20:47:01 +000017 * along with this program; if not, see <http://www.gnu.org/licenses/>.
bellard31e31b82003-02-18 22:55:36 +000018 */
Peter Maydelld39594e2016-01-26 18:17:02 +000019#include "qemu/osdep.h"
Peter Maydella70dadc2016-05-27 15:51:59 +010020#include "qemu/bitops.h"
bellard31e31b82003-02-18 22:55:36 +000021#include <sys/ucontext.h>
Mika Westerbergedf8e2a2009-04-07 09:57:11 +030022#include <sys/resource.h>
bellard31e31b82003-02-18 22:55:36 +000023
bellard3ef693a2003-03-23 20:17:16 +000024#include "qemu.h"
blueswir17d99a002009-01-14 19:00:36 +000025#include "qemu-common.h"
Paolo Bonzinic8ee0a42015-11-13 13:52:21 +010026#include "trace.h"
Laurent Vivierbefb7442018-04-24 21:26:16 +020027#include "signal-common.h"
bellard66fb9762003-03-23 01:06:05 +000028
Laurent Vivierbefb7442018-04-24 21:26:16 +020029struct target_sigaltstack target_sigaltstack_used = {
thsa04e1342007-09-27 13:57:58 +000030 .ss_sp = 0,
31 .ss_size = 0,
32 .ss_flags = TARGET_SS_DISABLE,
33};
34
pbrook624f7972008-05-31 16:11:38 +000035static struct target_sigaction sigact_table[TARGET_NSIG];
bellard31e31b82003-02-18 22:55:36 +000036
ths5fafdf22007-09-16 21:08:06 +000037static void host_signal_handler(int host_signum, siginfo_t *info,
bellard66fb9762003-03-23 01:06:05 +000038 void *puc);
39
Arnaud Patard3ca05582009-03-30 01:18:20 +020040static uint8_t host_to_target_signal_table[_NSIG] = {
bellard9e5f5282003-07-13 17:33:54 +000041 [SIGHUP] = TARGET_SIGHUP,
42 [SIGINT] = TARGET_SIGINT,
43 [SIGQUIT] = TARGET_SIGQUIT,
44 [SIGILL] = TARGET_SIGILL,
45 [SIGTRAP] = TARGET_SIGTRAP,
46 [SIGABRT] = TARGET_SIGABRT,
bellard01e3b762003-09-30 21:10:14 +000047/* [SIGIOT] = TARGET_SIGIOT,*/
bellard9e5f5282003-07-13 17:33:54 +000048 [SIGBUS] = TARGET_SIGBUS,
49 [SIGFPE] = TARGET_SIGFPE,
50 [SIGKILL] = TARGET_SIGKILL,
51 [SIGUSR1] = TARGET_SIGUSR1,
52 [SIGSEGV] = TARGET_SIGSEGV,
53 [SIGUSR2] = TARGET_SIGUSR2,
54 [SIGPIPE] = TARGET_SIGPIPE,
55 [SIGALRM] = TARGET_SIGALRM,
56 [SIGTERM] = TARGET_SIGTERM,
57#ifdef SIGSTKFLT
58 [SIGSTKFLT] = TARGET_SIGSTKFLT,
59#endif
60 [SIGCHLD] = TARGET_SIGCHLD,
61 [SIGCONT] = TARGET_SIGCONT,
62 [SIGSTOP] = TARGET_SIGSTOP,
63 [SIGTSTP] = TARGET_SIGTSTP,
64 [SIGTTIN] = TARGET_SIGTTIN,
65 [SIGTTOU] = TARGET_SIGTTOU,
66 [SIGURG] = TARGET_SIGURG,
67 [SIGXCPU] = TARGET_SIGXCPU,
68 [SIGXFSZ] = TARGET_SIGXFSZ,
69 [SIGVTALRM] = TARGET_SIGVTALRM,
70 [SIGPROF] = TARGET_SIGPROF,
71 [SIGWINCH] = TARGET_SIGWINCH,
72 [SIGIO] = TARGET_SIGIO,
73 [SIGPWR] = TARGET_SIGPWR,
74 [SIGSYS] = TARGET_SIGSYS,
75 /* next signals stay the same */
pbrook624f7972008-05-31 16:11:38 +000076 /* Nasty hack: Reverse SIGRTMIN and SIGRTMAX to avoid overlap with
Dong Xu Wangb4916d72011-11-22 18:06:17 +080077 host libpthread signals. This assumes no one actually uses SIGRTMAX :-/
pbrook624f7972008-05-31 16:11:38 +000078 To fix this properly we need to do manual signal delivery multiplexed
79 over a single host signal. */
80 [__SIGRTMIN] = __SIGRTMAX,
81 [__SIGRTMAX] = __SIGRTMIN,
bellard9e5f5282003-07-13 17:33:54 +000082};
Arnaud Patard3ca05582009-03-30 01:18:20 +020083static uint8_t target_to_host_signal_table[_NSIG];
bellard9e5f5282003-07-13 17:33:54 +000084
pbrook1d9d8b52009-04-16 15:17:02 +000085int host_to_target_signal(int sig)
bellard31e31b82003-02-18 22:55:36 +000086{
Andreas Schwab167c50d2013-07-02 14:04:12 +010087 if (sig < 0 || sig >= _NSIG)
pbrook4cb05962008-05-30 18:05:19 +000088 return sig;
bellard9e5f5282003-07-13 17:33:54 +000089 return host_to_target_signal_table[sig];
bellard31e31b82003-02-18 22:55:36 +000090}
91
pbrook4cb05962008-05-30 18:05:19 +000092int target_to_host_signal(int sig)
bellard31e31b82003-02-18 22:55:36 +000093{
Andreas Schwab167c50d2013-07-02 14:04:12 +010094 if (sig < 0 || sig >= _NSIG)
pbrook4cb05962008-05-30 18:05:19 +000095 return sig;
bellard9e5f5282003-07-13 17:33:54 +000096 return target_to_host_signal_table[sig];
bellard31e31b82003-02-18 22:55:36 +000097}
98
Anthony Liguoric227f092009-10-01 16:12:16 -050099static inline void target_sigaddset(target_sigset_t *set, int signum)
pbrookf5545b52008-05-30 22:37:07 +0000100{
101 signum--;
102 abi_ulong mask = (abi_ulong)1 << (signum % TARGET_NSIG_BPW);
103 set->sig[signum / TARGET_NSIG_BPW] |= mask;
104}
105
Anthony Liguoric227f092009-10-01 16:12:16 -0500106static inline int target_sigismember(const target_sigset_t *set, int signum)
pbrookf5545b52008-05-30 22:37:07 +0000107{
108 signum--;
109 abi_ulong mask = (abi_ulong)1 << (signum % TARGET_NSIG_BPW);
110 return ((set->sig[signum / TARGET_NSIG_BPW] & mask) != 0);
111}
112
Laurent Vivierbefb7442018-04-24 21:26:16 +0200113void host_to_target_sigset_internal(target_sigset_t *d,
114 const sigset_t *s)
bellard66fb9762003-03-23 01:06:05 +0000115{
116 int i;
pbrookf5545b52008-05-30 22:37:07 +0000117 target_sigemptyset(d);
118 for (i = 1; i <= TARGET_NSIG; i++) {
119 if (sigismember(s, i)) {
120 target_sigaddset(d, host_to_target_signal(i));
121 }
bellard9e5f5282003-07-13 17:33:54 +0000122 }
bellard66fb9762003-03-23 01:06:05 +0000123}
124
Anthony Liguoric227f092009-10-01 16:12:16 -0500125void host_to_target_sigset(target_sigset_t *d, const sigset_t *s)
bellard92319442004-06-19 16:58:13 +0000126{
Anthony Liguoric227f092009-10-01 16:12:16 -0500127 target_sigset_t d1;
bellard92319442004-06-19 16:58:13 +0000128 int i;
129
130 host_to_target_sigset_internal(&d1, s);
131 for(i = 0;i < TARGET_NSIG_WORDS; i++)
Matthias Brauncbb21ee2011-08-12 19:57:41 +0200132 d->sig[i] = tswapal(d1.sig[i]);
bellard92319442004-06-19 16:58:13 +0000133}
134
Laurent Vivierbefb7442018-04-24 21:26:16 +0200135void target_to_host_sigset_internal(sigset_t *d,
136 const target_sigset_t *s)
bellard66fb9762003-03-23 01:06:05 +0000137{
138 int i;
pbrookf5545b52008-05-30 22:37:07 +0000139 sigemptyset(d);
140 for (i = 1; i <= TARGET_NSIG; i++) {
141 if (target_sigismember(s, i)) {
142 sigaddset(d, target_to_host_signal(i));
143 }
Timothy E Baldwinda7c8642016-05-12 18:47:27 +0100144 }
bellard66fb9762003-03-23 01:06:05 +0000145}
146
Anthony Liguoric227f092009-10-01 16:12:16 -0500147void target_to_host_sigset(sigset_t *d, const target_sigset_t *s)
bellard92319442004-06-19 16:58:13 +0000148{
Anthony Liguoric227f092009-10-01 16:12:16 -0500149 target_sigset_t s1;
bellard92319442004-06-19 16:58:13 +0000150 int i;
151
152 for(i = 0;i < TARGET_NSIG_WORDS; i++)
Matthias Brauncbb21ee2011-08-12 19:57:41 +0200153 s1.sig[i] = tswapal(s->sig[i]);
bellard92319442004-06-19 16:58:13 +0000154 target_to_host_sigset_internal(d, &s1);
155}
ths3b46e622007-09-17 08:09:54 +0000156
blueswir1992f48a2007-10-14 16:27:31 +0000157void host_to_target_old_sigset(abi_ulong *old_sigset,
bellard66fb9762003-03-23 01:06:05 +0000158 const sigset_t *sigset)
159{
Anthony Liguoric227f092009-10-01 16:12:16 -0500160 target_sigset_t d;
bellard9e5f5282003-07-13 17:33:54 +0000161 host_to_target_sigset(&d, sigset);
162 *old_sigset = d.sig[0];
bellard66fb9762003-03-23 01:06:05 +0000163}
164
ths5fafdf22007-09-16 21:08:06 +0000165void target_to_host_old_sigset(sigset_t *sigset,
blueswir1992f48a2007-10-14 16:27:31 +0000166 const abi_ulong *old_sigset)
bellard66fb9762003-03-23 01:06:05 +0000167{
Anthony Liguoric227f092009-10-01 16:12:16 -0500168 target_sigset_t d;
bellard9e5f5282003-07-13 17:33:54 +0000169 int i;
170
171 d.sig[0] = *old_sigset;
172 for(i = 1;i < TARGET_NSIG_WORDS; i++)
173 d.sig[i] = 0;
174 target_to_host_sigset(sigset, &d);
bellard66fb9762003-03-23 01:06:05 +0000175}
176
Peter Maydell3d3efba2016-05-27 15:51:49 +0100177int block_signals(void)
178{
179 TaskState *ts = (TaskState *)thread_cpu->opaque;
180 sigset_t set;
Peter Maydell3d3efba2016-05-27 15:51:49 +0100181
182 /* It's OK to block everything including SIGSEGV, because we won't
183 * run any further guest code before unblocking signals in
184 * process_pending_signals().
185 */
186 sigfillset(&set);
187 sigprocmask(SIG_SETMASK, &set, 0);
188
Eduardo Habkost9be38592016-06-13 18:57:58 -0300189 return atomic_xchg(&ts->signal_pending, 1);
Peter Maydell3d3efba2016-05-27 15:51:49 +0100190}
191
Alex Barcelo1c275922014-03-14 14:36:55 +0000192/* Wrapper for sigprocmask function
193 * Emulates a sigprocmask in a safe way for the guest. Note that set and oldset
Peter Maydell3d3efba2016-05-27 15:51:49 +0100194 * are host signal set, not guest ones. Returns -TARGET_ERESTARTSYS if
195 * a signal was already pending and the syscall must be restarted, or
196 * 0 on success.
197 * If set is NULL, this is guaranteed not to fail.
Alex Barcelo1c275922014-03-14 14:36:55 +0000198 */
199int do_sigprocmask(int how, const sigset_t *set, sigset_t *oldset)
200{
Peter Maydell3d3efba2016-05-27 15:51:49 +0100201 TaskState *ts = (TaskState *)thread_cpu->opaque;
202
203 if (oldset) {
204 *oldset = ts->signal_mask;
205 }
Peter Maydella7ec0f92014-03-14 14:36:56 +0000206
207 if (set) {
Peter Maydell3d3efba2016-05-27 15:51:49 +0100208 int i;
Peter Maydella7ec0f92014-03-14 14:36:56 +0000209
Peter Maydell3d3efba2016-05-27 15:51:49 +0100210 if (block_signals()) {
211 return -TARGET_ERESTARTSYS;
212 }
Peter Maydella7ec0f92014-03-14 14:36:56 +0000213
214 switch (how) {
215 case SIG_BLOCK:
Peter Maydell3d3efba2016-05-27 15:51:49 +0100216 sigorset(&ts->signal_mask, &ts->signal_mask, set);
Peter Maydella7ec0f92014-03-14 14:36:56 +0000217 break;
218 case SIG_UNBLOCK:
Peter Maydell3d3efba2016-05-27 15:51:49 +0100219 for (i = 1; i <= NSIG; ++i) {
220 if (sigismember(set, i)) {
221 sigdelset(&ts->signal_mask, i);
222 }
Peter Maydella7ec0f92014-03-14 14:36:56 +0000223 }
224 break;
225 case SIG_SETMASK:
Peter Maydell3d3efba2016-05-27 15:51:49 +0100226 ts->signal_mask = *set;
Peter Maydella7ec0f92014-03-14 14:36:56 +0000227 break;
228 default:
229 g_assert_not_reached();
230 }
Peter Maydell3d3efba2016-05-27 15:51:49 +0100231
232 /* Silently ignore attempts to change blocking status of KILL or STOP */
233 sigdelset(&ts->signal_mask, SIGKILL);
234 sigdelset(&ts->signal_mask, SIGSTOP);
Peter Maydella7ec0f92014-03-14 14:36:56 +0000235 }
Peter Maydell3d3efba2016-05-27 15:51:49 +0100236 return 0;
Alex Barcelo1c275922014-03-14 14:36:55 +0000237}
238
Richard Hendersone8f29042018-05-27 14:02:17 -0500239#if !defined(TARGET_NIOS2)
Peter Maydell3d3efba2016-05-27 15:51:49 +0100240/* Just set the guest's signal mask to the specified value; the
241 * caller is assumed to have called block_signals() already.
242 */
Laurent Vivierbefb7442018-04-24 21:26:16 +0200243void set_sigmask(const sigset_t *set)
Peter Maydell9eede5b2016-05-27 15:51:46 +0100244{
Peter Maydell3d3efba2016-05-27 15:51:49 +0100245 TaskState *ts = (TaskState *)thread_cpu->opaque;
246
247 ts->signal_mask = *set;
Peter Maydell9eede5b2016-05-27 15:51:46 +0100248}
249#endif
250
Laurent Vivier465e2372018-04-11 21:23:47 +0200251/* sigaltstack management */
252
253int on_sig_stack(unsigned long sp)
254{
255 return (sp - target_sigaltstack_used.ss_sp
256 < target_sigaltstack_used.ss_size);
257}
258
259int sas_ss_flags(unsigned long sp)
260{
261 return (target_sigaltstack_used.ss_size == 0 ? SS_DISABLE
262 : on_sig_stack(sp) ? SS_ONSTACK : 0);
263}
264
265abi_ulong target_sigsp(abi_ulong sp, struct target_sigaction *ka)
266{
267 /*
268 * This is the X/Open sanctioned signal stack switching.
269 */
270 if ((ka->sa_flags & TARGET_SA_ONSTACK) && !sas_ss_flags(sp)) {
271 return target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
272 }
273 return sp;
274}
275
276void target_save_altstack(target_stack_t *uss, CPUArchState *env)
277{
278 __put_user(target_sigaltstack_used.ss_sp, &uss->ss_sp);
279 __put_user(sas_ss_flags(get_sp_from_cpustate(env)), &uss->ss_flags);
280 __put_user(target_sigaltstack_used.ss_size, &uss->ss_size);
281}
282
bellard9de5e442003-03-23 16:49:39 +0000283/* siginfo conversion */
284
Anthony Liguoric227f092009-10-01 16:12:16 -0500285static inline void host_to_target_siginfo_noswap(target_siginfo_t *tinfo,
bellard9de5e442003-03-23 16:49:39 +0000286 const siginfo_t *info)
bellard66fb9762003-03-23 01:06:05 +0000287{
Richard Hendersona05c6402012-09-15 11:34:20 -0700288 int sig = host_to_target_signal(info->si_signo);
Peter Maydella70dadc2016-05-27 15:51:59 +0100289 int si_code = info->si_code;
290 int si_type;
bellard9de5e442003-03-23 16:49:39 +0000291 tinfo->si_signo = sig;
292 tinfo->si_errno = 0;
pbrookafd7cd92008-05-31 12:14:21 +0000293 tinfo->si_code = info->si_code;
Richard Hendersona05c6402012-09-15 11:34:20 -0700294
Peter Maydell55d72a72016-06-13 11:22:05 +0100295 /* This memset serves two purposes:
296 * (1) ensure we don't leak random junk to the guest later
297 * (2) placate false positives from gcc about fields
298 * being used uninitialized if it chooses to inline both this
299 * function and tswap_siginfo() into host_to_target_siginfo().
300 */
301 memset(tinfo->_sifields._pad, 0, sizeof(tinfo->_sifields._pad));
302
Peter Maydella70dadc2016-05-27 15:51:59 +0100303 /* This is awkward, because we have to use a combination of
304 * the si_code and si_signo to figure out which of the union's
305 * members are valid. (Within the host kernel it is always possible
306 * to tell, but the kernel carefully avoids giving userspace the
307 * high 16 bits of si_code, so we don't have the information to
308 * do this the easy way...) We therefore make our best guess,
309 * bearing in mind that a guest can spoof most of the si_codes
310 * via rt_sigqueueinfo() if it likes.
311 *
312 * Once we have made our guess, we record it in the top 16 bits of
313 * the si_code, so that tswap_siginfo() later can use it.
314 * tswap_siginfo() will strip these top bits out before writing
315 * si_code to the guest (sign-extending the lower bits).
316 */
317
318 switch (si_code) {
319 case SI_USER:
320 case SI_TKILL:
321 case SI_KERNEL:
322 /* Sent via kill(), tkill() or tgkill(), or direct from the kernel.
323 * These are the only unspoofable si_code values.
324 */
325 tinfo->_sifields._kill._pid = info->si_pid;
326 tinfo->_sifields._kill._uid = info->si_uid;
327 si_type = QEMU_SI_KILL;
328 break;
329 default:
330 /* Everything else is spoofable. Make best guess based on signal */
331 switch (sig) {
332 case TARGET_SIGCHLD:
333 tinfo->_sifields._sigchld._pid = info->si_pid;
334 tinfo->_sifields._sigchld._uid = info->si_uid;
335 tinfo->_sifields._sigchld._status
Timothy E Baldwinda7c8642016-05-12 18:47:27 +0100336 = host_to_target_waitstatus(info->si_status);
Peter Maydella70dadc2016-05-27 15:51:59 +0100337 tinfo->_sifields._sigchld._utime = info->si_utime;
338 tinfo->_sifields._sigchld._stime = info->si_stime;
339 si_type = QEMU_SI_CHLD;
340 break;
341 case TARGET_SIGIO:
342 tinfo->_sifields._sigpoll._band = info->si_band;
343 tinfo->_sifields._sigpoll._fd = info->si_fd;
344 si_type = QEMU_SI_POLL;
345 break;
346 default:
347 /* Assume a sigqueue()/mq_notify()/rt_sigqueueinfo() source. */
348 tinfo->_sifields._rt._pid = info->si_pid;
349 tinfo->_sifields._rt._uid = info->si_uid;
350 /* XXX: potential problem if 64 bit */
351 tinfo->_sifields._rt._sigval.sival_ptr
Timothy E Baldwinda7c8642016-05-12 18:47:27 +0100352 = (abi_ulong)(unsigned long)info->si_value.sival_ptr;
Peter Maydella70dadc2016-05-27 15:51:59 +0100353 si_type = QEMU_SI_RT;
354 break;
355 }
356 break;
bellard9de5e442003-03-23 16:49:39 +0000357 }
Peter Maydella70dadc2016-05-27 15:51:59 +0100358
359 tinfo->si_code = deposit32(si_code, 16, 16, si_type);
bellard66fb9762003-03-23 01:06:05 +0000360}
361
Laurent Vivierbefb7442018-04-24 21:26:16 +0200362void tswap_siginfo(target_siginfo_t *tinfo,
363 const target_siginfo_t *info)
bellard9de5e442003-03-23 16:49:39 +0000364{
Peter Maydella70dadc2016-05-27 15:51:59 +0100365 int si_type = extract32(info->si_code, 16, 16);
366 int si_code = sextract32(info->si_code, 0, 16);
Richard Hendersona05c6402012-09-15 11:34:20 -0700367
Peter Maydella70dadc2016-05-27 15:51:59 +0100368 __put_user(info->si_signo, &tinfo->si_signo);
369 __put_user(info->si_errno, &tinfo->si_errno);
370 __put_user(si_code, &tinfo->si_code);
371
372 /* We can use our internal marker of which fields in the structure
373 * are valid, rather than duplicating the guesswork of
374 * host_to_target_siginfo_noswap() here.
375 */
376 switch (si_type) {
377 case QEMU_SI_KILL:
378 __put_user(info->_sifields._kill._pid, &tinfo->_sifields._kill._pid);
379 __put_user(info->_sifields._kill._uid, &tinfo->_sifields._kill._uid);
380 break;
381 case QEMU_SI_TIMER:
382 __put_user(info->_sifields._timer._timer1,
383 &tinfo->_sifields._timer._timer1);
384 __put_user(info->_sifields._timer._timer2,
385 &tinfo->_sifields._timer._timer2);
386 break;
387 case QEMU_SI_POLL:
388 __put_user(info->_sifields._sigpoll._band,
389 &tinfo->_sifields._sigpoll._band);
390 __put_user(info->_sifields._sigpoll._fd,
391 &tinfo->_sifields._sigpoll._fd);
392 break;
393 case QEMU_SI_FAULT:
394 __put_user(info->_sifields._sigfault._addr,
395 &tinfo->_sifields._sigfault._addr);
396 break;
397 case QEMU_SI_CHLD:
398 __put_user(info->_sifields._sigchld._pid,
399 &tinfo->_sifields._sigchld._pid);
400 __put_user(info->_sifields._sigchld._uid,
401 &tinfo->_sifields._sigchld._uid);
402 __put_user(info->_sifields._sigchld._status,
403 &tinfo->_sifields._sigchld._status);
404 __put_user(info->_sifields._sigchld._utime,
405 &tinfo->_sifields._sigchld._utime);
406 __put_user(info->_sifields._sigchld._stime,
407 &tinfo->_sifields._sigchld._stime);
408 break;
409 case QEMU_SI_RT:
410 __put_user(info->_sifields._rt._pid, &tinfo->_sifields._rt._pid);
411 __put_user(info->_sifields._rt._uid, &tinfo->_sifields._rt._uid);
412 __put_user(info->_sifields._rt._sigval.sival_ptr,
413 &tinfo->_sifields._rt._sigval.sival_ptr);
414 break;
415 default:
416 g_assert_not_reached();
bellard9de5e442003-03-23 16:49:39 +0000417 }
418}
419
Anthony Liguoric227f092009-10-01 16:12:16 -0500420void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info)
bellard9de5e442003-03-23 16:49:39 +0000421{
Peter Maydell55d72a72016-06-13 11:22:05 +0100422 target_siginfo_t tgt_tmp;
423 host_to_target_siginfo_noswap(&tgt_tmp, info);
424 tswap_siginfo(tinfo, &tgt_tmp);
bellard9de5e442003-03-23 16:49:39 +0000425}
426
427/* XXX: we support only POSIX RT signals are used. */
thsaa1f17c2007-07-11 22:48:58 +0000428/* XXX: find a solution for 64 bit (additional malloced data is needed) */
Anthony Liguoric227f092009-10-01 16:12:16 -0500429void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo)
bellard66fb9762003-03-23 01:06:05 +0000430{
Peter Maydell90c0f082016-05-27 15:52:01 +0100431 /* This conversion is used only for the rt_sigqueueinfo syscall,
432 * and so we know that the _rt fields are the valid ones.
433 */
434 abi_ulong sival_ptr;
435
436 __get_user(info->si_signo, &tinfo->si_signo);
437 __get_user(info->si_errno, &tinfo->si_errno);
438 __get_user(info->si_code, &tinfo->si_code);
439 __get_user(info->si_pid, &tinfo->_sifields._rt._pid);
440 __get_user(info->si_uid, &tinfo->_sifields._rt._uid);
441 __get_user(sival_ptr, &tinfo->_sifields._rt._sigval.sival_ptr);
442 info->si_value.sival_ptr = (void *)(long)sival_ptr;
bellard66fb9762003-03-23 01:06:05 +0000443}
444
aurel32ca587a82008-12-18 22:44:13 +0000445static int fatal_signal (int sig)
446{
447 switch (sig) {
448 case TARGET_SIGCHLD:
449 case TARGET_SIGURG:
450 case TARGET_SIGWINCH:
451 /* Ignored by default. */
452 return 0;
453 case TARGET_SIGCONT:
454 case TARGET_SIGSTOP:
455 case TARGET_SIGTSTP:
456 case TARGET_SIGTTIN:
457 case TARGET_SIGTTOU:
458 /* Job control signals. */
459 return 0;
460 default:
461 return 1;
462 }
463}
464
Mika Westerbergedf8e2a2009-04-07 09:57:11 +0300465/* returns 1 if given signal should dump core if not handled */
466static int core_dump_signal(int sig)
467{
468 switch (sig) {
469 case TARGET_SIGABRT:
470 case TARGET_SIGFPE:
471 case TARGET_SIGILL:
472 case TARGET_SIGQUIT:
473 case TARGET_SIGSEGV:
474 case TARGET_SIGTRAP:
475 case TARGET_SIGBUS:
476 return (1);
477 default:
478 return (0);
479 }
480}
481
bellard31e31b82003-02-18 22:55:36 +0000482void signal_init(void)
483{
Peter Maydell3d3efba2016-05-27 15:51:49 +0100484 TaskState *ts = (TaskState *)thread_cpu->opaque;
bellard31e31b82003-02-18 22:55:36 +0000485 struct sigaction act;
pbrook624f7972008-05-31 16:11:38 +0000486 struct sigaction oact;
bellard9e5f5282003-07-13 17:33:54 +0000487 int i, j;
pbrook624f7972008-05-31 16:11:38 +0000488 int host_sig;
bellard31e31b82003-02-18 22:55:36 +0000489
bellard9e5f5282003-07-13 17:33:54 +0000490 /* generate signal conversion tables */
Arnaud Patard3ca05582009-03-30 01:18:20 +0200491 for(i = 1; i < _NSIG; i++) {
bellard9e5f5282003-07-13 17:33:54 +0000492 if (host_to_target_signal_table[i] == 0)
493 host_to_target_signal_table[i] = i;
494 }
Arnaud Patard3ca05582009-03-30 01:18:20 +0200495 for(i = 1; i < _NSIG; i++) {
bellard9e5f5282003-07-13 17:33:54 +0000496 j = host_to_target_signal_table[i];
497 target_to_host_signal_table[j] = i;
498 }
ths3b46e622007-09-17 08:09:54 +0000499
Peter Maydell3d3efba2016-05-27 15:51:49 +0100500 /* Set the signal mask from the host mask. */
501 sigprocmask(0, 0, &ts->signal_mask);
502
bellard9de5e442003-03-23 16:49:39 +0000503 /* set all host signal handlers. ALL signals are blocked during
504 the handlers to serialize them. */
pbrook624f7972008-05-31 16:11:38 +0000505 memset(sigact_table, 0, sizeof(sigact_table));
506
bellard9de5e442003-03-23 16:49:39 +0000507 sigfillset(&act.sa_mask);
bellard31e31b82003-02-18 22:55:36 +0000508 act.sa_flags = SA_SIGINFO;
509 act.sa_sigaction = host_signal_handler;
pbrook624f7972008-05-31 16:11:38 +0000510 for(i = 1; i <= TARGET_NSIG; i++) {
Alex Bennée716cdbe2019-05-02 15:58:46 +0100511#ifdef TARGET_GPROF
512 if (i == SIGPROF) {
513 continue;
514 }
515#endif
pbrook624f7972008-05-31 16:11:38 +0000516 host_sig = target_to_host_signal(i);
517 sigaction(host_sig, NULL, &oact);
518 if (oact.sa_sigaction == (void *)SIG_IGN) {
519 sigact_table[i - 1]._sa_handler = TARGET_SIG_IGN;
520 } else if (oact.sa_sigaction == (void *)SIG_DFL) {
521 sigact_table[i - 1]._sa_handler = TARGET_SIG_DFL;
522 }
523 /* If there's already a handler installed then something has
524 gone horribly wrong, so don't even try to handle that case. */
aurel32ca587a82008-12-18 22:44:13 +0000525 /* Install some handlers for our own use. We need at least
526 SIGSEGV and SIGBUS, to detect exceptions. We can not just
527 trap all signals because it affects syscall interrupt
528 behavior. But do trap all default-fatal signals. */
529 if (fatal_signal (i))
pbrook624f7972008-05-31 16:11:38 +0000530 sigaction(host_sig, &act, NULL);
bellard31e31b82003-02-18 22:55:36 +0000531 }
bellard31e31b82003-02-18 22:55:36 +0000532}
533
Peter Maydellc599d4d2016-07-28 16:44:49 +0100534/* Force a synchronously taken signal. The kernel force_sig() function
535 * also forces the signal to "not blocked, not ignored", but for QEMU
536 * that work is done in process_pending_signals().
537 */
Laurent Vivierbefb7442018-04-24 21:26:16 +0200538void force_sig(int sig)
Peter Maydellc599d4d2016-07-28 16:44:49 +0100539{
540 CPUState *cpu = thread_cpu;
541 CPUArchState *env = cpu->env_ptr;
542 target_siginfo_t info;
543
544 info.si_signo = sig;
545 info.si_errno = 0;
546 info.si_code = TARGET_SI_KERNEL;
547 info._sifields._kill._pid = 0;
548 info._sifields._kill._uid = 0;
549 queue_signal(env, info.si_signo, QEMU_SI_KILL, &info);
550}
Peter Maydell09391662016-07-28 16:44:47 +0100551
552/* Force a SIGSEGV if we couldn't write to memory trying to set
553 * up the signal frame. oldsig is the signal we were trying to handle
554 * at the point of failure.
555 */
Michael Clark47ae93c2018-03-03 01:31:11 +1300556#if !defined(TARGET_RISCV)
Laurent Vivierbefb7442018-04-24 21:26:16 +0200557void force_sigsegv(int oldsig)
Peter Maydell09391662016-07-28 16:44:47 +0100558{
Peter Maydell09391662016-07-28 16:44:47 +0100559 if (oldsig == SIGSEGV) {
560 /* Make sure we don't try to deliver the signal again; this will
Peter Maydellc599d4d2016-07-28 16:44:49 +0100561 * end up with handle_pending_signal() calling dump_core_and_abort().
Peter Maydell09391662016-07-28 16:44:47 +0100562 */
563 sigact_table[oldsig - 1]._sa_handler = TARGET_SIG_DFL;
564 }
Peter Maydellc4b35742016-07-28 16:44:50 +0100565 force_sig(TARGET_SIGSEGV);
Peter Maydell09391662016-07-28 16:44:47 +0100566}
bellard66fb9762003-03-23 01:06:05 +0000567
Michael Clark47ae93c2018-03-03 01:31:11 +1300568#endif
569
bellard9de5e442003-03-23 16:49:39 +0000570/* abort execution with signal */
Peter Maydellc599d4d2016-07-28 16:44:49 +0100571static void QEMU_NORETURN dump_core_and_abort(int target_sig)
bellard66fb9762003-03-23 01:06:05 +0000572{
Andreas Färber0429a972013-08-26 18:14:44 +0200573 CPUState *cpu = thread_cpu;
574 CPUArchState *env = cpu->env_ptr;
575 TaskState *ts = (TaskState *)cpu->opaque;
Mika Westerbergedf8e2a2009-04-07 09:57:11 +0300576 int host_sig, core_dumped = 0;
aurel32603e4fd2009-04-15 16:18:38 +0000577 struct sigaction act;
Paolo Bonzinic8ee0a42015-11-13 13:52:21 +0100578
Riku Voipio66393fb2009-12-04 15:16:32 +0200579 host_sig = target_to_host_signal(target_sig);
Paolo Bonzinic8ee0a42015-11-13 13:52:21 +0100580 trace_user_force_sig(env, target_sig, host_sig);
Andreas Färbera2247f82013-06-09 19:47:04 +0200581 gdb_signalled(env, target_sig);
aurel32603e4fd2009-04-15 16:18:38 +0000582
Mika Westerbergedf8e2a2009-04-07 09:57:11 +0300583 /* dump core if supported by target binary format */
Riku Voipio66393fb2009-12-04 15:16:32 +0200584 if (core_dump_signal(target_sig) && (ts->bprm->core_dump != NULL)) {
Mika Westerbergedf8e2a2009-04-07 09:57:11 +0300585 stop_all_tasks();
586 core_dumped =
Andreas Färbera2247f82013-06-09 19:47:04 +0200587 ((*ts->bprm->core_dump)(target_sig, env) == 0);
Mika Westerbergedf8e2a2009-04-07 09:57:11 +0300588 }
589 if (core_dumped) {
590 /* we already dumped the core of target process, we don't want
591 * a coredump of qemu itself */
592 struct rlimit nodump;
593 getrlimit(RLIMIT_CORE, &nodump);
594 nodump.rlim_cur=0;
595 setrlimit(RLIMIT_CORE, &nodump);
596 (void) fprintf(stderr, "qemu: uncaught target signal %d (%s) - %s\n",
Riku Voipio66393fb2009-12-04 15:16:32 +0200597 target_sig, strsignal(host_sig), "core dumped" );
Mika Westerbergedf8e2a2009-04-07 09:57:11 +0300598 }
599
Stefan Weil0c587512011-04-28 17:20:32 +0200600 /* The proper exit code for dying from an uncaught signal is
aurel32603e4fd2009-04-15 16:18:38 +0000601 * -<signal>. The kernel doesn't allow exit() or _exit() to pass
602 * a negative value. To get the proper exit code we need to
603 * actually die from an uncaught signal. Here the default signal
604 * handler is installed, we send ourself a signal and we wait for
605 * it to arrive. */
606 sigfillset(&act.sa_mask);
607 act.sa_handler = SIG_DFL;
Peter Maydell3a5d30b2014-02-17 18:55:32 +0000608 act.sa_flags = 0;
aurel32603e4fd2009-04-15 16:18:38 +0000609 sigaction(host_sig, &act, NULL);
610
611 /* For some reason raise(host_sig) doesn't send the signal when
612 * statically linked on x86-64. */
613 kill(getpid(), host_sig);
614
615 /* Make sure the signal isn't masked (just reuse the mask inside
616 of act) */
617 sigdelset(&act.sa_mask, host_sig);
618 sigsuspend(&act.sa_mask);
619
620 /* unreachable */
Blue Swirla6c6f762010-03-13 14:18:50 +0000621 abort();
bellard66fb9762003-03-23 01:06:05 +0000622}
623
bellard9de5e442003-03-23 16:49:39 +0000624/* queue a signal so that it will be send to the virtual CPU as soon
625 as possible */
Peter Maydell9d2803f2016-07-28 16:44:46 +0100626int queue_signal(CPUArchState *env, int sig, int si_type,
627 target_siginfo_t *info)
bellard31e31b82003-02-18 22:55:36 +0000628{
Andreas Färber0429a972013-08-26 18:14:44 +0200629 CPUState *cpu = ENV_GET_CPU(env);
630 TaskState *ts = cpu->opaque;
bellard66fb9762003-03-23 01:06:05 +0000631
Paolo Bonzinic8ee0a42015-11-13 13:52:21 +0100632 trace_user_queue_signal(env, sig);
Peter Maydella7ec0f92014-03-14 14:36:56 +0000633
Peter Maydell9d2803f2016-07-28 16:44:46 +0100634 info->si_code = deposit32(info->si_code, 16, 16, si_type);
Peter Maydella70dadc2016-05-27 15:51:59 +0100635
Timothy E Baldwin655ed672016-05-27 15:51:53 +0100636 ts->sync_signal.info = *info;
637 ts->sync_signal.pending = sig;
Timothy E Baldwin907f5fd2016-05-27 15:51:52 +0100638 /* signal that a new signal is pending */
639 atomic_set(&ts->signal_pending, 1);
640 return 1; /* indicates that the signal was queued */
bellard9de5e442003-03-23 16:49:39 +0000641}
642
Timothy E Baldwin4d330ce2016-05-12 18:47:46 +0100643#ifndef HAVE_SAFE_SYSCALL
644static inline void rewind_if_in_safe_syscall(void *puc)
645{
646 /* Default version: never rewind */
647}
648#endif
649
ths5fafdf22007-09-16 21:08:06 +0000650static void host_signal_handler(int host_signum, siginfo_t *info,
bellard9de5e442003-03-23 16:49:39 +0000651 void *puc)
652{
Andreas Färbera2247f82013-06-09 19:47:04 +0200653 CPUArchState *env = thread_cpu->env_ptr;
Timothy E Baldwin655ed672016-05-27 15:51:53 +0100654 CPUState *cpu = ENV_GET_CPU(env);
655 TaskState *ts = cpu->opaque;
656
bellard9de5e442003-03-23 16:49:39 +0000657 int sig;
Anthony Liguoric227f092009-10-01 16:12:16 -0500658 target_siginfo_t tinfo;
Peter Maydell3d3efba2016-05-27 15:51:49 +0100659 ucontext_t *uc = puc;
Timothy E Baldwin655ed672016-05-27 15:51:53 +0100660 struct emulated_sigtable *k;
bellard9de5e442003-03-23 16:49:39 +0000661
662 /* the CPU emulator uses some host signals to detect exceptions,
aurel32eaa449b2009-01-03 13:14:52 +0000663 we forward to it some signals */
aurel32ca587a82008-12-18 22:44:13 +0000664 if ((host_signum == SIGSEGV || host_signum == SIGBUS)
aurel32eaa449b2009-01-03 13:14:52 +0000665 && info->si_code > 0) {
bellardb346ff42003-06-15 20:05:50 +0000666 if (cpu_signal_handler(host_signum, info, puc))
bellard9de5e442003-03-23 16:49:39 +0000667 return;
668 }
669
670 /* get target signal number */
671 sig = host_to_target_signal(host_signum);
672 if (sig < 1 || sig > TARGET_NSIG)
673 return;
Paolo Bonzinic8ee0a42015-11-13 13:52:21 +0100674 trace_user_host_signal(env, host_signum, sig);
Timothy E Baldwin4d330ce2016-05-12 18:47:46 +0100675
676 rewind_if_in_safe_syscall(puc);
677
bellard9de5e442003-03-23 16:49:39 +0000678 host_to_target_siginfo_noswap(&tinfo, info);
Timothy E Baldwin655ed672016-05-27 15:51:53 +0100679 k = &ts->sigtab[sig - 1];
680 k->info = tinfo;
681 k->pending = sig;
682 ts->signal_pending = 1;
Peter Maydell3d3efba2016-05-27 15:51:49 +0100683
Timothy E Baldwin655ed672016-05-27 15:51:53 +0100684 /* Block host signals until target signal handler entered. We
685 * can't block SIGSEGV or SIGBUS while we're executing guest
686 * code in case the guest code provokes one in the window between
687 * now and it getting out to the main loop. Signals will be
688 * unblocked again in process_pending_signals().
Peter Maydell1d48fdd2016-06-14 12:49:18 +0100689 *
690 * WARNING: we cannot use sigfillset() here because the uc_sigmask
691 * field is a kernel sigset_t, which is much smaller than the
692 * libc sigset_t which sigfillset() operates on. Using sigfillset()
693 * would write 0xff bytes off the end of the structure and trash
694 * data on the struct.
695 * We can't use sizeof(uc->uc_sigmask) either, because the libc
696 * headers define the struct field with the wrong (too large) type.
Timothy E Baldwin655ed672016-05-27 15:51:53 +0100697 */
Peter Maydell1d48fdd2016-06-14 12:49:18 +0100698 memset(&uc->uc_sigmask, 0xff, SIGSET_T_SIZE);
Timothy E Baldwin655ed672016-05-27 15:51:53 +0100699 sigdelset(&uc->uc_sigmask, SIGSEGV);
700 sigdelset(&uc->uc_sigmask, SIGBUS);
701
702 /* interrupt the virtual CPU as soon as possible */
703 cpu_exit(thread_cpu);
bellard31e31b82003-02-18 22:55:36 +0000704}
705
ths0da46a62007-10-20 20:23:07 +0000706/* do_sigaltstack() returns target values and errnos. */
bellard579a97f2007-11-11 14:26:47 +0000707/* compare linux/kernel/signal.c:do_sigaltstack() */
708abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong uoss_addr, abi_ulong sp)
thsa04e1342007-09-27 13:57:58 +0000709{
710 int ret;
711 struct target_sigaltstack oss;
712
713 /* XXX: test errors */
bellard579a97f2007-11-11 14:26:47 +0000714 if(uoss_addr)
thsa04e1342007-09-27 13:57:58 +0000715 {
716 __put_user(target_sigaltstack_used.ss_sp, &oss.ss_sp);
717 __put_user(target_sigaltstack_used.ss_size, &oss.ss_size);
718 __put_user(sas_ss_flags(sp), &oss.ss_flags);
719 }
720
bellard579a97f2007-11-11 14:26:47 +0000721 if(uss_addr)
thsa04e1342007-09-27 13:57:58 +0000722 {
bellard579a97f2007-11-11 14:26:47 +0000723 struct target_sigaltstack *uss;
724 struct target_sigaltstack ss;
Tom Musta0903c8b2014-08-12 13:53:40 -0500725 size_t minstacksize = TARGET_MINSIGSTKSZ;
726
727#if defined(TARGET_PPC64)
728 /* ELF V2 for PPC64 has a 4K minimum stack size for signal handlers */
729 struct image_info *image = ((TaskState *)thread_cpu->opaque)->info;
730 if (get_ppc64_abi(image) > 1) {
731 minstacksize = 4096;
732 }
733#endif
thsa04e1342007-09-27 13:57:58 +0000734
Paolo Bonzini7d374352018-12-13 23:37:37 +0100735 ret = -TARGET_EFAULT;
Riku Voipio9eeb8302014-04-23 11:26:34 +0300736 if (!lock_user_struct(VERIFY_READ, uss, uss_addr, 1)) {
thsa04e1342007-09-27 13:57:58 +0000737 goto out;
Riku Voipio9eeb8302014-04-23 11:26:34 +0300738 }
739 __get_user(ss.ss_sp, &uss->ss_sp);
740 __get_user(ss.ss_size, &uss->ss_size);
741 __get_user(ss.ss_flags, &uss->ss_flags);
bellard579a97f2007-11-11 14:26:47 +0000742 unlock_user_struct(uss, uss_addr, 0);
thsa04e1342007-09-27 13:57:58 +0000743
Paolo Bonzini7d374352018-12-13 23:37:37 +0100744 ret = -TARGET_EPERM;
745 if (on_sig_stack(sp))
thsa04e1342007-09-27 13:57:58 +0000746 goto out;
747
Paolo Bonzini7d374352018-12-13 23:37:37 +0100748 ret = -TARGET_EINVAL;
749 if (ss.ss_flags != TARGET_SS_DISABLE
thsa04e1342007-09-27 13:57:58 +0000750 && ss.ss_flags != TARGET_SS_ONSTACK
751 && ss.ss_flags != 0)
752 goto out;
753
Paolo Bonzini7d374352018-12-13 23:37:37 +0100754 if (ss.ss_flags == TARGET_SS_DISABLE) {
thsa04e1342007-09-27 13:57:58 +0000755 ss.ss_size = 0;
756 ss.ss_sp = 0;
Paolo Bonzini7d374352018-12-13 23:37:37 +0100757 } else {
ths0da46a62007-10-20 20:23:07 +0000758 ret = -TARGET_ENOMEM;
Tom Musta0903c8b2014-08-12 13:53:40 -0500759 if (ss.ss_size < minstacksize) {
thsa04e1342007-09-27 13:57:58 +0000760 goto out;
Tom Musta0903c8b2014-08-12 13:53:40 -0500761 }
Paolo Bonzini7d374352018-12-13 23:37:37 +0100762 }
thsa04e1342007-09-27 13:57:58 +0000763
764 target_sigaltstack_used.ss_sp = ss.ss_sp;
765 target_sigaltstack_used.ss_size = ss.ss_size;
766 }
767
bellard579a97f2007-11-11 14:26:47 +0000768 if (uoss_addr) {
ths0da46a62007-10-20 20:23:07 +0000769 ret = -TARGET_EFAULT;
bellard579a97f2007-11-11 14:26:47 +0000770 if (copy_to_user(uoss_addr, &oss, sizeof(oss)))
thsa04e1342007-09-27 13:57:58 +0000771 goto out;
thsa04e1342007-09-27 13:57:58 +0000772 }
773
774 ret = 0;
775out:
776 return ret;
777}
778
Timothy E Baldwinef6a7782016-05-27 15:51:54 +0100779/* do_sigaction() return target values and host errnos */
bellard66fb9762003-03-23 01:06:05 +0000780int do_sigaction(int sig, const struct target_sigaction *act,
781 struct target_sigaction *oact)
bellard31e31b82003-02-18 22:55:36 +0000782{
pbrook624f7972008-05-31 16:11:38 +0000783 struct target_sigaction *k;
bellard773b93e2004-01-04 17:15:59 +0000784 struct sigaction act1;
785 int host_sig;
ths0da46a62007-10-20 20:23:07 +0000786 int ret = 0;
bellard31e31b82003-02-18 22:55:36 +0000787
Timothy E Baldwinef6a7782016-05-27 15:51:54 +0100788 if (sig < 1 || sig > TARGET_NSIG || sig == TARGET_SIGKILL || sig == TARGET_SIGSTOP) {
789 return -TARGET_EINVAL;
790 }
791
792 if (block_signals()) {
793 return -TARGET_ERESTARTSYS;
794 }
795
bellard66fb9762003-03-23 01:06:05 +0000796 k = &sigact_table[sig - 1];
bellard66fb9762003-03-23 01:06:05 +0000797 if (oact) {
Richard Hendersond2565872013-01-04 16:39:32 -0800798 __put_user(k->_sa_handler, &oact->_sa_handler);
799 __put_user(k->sa_flags, &oact->sa_flags);
Richard Henderson7f047de2017-10-31 13:53:52 +0100800#ifdef TARGET_ARCH_HAS_SA_RESTORER
Richard Hendersond2565872013-01-04 16:39:32 -0800801 __put_user(k->sa_restorer, &oact->sa_restorer);
ths388bb212007-05-13 13:58:00 +0000802#endif
Richard Hendersond2565872013-01-04 16:39:32 -0800803 /* Not swapped. */
pbrook624f7972008-05-31 16:11:38 +0000804 oact->sa_mask = k->sa_mask;
bellard66fb9762003-03-23 01:06:05 +0000805 }
806 if (act) {
pbrook624f7972008-05-31 16:11:38 +0000807 /* FIXME: This is not threadsafe. */
Richard Hendersond2565872013-01-04 16:39:32 -0800808 __get_user(k->_sa_handler, &act->_sa_handler);
809 __get_user(k->sa_flags, &act->sa_flags);
Richard Henderson7f047de2017-10-31 13:53:52 +0100810#ifdef TARGET_ARCH_HAS_SA_RESTORER
Richard Hendersond2565872013-01-04 16:39:32 -0800811 __get_user(k->sa_restorer, &act->sa_restorer);
ths388bb212007-05-13 13:58:00 +0000812#endif
Richard Hendersond2565872013-01-04 16:39:32 -0800813 /* To be swapped in target_to_host_sigset. */
pbrook624f7972008-05-31 16:11:38 +0000814 k->sa_mask = act->sa_mask;
bellard773b93e2004-01-04 17:15:59 +0000815
816 /* we update the host linux signal state */
817 host_sig = target_to_host_signal(sig);
818 if (host_sig != SIGSEGV && host_sig != SIGBUS) {
819 sigfillset(&act1.sa_mask);
820 act1.sa_flags = SA_SIGINFO;
pbrook624f7972008-05-31 16:11:38 +0000821 if (k->sa_flags & TARGET_SA_RESTART)
bellard773b93e2004-01-04 17:15:59 +0000822 act1.sa_flags |= SA_RESTART;
823 /* NOTE: it is important to update the host kernel signal
824 ignore state to avoid getting unexpected interrupted
825 syscalls */
pbrook624f7972008-05-31 16:11:38 +0000826 if (k->_sa_handler == TARGET_SIG_IGN) {
bellard773b93e2004-01-04 17:15:59 +0000827 act1.sa_sigaction = (void *)SIG_IGN;
pbrook624f7972008-05-31 16:11:38 +0000828 } else if (k->_sa_handler == TARGET_SIG_DFL) {
aurel32ca587a82008-12-18 22:44:13 +0000829 if (fatal_signal (sig))
830 act1.sa_sigaction = host_signal_handler;
831 else
832 act1.sa_sigaction = (void *)SIG_DFL;
bellard773b93e2004-01-04 17:15:59 +0000833 } else {
834 act1.sa_sigaction = host_signal_handler;
835 }
ths0da46a62007-10-20 20:23:07 +0000836 ret = sigaction(host_sig, &act1, NULL);
bellard773b93e2004-01-04 17:15:59 +0000837 }
bellard66fb9762003-03-23 01:06:05 +0000838 }
ths0da46a62007-10-20 20:23:07 +0000839 return ret;
bellard66fb9762003-03-23 01:06:05 +0000840}
bellard31e31b82003-02-18 22:55:36 +0000841
Peter Maydell31efaef2016-07-06 15:09:29 +0100842static void handle_pending_signal(CPUArchState *cpu_env, int sig,
843 struct emulated_sigtable *k)
Peter Maydelleb552502016-05-27 15:51:43 +0100844{
845 CPUState *cpu = ENV_GET_CPU(cpu_env);
846 abi_ulong handler;
Peter Maydell3d3efba2016-05-27 15:51:49 +0100847 sigset_t set;
Peter Maydelleb552502016-05-27 15:51:43 +0100848 target_sigset_t target_old_set;
849 struct target_sigaction *sa;
Peter Maydelleb552502016-05-27 15:51:43 +0100850 TaskState *ts = cpu->opaque;
Peter Maydelleb552502016-05-27 15:51:43 +0100851
Paolo Bonzinic8ee0a42015-11-13 13:52:21 +0100852 trace_user_handle_signal(cpu_env, sig);
bellard66fb9762003-03-23 01:06:05 +0000853 /* dequeue signal */
Timothy E Baldwin907f5fd2016-05-27 15:51:52 +0100854 k->pending = 0;
ths3b46e622007-09-17 08:09:54 +0000855
Andreas Färberdb6b81d2013-06-27 19:49:31 +0200856 sig = gdb_handlesig(cpu, sig);
bellard1fddef42005-04-17 19:16:13 +0000857 if (!sig) {
aurel32ca587a82008-12-18 22:44:13 +0000858 sa = NULL;
859 handler = TARGET_SIG_IGN;
860 } else {
861 sa = &sigact_table[sig - 1];
862 handler = sa->_sa_handler;
bellard1fddef42005-04-17 19:16:13 +0000863 }
bellard66fb9762003-03-23 01:06:05 +0000864
Peter Maydell0cb581d2016-07-18 18:12:24 +0100865 if (do_strace) {
866 print_taken_signal(sig, &k->info);
867 }
868
bellard66fb9762003-03-23 01:06:05 +0000869 if (handler == TARGET_SIG_DFL) {
aurel32ca587a82008-12-18 22:44:13 +0000870 /* default handler : ignore some signal. The other are job control or fatal */
871 if (sig == TARGET_SIGTSTP || sig == TARGET_SIGTTIN || sig == TARGET_SIGTTOU) {
872 kill(getpid(),SIGSTOP);
873 } else if (sig != TARGET_SIGCHLD &&
874 sig != TARGET_SIGURG &&
875 sig != TARGET_SIGWINCH &&
876 sig != TARGET_SIGCONT) {
Peter Maydellc599d4d2016-07-28 16:44:49 +0100877 dump_core_and_abort(sig);
bellard66fb9762003-03-23 01:06:05 +0000878 }
879 } else if (handler == TARGET_SIG_IGN) {
880 /* ignore sig */
881 } else if (handler == TARGET_SIG_ERR) {
Peter Maydellc599d4d2016-07-28 16:44:49 +0100882 dump_core_and_abort(sig);
bellard66fb9762003-03-23 01:06:05 +0000883 } else {
bellard9de5e442003-03-23 16:49:39 +0000884 /* compute the blocked signals during the handler execution */
Peter Maydell3d3efba2016-05-27 15:51:49 +0100885 sigset_t *blocked_set;
886
pbrook624f7972008-05-31 16:11:38 +0000887 target_to_host_sigset(&set, &sa->sa_mask);
bellard9de5e442003-03-23 16:49:39 +0000888 /* SA_NODEFER indicates that the current signal should not be
889 blocked during the handler */
pbrook624f7972008-05-31 16:11:38 +0000890 if (!(sa->sa_flags & TARGET_SA_NODEFER))
bellard9de5e442003-03-23 16:49:39 +0000891 sigaddset(&set, target_to_host_signal(sig));
ths3b46e622007-09-17 08:09:54 +0000892
bellard9de5e442003-03-23 16:49:39 +0000893 /* save the previous blocked signal state to restore it at the
894 end of the signal execution (see do_sigreturn) */
Peter Maydell3d3efba2016-05-27 15:51:49 +0100895 host_to_target_sigset_internal(&target_old_set, &ts->signal_mask);
896
897 /* block signals in the handler */
898 blocked_set = ts->in_sigsuspend ?
899 &ts->sigsuspend_mask : &ts->signal_mask;
900 sigorset(&ts->signal_mask, blocked_set, &set);
901 ts->in_sigsuspend = 0;
bellard9de5e442003-03-23 16:49:39 +0000902
bellardbc8a22c2003-03-30 21:02:40 +0000903 /* if the CPU is in VM86 mode, we restore the 32 bit values */
j_mayer84409dd2007-04-06 08:56:50 +0000904#if defined(TARGET_I386) && !defined(TARGET_X86_64)
bellardbc8a22c2003-03-30 21:02:40 +0000905 {
906 CPUX86State *env = cpu_env;
907 if (env->eflags & VM_MASK)
908 save_v86_state(env);
909 }
910#endif
bellard9de5e442003-03-23 16:49:39 +0000911 /* prepare the stack frame of the virtual CPU */
Laurent Viviercb6ac802018-04-24 21:26:35 +0200912#if defined(TARGET_ARCH_HAS_SETUP_FRAME)
913 if (sa->sa_flags & TARGET_SA_SIGINFO) {
914 setup_rt_frame(sig, sa, &k->info, &target_old_set, cpu_env);
915 } else {
916 setup_frame(sig, sa, &target_old_set, cpu_env);
917 }
918#else
Richard Hendersonff970902013-02-10 10:30:42 -0800919 /* These targets do not have traditional signals. */
Timothy E Baldwin907f5fd2016-05-27 15:51:52 +0100920 setup_rt_frame(sig, sa, &k->info, &target_old_set, cpu_env);
Richard Hendersonff970902013-02-10 10:30:42 -0800921#endif
Peter Maydell7ec87e02016-05-27 15:51:45 +0100922 if (sa->sa_flags & TARGET_SA_RESETHAND) {
pbrook624f7972008-05-31 16:11:38 +0000923 sa->_sa_handler = TARGET_SIG_DFL;
Peter Maydell7ec87e02016-05-27 15:51:45 +0100924 }
bellard31e31b82003-02-18 22:55:36 +0000925 }
bellard31e31b82003-02-18 22:55:36 +0000926}
Peter Maydelle902d582016-05-27 15:51:44 +0100927
928void process_pending_signals(CPUArchState *cpu_env)
929{
930 CPUState *cpu = ENV_GET_CPU(cpu_env);
931 int sig;
932 TaskState *ts = cpu->opaque;
Peter Maydell3d3efba2016-05-27 15:51:49 +0100933 sigset_t set;
934 sigset_t *blocked_set;
Peter Maydelle902d582016-05-27 15:51:44 +0100935
Peter Maydell3d3efba2016-05-27 15:51:49 +0100936 while (atomic_read(&ts->signal_pending)) {
937 /* FIXME: This is not threadsafe. */
938 sigfillset(&set);
939 sigprocmask(SIG_SETMASK, &set, 0);
Peter Maydelle902d582016-05-27 15:51:44 +0100940
Peter Maydell8bd37732016-07-28 16:44:45 +0100941 restart_scan:
Timothy E Baldwin655ed672016-05-27 15:51:53 +0100942 sig = ts->sync_signal.pending;
943 if (sig) {
944 /* Synchronous signals are forced,
945 * see force_sig_info() and callers in Linux
946 * Note that not all of our queue_signal() calls in QEMU correspond
947 * to force_sig_info() calls in Linux (some are send_sig_info()).
948 * However it seems like a kernel bug to me to allow the process
949 * to block a synchronous signal since it could then just end up
950 * looping round and round indefinitely.
951 */
952 if (sigismember(&ts->signal_mask, target_to_host_signal_table[sig])
953 || sigact_table[sig - 1]._sa_handler == TARGET_SIG_IGN) {
954 sigdelset(&ts->signal_mask, target_to_host_signal_table[sig]);
955 sigact_table[sig - 1]._sa_handler = TARGET_SIG_DFL;
956 }
957
Peter Maydell31efaef2016-07-06 15:09:29 +0100958 handle_pending_signal(cpu_env, sig, &ts->sync_signal);
Timothy E Baldwin655ed672016-05-27 15:51:53 +0100959 }
960
Peter Maydell3d3efba2016-05-27 15:51:49 +0100961 for (sig = 1; sig <= TARGET_NSIG; sig++) {
962 blocked_set = ts->in_sigsuspend ?
963 &ts->sigsuspend_mask : &ts->signal_mask;
964
965 if (ts->sigtab[sig - 1].pending &&
966 (!sigismember(blocked_set,
Timothy E Baldwin655ed672016-05-27 15:51:53 +0100967 target_to_host_signal_table[sig]))) {
Peter Maydell31efaef2016-07-06 15:09:29 +0100968 handle_pending_signal(cpu_env, sig, &ts->sigtab[sig - 1]);
Peter Maydell8bd37732016-07-28 16:44:45 +0100969 /* Restart scan from the beginning, as handle_pending_signal
970 * might have resulted in a new synchronous signal (eg SIGSEGV).
971 */
972 goto restart_scan;
Peter Maydell3d3efba2016-05-27 15:51:49 +0100973 }
Peter Maydelle902d582016-05-27 15:51:44 +0100974 }
Peter Maydell3d3efba2016-05-27 15:51:49 +0100975
976 /* if no signal is pending, unblock signals and recheck (the act
977 * of unblocking might cause us to take another host signal which
978 * will set signal_pending again).
979 */
980 atomic_set(&ts->signal_pending, 0);
981 ts->in_sigsuspend = 0;
982 set = ts->signal_mask;
983 sigdelset(&set, SIGSEGV);
984 sigdelset(&set, SIGBUS);
985 sigprocmask(SIG_SETMASK, &set, 0);
Peter Maydelle902d582016-05-27 15:51:44 +0100986 }
Peter Maydell3d3efba2016-05-27 15:51:49 +0100987 ts->in_sigsuspend = 0;
Peter Maydelle902d582016-05-27 15:51:44 +0100988}