]> Git Repo - qemu.git/blame - linux-user/signal.c
linux-user: ARM-FDPIC: Add support for signals for FDPIC targets
[qemu.git] / linux-user / signal.c
CommitLineData
31e31b8a 1/*
66fb9763 2 * Emulation of Linux signals
5fafdf24 3 *
31e31b8a
FB
4 * 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
8167ee88 17 * along with this program; if not, see <http://www.gnu.org/licenses/>.
31e31b8a 18 */
d39594e9 19#include "qemu/osdep.h"
a70dadc7 20#include "qemu/bitops.h"
31e31b8a 21#include <sys/ucontext.h>
edf8e2af 22#include <sys/resource.h>
31e31b8a 23
3ef693a0 24#include "qemu.h"
7d99a001 25#include "qemu-common.h"
992f48a0 26#include "target_signal.h"
c8ee0a44 27#include "trace.h"
befb7447 28#include "signal-common.h"
66fb9763 29
befb7447 30struct target_sigaltstack target_sigaltstack_used = {
a04e134a
TS
31 .ss_sp = 0,
32 .ss_size = 0,
33 .ss_flags = TARGET_SS_DISABLE,
34};
35
624f7979 36static struct target_sigaction sigact_table[TARGET_NSIG];
31e31b8a 37
5fafdf24 38static void host_signal_handler(int host_signum, siginfo_t *info,
66fb9763
FB
39 void *puc);
40
3ca05588 41static uint8_t host_to_target_signal_table[_NSIG] = {
9e5f5284
FB
42 [SIGHUP] = TARGET_SIGHUP,
43 [SIGINT] = TARGET_SIGINT,
44 [SIGQUIT] = TARGET_SIGQUIT,
45 [SIGILL] = TARGET_SIGILL,
46 [SIGTRAP] = TARGET_SIGTRAP,
47 [SIGABRT] = TARGET_SIGABRT,
01e3b763 48/* [SIGIOT] = TARGET_SIGIOT,*/
9e5f5284
FB
49 [SIGBUS] = TARGET_SIGBUS,
50 [SIGFPE] = TARGET_SIGFPE,
51 [SIGKILL] = TARGET_SIGKILL,
52 [SIGUSR1] = TARGET_SIGUSR1,
53 [SIGSEGV] = TARGET_SIGSEGV,
54 [SIGUSR2] = TARGET_SIGUSR2,
55 [SIGPIPE] = TARGET_SIGPIPE,
56 [SIGALRM] = TARGET_SIGALRM,
57 [SIGTERM] = TARGET_SIGTERM,
58#ifdef SIGSTKFLT
59 [SIGSTKFLT] = TARGET_SIGSTKFLT,
60#endif
61 [SIGCHLD] = TARGET_SIGCHLD,
62 [SIGCONT] = TARGET_SIGCONT,
63 [SIGSTOP] = TARGET_SIGSTOP,
64 [SIGTSTP] = TARGET_SIGTSTP,
65 [SIGTTIN] = TARGET_SIGTTIN,
66 [SIGTTOU] = TARGET_SIGTTOU,
67 [SIGURG] = TARGET_SIGURG,
68 [SIGXCPU] = TARGET_SIGXCPU,
69 [SIGXFSZ] = TARGET_SIGXFSZ,
70 [SIGVTALRM] = TARGET_SIGVTALRM,
71 [SIGPROF] = TARGET_SIGPROF,
72 [SIGWINCH] = TARGET_SIGWINCH,
73 [SIGIO] = TARGET_SIGIO,
74 [SIGPWR] = TARGET_SIGPWR,
75 [SIGSYS] = TARGET_SIGSYS,
76 /* next signals stay the same */
624f7979 77 /* Nasty hack: Reverse SIGRTMIN and SIGRTMAX to avoid overlap with
b4916d7b 78 host libpthread signals. This assumes no one actually uses SIGRTMAX :-/
624f7979
PB
79 To fix this properly we need to do manual signal delivery multiplexed
80 over a single host signal. */
81 [__SIGRTMIN] = __SIGRTMAX,
82 [__SIGRTMAX] = __SIGRTMIN,
9e5f5284 83};
3ca05588 84static uint8_t target_to_host_signal_table[_NSIG];
9e5f5284 85
1d9d8b55 86int host_to_target_signal(int sig)
31e31b8a 87{
167c50d8 88 if (sig < 0 || sig >= _NSIG)
4cb05961 89 return sig;
9e5f5284 90 return host_to_target_signal_table[sig];
31e31b8a
FB
91}
92
4cb05961 93int target_to_host_signal(int sig)
31e31b8a 94{
167c50d8 95 if (sig < 0 || sig >= _NSIG)
4cb05961 96 return sig;
9e5f5284 97 return target_to_host_signal_table[sig];
31e31b8a
FB
98}
99
c227f099 100static inline void target_sigaddset(target_sigset_t *set, int signum)
f5545b5c
PB
101{
102 signum--;
103 abi_ulong mask = (abi_ulong)1 << (signum % TARGET_NSIG_BPW);
104 set->sig[signum / TARGET_NSIG_BPW] |= mask;
105}
106
c227f099 107static inline int target_sigismember(const target_sigset_t *set, int signum)
f5545b5c
PB
108{
109 signum--;
110 abi_ulong mask = (abi_ulong)1 << (signum % TARGET_NSIG_BPW);
111 return ((set->sig[signum / TARGET_NSIG_BPW] & mask) != 0);
112}
113
befb7447
LV
114void host_to_target_sigset_internal(target_sigset_t *d,
115 const sigset_t *s)
66fb9763
FB
116{
117 int i;
f5545b5c
PB
118 target_sigemptyset(d);
119 for (i = 1; i <= TARGET_NSIG; i++) {
120 if (sigismember(s, i)) {
121 target_sigaddset(d, host_to_target_signal(i));
122 }
66fb9763
FB
123 }
124}
125
c227f099 126void host_to_target_sigset(target_sigset_t *d, const sigset_t *s)
9231944d 127{
c227f099 128 target_sigset_t d1;
9231944d
FB
129 int i;
130
131 host_to_target_sigset_internal(&d1, s);
132 for(i = 0;i < TARGET_NSIG_WORDS; i++)
cbb21eed 133 d->sig[i] = tswapal(d1.sig[i]);
9231944d
FB
134}
135
befb7447
LV
136void target_to_host_sigset_internal(sigset_t *d,
137 const target_sigset_t *s)
66fb9763
FB
138{
139 int i;
f5545b5c
PB
140 sigemptyset(d);
141 for (i = 1; i <= TARGET_NSIG; i++) {
142 if (target_sigismember(s, i)) {
143 sigaddset(d, target_to_host_signal(i));
144 }
da7c8647 145 }
66fb9763
FB
146}
147
c227f099 148void target_to_host_sigset(sigset_t *d, const target_sigset_t *s)
9231944d 149{
c227f099 150 target_sigset_t s1;
9231944d
FB
151 int i;
152
153 for(i = 0;i < TARGET_NSIG_WORDS; i++)
cbb21eed 154 s1.sig[i] = tswapal(s->sig[i]);
9231944d
FB
155 target_to_host_sigset_internal(d, &s1);
156}
3b46e624 157
992f48a0 158void host_to_target_old_sigset(abi_ulong *old_sigset,
66fb9763
FB
159 const sigset_t *sigset)
160{
c227f099 161 target_sigset_t d;
9e5f5284
FB
162 host_to_target_sigset(&d, sigset);
163 *old_sigset = d.sig[0];
66fb9763
FB
164}
165
5fafdf24 166void target_to_host_old_sigset(sigset_t *sigset,
992f48a0 167 const abi_ulong *old_sigset)
66fb9763 168{
c227f099 169 target_sigset_t d;
9e5f5284
FB
170 int i;
171
172 d.sig[0] = *old_sigset;
173 for(i = 1;i < TARGET_NSIG_WORDS; i++)
174 d.sig[i] = 0;
175 target_to_host_sigset(sigset, &d);
66fb9763
FB
176}
177
3d3efba0
PM
178int block_signals(void)
179{
180 TaskState *ts = (TaskState *)thread_cpu->opaque;
181 sigset_t set;
3d3efba0
PM
182
183 /* It's OK to block everything including SIGSEGV, because we won't
184 * run any further guest code before unblocking signals in
185 * process_pending_signals().
186 */
187 sigfillset(&set);
188 sigprocmask(SIG_SETMASK, &set, 0);
189
9be38598 190 return atomic_xchg(&ts->signal_pending, 1);
3d3efba0
PM
191}
192
1c275925
AB
193/* Wrapper for sigprocmask function
194 * Emulates a sigprocmask in a safe way for the guest. Note that set and oldset
3d3efba0
PM
195 * are host signal set, not guest ones. Returns -TARGET_ERESTARTSYS if
196 * a signal was already pending and the syscall must be restarted, or
197 * 0 on success.
198 * If set is NULL, this is guaranteed not to fail.
1c275925
AB
199 */
200int do_sigprocmask(int how, const sigset_t *set, sigset_t *oldset)
201{
3d3efba0
PM
202 TaskState *ts = (TaskState *)thread_cpu->opaque;
203
204 if (oldset) {
205 *oldset = ts->signal_mask;
206 }
a7ec0f98
PM
207
208 if (set) {
3d3efba0 209 int i;
a7ec0f98 210
3d3efba0
PM
211 if (block_signals()) {
212 return -TARGET_ERESTARTSYS;
213 }
a7ec0f98
PM
214
215 switch (how) {
216 case SIG_BLOCK:
3d3efba0 217 sigorset(&ts->signal_mask, &ts->signal_mask, set);
a7ec0f98
PM
218 break;
219 case SIG_UNBLOCK:
3d3efba0
PM
220 for (i = 1; i <= NSIG; ++i) {
221 if (sigismember(set, i)) {
222 sigdelset(&ts->signal_mask, i);
223 }
a7ec0f98
PM
224 }
225 break;
226 case SIG_SETMASK:
3d3efba0 227 ts->signal_mask = *set;
a7ec0f98
PM
228 break;
229 default:
230 g_assert_not_reached();
231 }
a7ec0f98 232
3d3efba0
PM
233 /* Silently ignore attempts to change blocking status of KILL or STOP */
234 sigdelset(&ts->signal_mask, SIGKILL);
235 sigdelset(&ts->signal_mask, SIGSTOP);
a7ec0f98 236 }
3d3efba0 237 return 0;
1c275925
AB
238}
239
daa4374a 240#if !defined(TARGET_OPENRISC) && !defined(TARGET_NIOS2)
3d3efba0
PM
241/* Just set the guest's signal mask to the specified value; the
242 * caller is assumed to have called block_signals() already.
243 */
befb7447 244void set_sigmask(const sigset_t *set)
9eede5b6 245{
3d3efba0
PM
246 TaskState *ts = (TaskState *)thread_cpu->opaque;
247
248 ts->signal_mask = *set;
9eede5b6
PM
249}
250#endif
251
9de5e440
FB
252/* siginfo conversion */
253
c227f099 254static inline void host_to_target_siginfo_noswap(target_siginfo_t *tinfo,
9de5e440 255 const siginfo_t *info)
66fb9763 256{
a05c6409 257 int sig = host_to_target_signal(info->si_signo);
a70dadc7
PM
258 int si_code = info->si_code;
259 int si_type;
9de5e440
FB
260 tinfo->si_signo = sig;
261 tinfo->si_errno = 0;
afd7cd92 262 tinfo->si_code = info->si_code;
a05c6409 263
55d72a7e
PM
264 /* This memset serves two purposes:
265 * (1) ensure we don't leak random junk to the guest later
266 * (2) placate false positives from gcc about fields
267 * being used uninitialized if it chooses to inline both this
268 * function and tswap_siginfo() into host_to_target_siginfo().
269 */
270 memset(tinfo->_sifields._pad, 0, sizeof(tinfo->_sifields._pad));
271
a70dadc7
PM
272 /* This is awkward, because we have to use a combination of
273 * the si_code and si_signo to figure out which of the union's
274 * members are valid. (Within the host kernel it is always possible
275 * to tell, but the kernel carefully avoids giving userspace the
276 * high 16 bits of si_code, so we don't have the information to
277 * do this the easy way...) We therefore make our best guess,
278 * bearing in mind that a guest can spoof most of the si_codes
279 * via rt_sigqueueinfo() if it likes.
280 *
281 * Once we have made our guess, we record it in the top 16 bits of
282 * the si_code, so that tswap_siginfo() later can use it.
283 * tswap_siginfo() will strip these top bits out before writing
284 * si_code to the guest (sign-extending the lower bits).
285 */
286
287 switch (si_code) {
288 case SI_USER:
289 case SI_TKILL:
290 case SI_KERNEL:
291 /* Sent via kill(), tkill() or tgkill(), or direct from the kernel.
292 * These are the only unspoofable si_code values.
293 */
294 tinfo->_sifields._kill._pid = info->si_pid;
295 tinfo->_sifields._kill._uid = info->si_uid;
296 si_type = QEMU_SI_KILL;
297 break;
298 default:
299 /* Everything else is spoofable. Make best guess based on signal */
300 switch (sig) {
301 case TARGET_SIGCHLD:
302 tinfo->_sifields._sigchld._pid = info->si_pid;
303 tinfo->_sifields._sigchld._uid = info->si_uid;
304 tinfo->_sifields._sigchld._status
da7c8647 305 = host_to_target_waitstatus(info->si_status);
a70dadc7
PM
306 tinfo->_sifields._sigchld._utime = info->si_utime;
307 tinfo->_sifields._sigchld._stime = info->si_stime;
308 si_type = QEMU_SI_CHLD;
309 break;
310 case TARGET_SIGIO:
311 tinfo->_sifields._sigpoll._band = info->si_band;
312 tinfo->_sifields._sigpoll._fd = info->si_fd;
313 si_type = QEMU_SI_POLL;
314 break;
315 default:
316 /* Assume a sigqueue()/mq_notify()/rt_sigqueueinfo() source. */
317 tinfo->_sifields._rt._pid = info->si_pid;
318 tinfo->_sifields._rt._uid = info->si_uid;
319 /* XXX: potential problem if 64 bit */
320 tinfo->_sifields._rt._sigval.sival_ptr
da7c8647 321 = (abi_ulong)(unsigned long)info->si_value.sival_ptr;
a70dadc7
PM
322 si_type = QEMU_SI_RT;
323 break;
324 }
325 break;
9de5e440 326 }
a70dadc7
PM
327
328 tinfo->si_code = deposit32(si_code, 16, 16, si_type);
9de5e440
FB
329}
330
befb7447
LV
331void tswap_siginfo(target_siginfo_t *tinfo,
332 const target_siginfo_t *info)
9de5e440 333{
a70dadc7
PM
334 int si_type = extract32(info->si_code, 16, 16);
335 int si_code = sextract32(info->si_code, 0, 16);
336
337 __put_user(info->si_signo, &tinfo->si_signo);
338 __put_user(info->si_errno, &tinfo->si_errno);
339 __put_user(si_code, &tinfo->si_code);
340
341 /* We can use our internal marker of which fields in the structure
342 * are valid, rather than duplicating the guesswork of
343 * host_to_target_siginfo_noswap() here.
344 */
345 switch (si_type) {
346 case QEMU_SI_KILL:
347 __put_user(info->_sifields._kill._pid, &tinfo->_sifields._kill._pid);
348 __put_user(info->_sifields._kill._uid, &tinfo->_sifields._kill._uid);
349 break;
350 case QEMU_SI_TIMER:
351 __put_user(info->_sifields._timer._timer1,
352 &tinfo->_sifields._timer._timer1);
353 __put_user(info->_sifields._timer._timer2,
354 &tinfo->_sifields._timer._timer2);
355 break;
356 case QEMU_SI_POLL:
357 __put_user(info->_sifields._sigpoll._band,
358 &tinfo->_sifields._sigpoll._band);
359 __put_user(info->_sifields._sigpoll._fd,
360 &tinfo->_sifields._sigpoll._fd);
361 break;
362 case QEMU_SI_FAULT:
363 __put_user(info->_sifields._sigfault._addr,
364 &tinfo->_sifields._sigfault._addr);
365 break;
366 case QEMU_SI_CHLD:
367 __put_user(info->_sifields._sigchld._pid,
368 &tinfo->_sifields._sigchld._pid);
369 __put_user(info->_sifields._sigchld._uid,
370 &tinfo->_sifields._sigchld._uid);
371 __put_user(info->_sifields._sigchld._status,
372 &tinfo->_sifields._sigchld._status);
373 __put_user(info->_sifields._sigchld._utime,
374 &tinfo->_sifields._sigchld._utime);
375 __put_user(info->_sifields._sigchld._stime,
376 &tinfo->_sifields._sigchld._stime);
377 break;
378 case QEMU_SI_RT:
379 __put_user(info->_sifields._rt._pid, &tinfo->_sifields._rt._pid);
380 __put_user(info->_sifields._rt._uid, &tinfo->_sifields._rt._uid);
381 __put_user(info->_sifields._rt._sigval.sival_ptr,
382 &tinfo->_sifields._rt._sigval.sival_ptr);
383 break;
384 default:
385 g_assert_not_reached();
9de5e440
FB
386 }
387}
388
c227f099 389void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info)
9de5e440 390{
55d72a7e
PM
391 target_siginfo_t tgt_tmp;
392 host_to_target_siginfo_noswap(&tgt_tmp, info);
393 tswap_siginfo(tinfo, &tgt_tmp);
66fb9763
FB
394}
395
9de5e440 396/* XXX: we support only POSIX RT signals are used. */
aa1f17c1 397/* XXX: find a solution for 64 bit (additional malloced data is needed) */
c227f099 398void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo)
66fb9763 399{
90c0f080
PM
400 /* This conversion is used only for the rt_sigqueueinfo syscall,
401 * and so we know that the _rt fields are the valid ones.
402 */
403 abi_ulong sival_ptr;
404
405 __get_user(info->si_signo, &tinfo->si_signo);
406 __get_user(info->si_errno, &tinfo->si_errno);
407 __get_user(info->si_code, &tinfo->si_code);
408 __get_user(info->si_pid, &tinfo->_sifields._rt._pid);
409 __get_user(info->si_uid, &tinfo->_sifields._rt._uid);
410 __get_user(sival_ptr, &tinfo->_sifields._rt._sigval.sival_ptr);
411 info->si_value.sival_ptr = (void *)(long)sival_ptr;
66fb9763
FB
412}
413
ca587a8e
AJ
414static int fatal_signal (int sig)
415{
416 switch (sig) {
417 case TARGET_SIGCHLD:
418 case TARGET_SIGURG:
419 case TARGET_SIGWINCH:
420 /* Ignored by default. */
421 return 0;
422 case TARGET_SIGCONT:
423 case TARGET_SIGSTOP:
424 case TARGET_SIGTSTP:
425 case TARGET_SIGTTIN:
426 case TARGET_SIGTTOU:
427 /* Job control signals. */
428 return 0;
429 default:
430 return 1;
431 }
432}
433
edf8e2af
MW
434/* returns 1 if given signal should dump core if not handled */
435static int core_dump_signal(int sig)
436{
437 switch (sig) {
438 case TARGET_SIGABRT:
439 case TARGET_SIGFPE:
440 case TARGET_SIGILL:
441 case TARGET_SIGQUIT:
442 case TARGET_SIGSEGV:
443 case TARGET_SIGTRAP:
444 case TARGET_SIGBUS:
445 return (1);
446 default:
447 return (0);
448 }
449}
450
31e31b8a
FB
451void signal_init(void)
452{
3d3efba0 453 TaskState *ts = (TaskState *)thread_cpu->opaque;
31e31b8a 454 struct sigaction act;
624f7979 455 struct sigaction oact;
9e5f5284 456 int i, j;
624f7979 457 int host_sig;
31e31b8a 458
9e5f5284 459 /* generate signal conversion tables */
3ca05588 460 for(i = 1; i < _NSIG; i++) {
9e5f5284
FB
461 if (host_to_target_signal_table[i] == 0)
462 host_to_target_signal_table[i] = i;
463 }
3ca05588 464 for(i = 1; i < _NSIG; i++) {
9e5f5284
FB
465 j = host_to_target_signal_table[i];
466 target_to_host_signal_table[j] = i;
467 }
3b46e624 468
3d3efba0
PM
469 /* Set the signal mask from the host mask. */
470 sigprocmask(0, 0, &ts->signal_mask);
471
9de5e440
FB
472 /* set all host signal handlers. ALL signals are blocked during
473 the handlers to serialize them. */
624f7979
PB
474 memset(sigact_table, 0, sizeof(sigact_table));
475
9de5e440 476 sigfillset(&act.sa_mask);
31e31b8a
FB
477 act.sa_flags = SA_SIGINFO;
478 act.sa_sigaction = host_signal_handler;
624f7979
PB
479 for(i = 1; i <= TARGET_NSIG; i++) {
480 host_sig = target_to_host_signal(i);
481 sigaction(host_sig, NULL, &oact);
482 if (oact.sa_sigaction == (void *)SIG_IGN) {
483 sigact_table[i - 1]._sa_handler = TARGET_SIG_IGN;
484 } else if (oact.sa_sigaction == (void *)SIG_DFL) {
485 sigact_table[i - 1]._sa_handler = TARGET_SIG_DFL;
486 }
487 /* If there's already a handler installed then something has
488 gone horribly wrong, so don't even try to handle that case. */
ca587a8e
AJ
489 /* Install some handlers for our own use. We need at least
490 SIGSEGV and SIGBUS, to detect exceptions. We can not just
491 trap all signals because it affects syscall interrupt
492 behavior. But do trap all default-fatal signals. */
493 if (fatal_signal (i))
624f7979 494 sigaction(host_sig, &act, NULL);
31e31b8a 495 }
66fb9763
FB
496}
497
c599d4d6
PM
498/* Force a synchronously taken signal. The kernel force_sig() function
499 * also forces the signal to "not blocked, not ignored", but for QEMU
500 * that work is done in process_pending_signals().
501 */
befb7447 502void force_sig(int sig)
c599d4d6
PM
503{
504 CPUState *cpu = thread_cpu;
505 CPUArchState *env = cpu->env_ptr;
506 target_siginfo_t info;
507
508 info.si_signo = sig;
509 info.si_errno = 0;
510 info.si_code = TARGET_SI_KERNEL;
511 info._sifields._kill._pid = 0;
512 info._sifields._kill._uid = 0;
513 queue_signal(env, info.si_signo, QEMU_SI_KILL, &info);
514}
09391669
PM
515
516/* Force a SIGSEGV if we couldn't write to memory trying to set
517 * up the signal frame. oldsig is the signal we were trying to handle
518 * at the point of failure.
519 */
47ae93cd 520#if !defined(TARGET_RISCV)
befb7447 521void force_sigsegv(int oldsig)
09391669 522{
09391669
PM
523 if (oldsig == SIGSEGV) {
524 /* Make sure we don't try to deliver the signal again; this will
c599d4d6 525 * end up with handle_pending_signal() calling dump_core_and_abort().
09391669
PM
526 */
527 sigact_table[oldsig - 1]._sa_handler = TARGET_SIG_DFL;
528 }
c4b35744 529 force_sig(TARGET_SIGSEGV);
09391669 530}
66fb9763 531
47ae93cd
MC
532#endif
533
9de5e440 534/* abort execution with signal */
c599d4d6 535static void QEMU_NORETURN dump_core_and_abort(int target_sig)
66fb9763 536{
0429a971
AF
537 CPUState *cpu = thread_cpu;
538 CPUArchState *env = cpu->env_ptr;
539 TaskState *ts = (TaskState *)cpu->opaque;
edf8e2af 540 int host_sig, core_dumped = 0;
603e4fd7 541 struct sigaction act;
c8ee0a44 542
66393fb9 543 host_sig = target_to_host_signal(target_sig);
c8ee0a44 544 trace_user_force_sig(env, target_sig, host_sig);
a2247f8e 545 gdb_signalled(env, target_sig);
603e4fd7 546
edf8e2af 547 /* dump core if supported by target binary format */
66393fb9 548 if (core_dump_signal(target_sig) && (ts->bprm->core_dump != NULL)) {
edf8e2af
MW
549 stop_all_tasks();
550 core_dumped =
a2247f8e 551 ((*ts->bprm->core_dump)(target_sig, env) == 0);
edf8e2af
MW
552 }
553 if (core_dumped) {
554 /* we already dumped the core of target process, we don't want
555 * a coredump of qemu itself */
556 struct rlimit nodump;
557 getrlimit(RLIMIT_CORE, &nodump);
558 nodump.rlim_cur=0;
559 setrlimit(RLIMIT_CORE, &nodump);
560 (void) fprintf(stderr, "qemu: uncaught target signal %d (%s) - %s\n",
66393fb9 561 target_sig, strsignal(host_sig), "core dumped" );
edf8e2af
MW
562 }
563
0c58751c 564 /* The proper exit code for dying from an uncaught signal is
603e4fd7
AJ
565 * -<signal>. The kernel doesn't allow exit() or _exit() to pass
566 * a negative value. To get the proper exit code we need to
567 * actually die from an uncaught signal. Here the default signal
568 * handler is installed, we send ourself a signal and we wait for
569 * it to arrive. */
570 sigfillset(&act.sa_mask);
571 act.sa_handler = SIG_DFL;
3a5d30bf 572 act.sa_flags = 0;
603e4fd7
AJ
573 sigaction(host_sig, &act, NULL);
574
575 /* For some reason raise(host_sig) doesn't send the signal when
576 * statically linked on x86-64. */
577 kill(getpid(), host_sig);
578
579 /* Make sure the signal isn't masked (just reuse the mask inside
580 of act) */
581 sigdelset(&act.sa_mask, host_sig);
582 sigsuspend(&act.sa_mask);
583
584 /* unreachable */
a6c6f76c 585 abort();
66fb9763
FB
586}
587
9de5e440
FB
588/* queue a signal so that it will be send to the virtual CPU as soon
589 as possible */
9d2803f7
PM
590int queue_signal(CPUArchState *env, int sig, int si_type,
591 target_siginfo_t *info)
31e31b8a 592{
0429a971
AF
593 CPUState *cpu = ENV_GET_CPU(env);
594 TaskState *ts = cpu->opaque;
66fb9763 595
c8ee0a44 596 trace_user_queue_signal(env, sig);
907f5fdd 597
9d2803f7 598 info->si_code = deposit32(info->si_code, 16, 16, si_type);
a70dadc7 599
655ed67c
TB
600 ts->sync_signal.info = *info;
601 ts->sync_signal.pending = sig;
907f5fdd
TB
602 /* signal that a new signal is pending */
603 atomic_set(&ts->signal_pending, 1);
604 return 1; /* indicates that the signal was queued */
9de5e440
FB
605}
606
4d330cee
TB
607#ifndef HAVE_SAFE_SYSCALL
608static inline void rewind_if_in_safe_syscall(void *puc)
609{
610 /* Default version: never rewind */
611}
612#endif
613
5fafdf24 614static void host_signal_handler(int host_signum, siginfo_t *info,
9de5e440
FB
615 void *puc)
616{
a2247f8e 617 CPUArchState *env = thread_cpu->env_ptr;
655ed67c
TB
618 CPUState *cpu = ENV_GET_CPU(env);
619 TaskState *ts = cpu->opaque;
620
9de5e440 621 int sig;
c227f099 622 target_siginfo_t tinfo;
3d3efba0 623 ucontext_t *uc = puc;
655ed67c 624 struct emulated_sigtable *k;
9de5e440
FB
625
626 /* the CPU emulator uses some host signals to detect exceptions,
eaa449b9 627 we forward to it some signals */
ca587a8e 628 if ((host_signum == SIGSEGV || host_signum == SIGBUS)
eaa449b9 629 && info->si_code > 0) {
b346ff46 630 if (cpu_signal_handler(host_signum, info, puc))
9de5e440
FB
631 return;
632 }
633
634 /* get target signal number */
635 sig = host_to_target_signal(host_signum);
636 if (sig < 1 || sig > TARGET_NSIG)
637 return;
c8ee0a44 638 trace_user_host_signal(env, host_signum, sig);
4d330cee
TB
639
640 rewind_if_in_safe_syscall(puc);
641
9de5e440 642 host_to_target_siginfo_noswap(&tinfo, info);
655ed67c
TB
643 k = &ts->sigtab[sig - 1];
644 k->info = tinfo;
645 k->pending = sig;
646 ts->signal_pending = 1;
647
648 /* Block host signals until target signal handler entered. We
649 * can't block SIGSEGV or SIGBUS while we're executing guest
650 * code in case the guest code provokes one in the window between
651 * now and it getting out to the main loop. Signals will be
652 * unblocked again in process_pending_signals().
1d48fdd9
PM
653 *
654 * WARNING: we cannot use sigfillset() here because the uc_sigmask
655 * field is a kernel sigset_t, which is much smaller than the
656 * libc sigset_t which sigfillset() operates on. Using sigfillset()
657 * would write 0xff bytes off the end of the structure and trash
658 * data on the struct.
659 * We can't use sizeof(uc->uc_sigmask) either, because the libc
660 * headers define the struct field with the wrong (too large) type.
655ed67c 661 */
1d48fdd9 662 memset(&uc->uc_sigmask, 0xff, SIGSET_T_SIZE);
655ed67c
TB
663 sigdelset(&uc->uc_sigmask, SIGSEGV);
664 sigdelset(&uc->uc_sigmask, SIGBUS);
3d3efba0 665
655ed67c
TB
666 /* interrupt the virtual CPU as soon as possible */
667 cpu_exit(thread_cpu);
66fb9763
FB
668}
669
0da46a6e 670/* do_sigaltstack() returns target values and errnos. */
579a97f7
FB
671/* compare linux/kernel/signal.c:do_sigaltstack() */
672abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong uoss_addr, abi_ulong sp)
a04e134a
TS
673{
674 int ret;
675 struct target_sigaltstack oss;
676
677 /* XXX: test errors */
579a97f7 678 if(uoss_addr)
a04e134a
TS
679 {
680 __put_user(target_sigaltstack_used.ss_sp, &oss.ss_sp);
681 __put_user(target_sigaltstack_used.ss_size, &oss.ss_size);
682 __put_user(sas_ss_flags(sp), &oss.ss_flags);
683 }
684
579a97f7 685 if(uss_addr)
a04e134a 686 {
579a97f7
FB
687 struct target_sigaltstack *uss;
688 struct target_sigaltstack ss;
0903c8be
TM
689 size_t minstacksize = TARGET_MINSIGSTKSZ;
690
691#if defined(TARGET_PPC64)
692 /* ELF V2 for PPC64 has a 4K minimum stack size for signal handlers */
693 struct image_info *image = ((TaskState *)thread_cpu->opaque)->info;
694 if (get_ppc64_abi(image) > 1) {
695 minstacksize = 4096;
696 }
697#endif
a04e134a 698
0da46a6e 699 ret = -TARGET_EFAULT;
9eeb8306 700 if (!lock_user_struct(VERIFY_READ, uss, uss_addr, 1)) {
a04e134a 701 goto out;
9eeb8306
RV
702 }
703 __get_user(ss.ss_sp, &uss->ss_sp);
704 __get_user(ss.ss_size, &uss->ss_size);
705 __get_user(ss.ss_flags, &uss->ss_flags);
579a97f7 706 unlock_user_struct(uss, uss_addr, 0);
a04e134a 707
0da46a6e 708 ret = -TARGET_EPERM;
a04e134a
TS
709 if (on_sig_stack(sp))
710 goto out;
711
0da46a6e 712 ret = -TARGET_EINVAL;
a04e134a
TS
713 if (ss.ss_flags != TARGET_SS_DISABLE
714 && ss.ss_flags != TARGET_SS_ONSTACK
715 && ss.ss_flags != 0)
716 goto out;
717
718 if (ss.ss_flags == TARGET_SS_DISABLE) {
719 ss.ss_size = 0;
720 ss.ss_sp = 0;
721 } else {
0da46a6e 722 ret = -TARGET_ENOMEM;
0903c8be 723 if (ss.ss_size < minstacksize) {
a04e134a 724 goto out;
0903c8be 725 }
a04e134a
TS
726 }
727
728 target_sigaltstack_used.ss_sp = ss.ss_sp;
729 target_sigaltstack_used.ss_size = ss.ss_size;
730 }
731
579a97f7 732 if (uoss_addr) {
0da46a6e 733 ret = -TARGET_EFAULT;
579a97f7 734 if (copy_to_user(uoss_addr, &oss, sizeof(oss)))
a04e134a 735 goto out;
a04e134a
TS
736 }
737
738 ret = 0;
739out:
740 return ret;
741}
742
ef6a778e 743/* do_sigaction() return target values and host errnos */
66fb9763
FB
744int do_sigaction(int sig, const struct target_sigaction *act,
745 struct target_sigaction *oact)
746{
624f7979 747 struct target_sigaction *k;
773b93ee
FB
748 struct sigaction act1;
749 int host_sig;
0da46a6e 750 int ret = 0;
66fb9763 751
ef6a778e
TB
752 if (sig < 1 || sig > TARGET_NSIG || sig == TARGET_SIGKILL || sig == TARGET_SIGSTOP) {
753 return -TARGET_EINVAL;
754 }
755
756 if (block_signals()) {
757 return -TARGET_ERESTARTSYS;
758 }
759
66fb9763 760 k = &sigact_table[sig - 1];
66fb9763 761 if (oact) {
d2565875
RH
762 __put_user(k->_sa_handler, &oact->_sa_handler);
763 __put_user(k->sa_flags, &oact->sa_flags);
7f047de1 764#ifdef TARGET_ARCH_HAS_SA_RESTORER
d2565875 765 __put_user(k->sa_restorer, &oact->sa_restorer);
388bb21a 766#endif
d2565875 767 /* Not swapped. */
624f7979 768 oact->sa_mask = k->sa_mask;
66fb9763
FB
769 }
770 if (act) {
624f7979 771 /* FIXME: This is not threadsafe. */
d2565875
RH
772 __get_user(k->_sa_handler, &act->_sa_handler);
773 __get_user(k->sa_flags, &act->sa_flags);
7f047de1 774#ifdef TARGET_ARCH_HAS_SA_RESTORER
d2565875 775 __get_user(k->sa_restorer, &act->sa_restorer);
388bb21a 776#endif
d2565875 777 /* To be swapped in target_to_host_sigset. */
624f7979 778 k->sa_mask = act->sa_mask;
773b93ee
FB
779
780 /* we update the host linux signal state */
781 host_sig = target_to_host_signal(sig);
782 if (host_sig != SIGSEGV && host_sig != SIGBUS) {
783 sigfillset(&act1.sa_mask);
784 act1.sa_flags = SA_SIGINFO;
624f7979 785 if (k->sa_flags & TARGET_SA_RESTART)
773b93ee
FB
786 act1.sa_flags |= SA_RESTART;
787 /* NOTE: it is important to update the host kernel signal
788 ignore state to avoid getting unexpected interrupted
789 syscalls */
624f7979 790 if (k->_sa_handler == TARGET_SIG_IGN) {
773b93ee 791 act1.sa_sigaction = (void *)SIG_IGN;
624f7979 792 } else if (k->_sa_handler == TARGET_SIG_DFL) {
ca587a8e
AJ
793 if (fatal_signal (sig))
794 act1.sa_sigaction = host_signal_handler;
795 else
796 act1.sa_sigaction = (void *)SIG_DFL;
773b93ee
FB
797 } else {
798 act1.sa_sigaction = host_signal_handler;
799 }
0da46a6e 800 ret = sigaction(host_sig, &act1, NULL);
773b93ee 801 }
66fb9763 802 }
0da46a6e 803 return ret;
66fb9763
FB
804}
805
31efaef1
PM
806static void handle_pending_signal(CPUArchState *cpu_env, int sig,
807 struct emulated_sigtable *k)
eb552501
PM
808{
809 CPUState *cpu = ENV_GET_CPU(cpu_env);
810 abi_ulong handler;
3d3efba0 811 sigset_t set;
eb552501
PM
812 target_sigset_t target_old_set;
813 struct target_sigaction *sa;
eb552501 814 TaskState *ts = cpu->opaque;
66fb9763 815
c8ee0a44 816 trace_user_handle_signal(cpu_env, sig);
66fb9763 817 /* dequeue signal */
907f5fdd 818 k->pending = 0;
3b46e624 819
db6b81d4 820 sig = gdb_handlesig(cpu, sig);
1fddef4b 821 if (!sig) {
ca587a8e
AJ
822 sa = NULL;
823 handler = TARGET_SIG_IGN;
824 } else {
825 sa = &sigact_table[sig - 1];
826 handler = sa->_sa_handler;
1fddef4b 827 }
66fb9763 828
0cb581d6
PM
829 if (do_strace) {
830 print_taken_signal(sig, &k->info);
831 }
832
66fb9763 833 if (handler == TARGET_SIG_DFL) {
ca587a8e
AJ
834 /* default handler : ignore some signal. The other are job control or fatal */
835 if (sig == TARGET_SIGTSTP || sig == TARGET_SIGTTIN || sig == TARGET_SIGTTOU) {
836 kill(getpid(),SIGSTOP);
837 } else if (sig != TARGET_SIGCHLD &&
838 sig != TARGET_SIGURG &&
839 sig != TARGET_SIGWINCH &&
840 sig != TARGET_SIGCONT) {
c599d4d6 841 dump_core_and_abort(sig);
66fb9763
FB
842 }
843 } else if (handler == TARGET_SIG_IGN) {
844 /* ignore sig */
845 } else if (handler == TARGET_SIG_ERR) {
c599d4d6 846 dump_core_and_abort(sig);
66fb9763 847 } else {
9de5e440 848 /* compute the blocked signals during the handler execution */
3d3efba0
PM
849 sigset_t *blocked_set;
850
624f7979 851 target_to_host_sigset(&set, &sa->sa_mask);
9de5e440
FB
852 /* SA_NODEFER indicates that the current signal should not be
853 blocked during the handler */
624f7979 854 if (!(sa->sa_flags & TARGET_SA_NODEFER))
9de5e440 855 sigaddset(&set, target_to_host_signal(sig));
3b46e624 856
9de5e440
FB
857 /* save the previous blocked signal state to restore it at the
858 end of the signal execution (see do_sigreturn) */
3d3efba0
PM
859 host_to_target_sigset_internal(&target_old_set, &ts->signal_mask);
860
861 /* block signals in the handler */
862 blocked_set = ts->in_sigsuspend ?
863 &ts->sigsuspend_mask : &ts->signal_mask;
864 sigorset(&ts->signal_mask, blocked_set, &set);
865 ts->in_sigsuspend = 0;
9de5e440 866
bc8a22cc 867 /* if the CPU is in VM86 mode, we restore the 32 bit values */
84409ddb 868#if defined(TARGET_I386) && !defined(TARGET_X86_64)
bc8a22cc
FB
869 {
870 CPUX86State *env = cpu_env;
871 if (env->eflags & VM_MASK)
872 save_v86_state(env);
873 }
874#endif
9de5e440 875 /* prepare the stack frame of the virtual CPU */
cb6ac802
LV
876#if defined(TARGET_ARCH_HAS_SETUP_FRAME)
877 if (sa->sa_flags & TARGET_SA_SIGINFO) {
907f5fdd 878 setup_rt_frame(sig, sa, &k->info, &target_old_set, cpu_env);
cb6ac802 879 } else {
624f7979 880 setup_frame(sig, sa, &target_old_set, cpu_env);
cb6ac802
LV
881 }
882#else
883 /* These targets do not have traditional signals. */
884 setup_rt_frame(sig, sa, &k->info, &target_old_set, cpu_env);
ff970904 885#endif
7ec87e06 886 if (sa->sa_flags & TARGET_SA_RESETHAND) {
624f7979 887 sa->_sa_handler = TARGET_SIG_DFL;
7ec87e06 888 }
31e31b8a 889 }
66fb9763 890}
e902d588
PM
891
892void process_pending_signals(CPUArchState *cpu_env)
893{
894 CPUState *cpu = ENV_GET_CPU(cpu_env);
895 int sig;
896 TaskState *ts = cpu->opaque;
3d3efba0
PM
897 sigset_t set;
898 sigset_t *blocked_set;
e902d588 899
3d3efba0
PM
900 while (atomic_read(&ts->signal_pending)) {
901 /* FIXME: This is not threadsafe. */
902 sigfillset(&set);
903 sigprocmask(SIG_SETMASK, &set, 0);
904
8bd3773c 905 restart_scan:
655ed67c
TB
906 sig = ts->sync_signal.pending;
907 if (sig) {
908 /* Synchronous signals are forced,
909 * see force_sig_info() and callers in Linux
910 * Note that not all of our queue_signal() calls in QEMU correspond
911 * to force_sig_info() calls in Linux (some are send_sig_info()).
912 * However it seems like a kernel bug to me to allow the process
913 * to block a synchronous signal since it could then just end up
914 * looping round and round indefinitely.
915 */
916 if (sigismember(&ts->signal_mask, target_to_host_signal_table[sig])
917 || sigact_table[sig - 1]._sa_handler == TARGET_SIG_IGN) {
918 sigdelset(&ts->signal_mask, target_to_host_signal_table[sig]);
919 sigact_table[sig - 1]._sa_handler = TARGET_SIG_DFL;
920 }
921
31efaef1 922 handle_pending_signal(cpu_env, sig, &ts->sync_signal);
655ed67c
TB
923 }
924
3d3efba0
PM
925 for (sig = 1; sig <= TARGET_NSIG; sig++) {
926 blocked_set = ts->in_sigsuspend ?
927 &ts->sigsuspend_mask : &ts->signal_mask;
928
929 if (ts->sigtab[sig - 1].pending &&
930 (!sigismember(blocked_set,
655ed67c 931 target_to_host_signal_table[sig]))) {
31efaef1 932 handle_pending_signal(cpu_env, sig, &ts->sigtab[sig - 1]);
8bd3773c
PM
933 /* Restart scan from the beginning, as handle_pending_signal
934 * might have resulted in a new synchronous signal (eg SIGSEGV).
935 */
936 goto restart_scan;
3d3efba0 937 }
e902d588 938 }
3d3efba0
PM
939
940 /* if no signal is pending, unblock signals and recheck (the act
941 * of unblocking might cause us to take another host signal which
942 * will set signal_pending again).
943 */
944 atomic_set(&ts->signal_pending, 0);
945 ts->in_sigsuspend = 0;
946 set = ts->signal_mask;
947 sigdelset(&set, SIGSEGV);
948 sigdelset(&set, SIGBUS);
949 sigprocmask(SIG_SETMASK, &set, 0);
950 }
951 ts->in_sigsuspend = 0;
e902d588 952}
This page took 1.096961 seconds and 4 git commands to generate.