1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#include "qemu/osdep.h"
20#include "qemu/bitops.h"
21#include <sys/ucontext.h>
22#include <sys/resource.h>
23
24#include "qemu.h"
25#include "trace.h"
26#include "signal-common.h"
27
28static struct target_sigaction sigact_table[TARGET_NSIG];
29
30static void host_signal_handler(int host_signum, siginfo_t *info,
31 void *puc);
32
33
34
35
36
37
38
39
40
41QEMU_BUILD_BUG_ON(__SIGRTMAX + 1 != _NSIG);
42static uint8_t host_to_target_signal_table[_NSIG] = {
43 [SIGHUP] = TARGET_SIGHUP,
44 [SIGINT] = TARGET_SIGINT,
45 [SIGQUIT] = TARGET_SIGQUIT,
46 [SIGILL] = TARGET_SIGILL,
47 [SIGTRAP] = TARGET_SIGTRAP,
48 [SIGABRT] = TARGET_SIGABRT,
49
50 [SIGBUS] = TARGET_SIGBUS,
51 [SIGFPE] = TARGET_SIGFPE,
52 [SIGKILL] = TARGET_SIGKILL,
53 [SIGUSR1] = TARGET_SIGUSR1,
54 [SIGSEGV] = TARGET_SIGSEGV,
55 [SIGUSR2] = TARGET_SIGUSR2,
56 [SIGPIPE] = TARGET_SIGPIPE,
57 [SIGALRM] = TARGET_SIGALRM,
58 [SIGTERM] = TARGET_SIGTERM,
59#ifdef SIGSTKFLT
60 [SIGSTKFLT] = TARGET_SIGSTKFLT,
61#endif
62 [SIGCHLD] = TARGET_SIGCHLD,
63 [SIGCONT] = TARGET_SIGCONT,
64 [SIGSTOP] = TARGET_SIGSTOP,
65 [SIGTSTP] = TARGET_SIGTSTP,
66 [SIGTTIN] = TARGET_SIGTTIN,
67 [SIGTTOU] = TARGET_SIGTTOU,
68 [SIGURG] = TARGET_SIGURG,
69 [SIGXCPU] = TARGET_SIGXCPU,
70 [SIGXFSZ] = TARGET_SIGXFSZ,
71 [SIGVTALRM] = TARGET_SIGVTALRM,
72 [SIGPROF] = TARGET_SIGPROF,
73 [SIGWINCH] = TARGET_SIGWINCH,
74 [SIGIO] = TARGET_SIGIO,
75 [SIGPWR] = TARGET_SIGPWR,
76 [SIGSYS] = TARGET_SIGSYS,
77
78};
79
80static uint8_t target_to_host_signal_table[TARGET_NSIG + 1];
81
82
83int host_to_target_signal(int sig)
84{
85 if (sig < 1 || sig >= _NSIG) {
86 return sig;
87 }
88 return host_to_target_signal_table[sig];
89}
90
91
92int target_to_host_signal(int sig)
93{
94 if (sig < 1 || sig > TARGET_NSIG) {
95 return sig;
96 }
97 return target_to_host_signal_table[sig];
98}
99
100static inline void target_sigaddset(target_sigset_t *set, int signum)
101{
102 signum--;
103 abi_ulong mask = (abi_ulong)1 << (signum % TARGET_NSIG_BPW);
104 set->sig[signum / TARGET_NSIG_BPW] |= mask;
105}
106
107static inline int target_sigismember(const target_sigset_t *set, int signum)
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
114void host_to_target_sigset_internal(target_sigset_t *d,
115 const sigset_t *s)
116{
117 int host_sig, target_sig;
118 target_sigemptyset(d);
119 for (host_sig = 1; host_sig < _NSIG; host_sig++) {
120 target_sig = host_to_target_signal(host_sig);
121 if (target_sig < 1 || target_sig > TARGET_NSIG) {
122 continue;
123 }
124 if (sigismember(s, host_sig)) {
125 target_sigaddset(d, target_sig);
126 }
127 }
128}
129
130void host_to_target_sigset(target_sigset_t *d, const sigset_t *s)
131{
132 target_sigset_t d1;
133 int i;
134
135 host_to_target_sigset_internal(&d1, s);
136 for(i = 0;i < TARGET_NSIG_WORDS; i++)
137 d->sig[i] = tswapal(d1.sig[i]);
138}
139
140void target_to_host_sigset_internal(sigset_t *d,
141 const target_sigset_t *s)
142{
143 int host_sig, target_sig;
144 sigemptyset(d);
145 for (target_sig = 1; target_sig <= TARGET_NSIG; target_sig++) {
146 host_sig = target_to_host_signal(target_sig);
147 if (host_sig < 1 || host_sig >= _NSIG) {
148 continue;
149 }
150 if (target_sigismember(s, target_sig)) {
151 sigaddset(d, host_sig);
152 }
153 }
154}
155
156void target_to_host_sigset(sigset_t *d, const target_sigset_t *s)
157{
158 target_sigset_t s1;
159 int i;
160
161 for(i = 0;i < TARGET_NSIG_WORDS; i++)
162 s1.sig[i] = tswapal(s->sig[i]);
163 target_to_host_sigset_internal(d, &s1);
164}
165
166void host_to_target_old_sigset(abi_ulong *old_sigset,
167 const sigset_t *sigset)
168{
169 target_sigset_t d;
170 host_to_target_sigset(&d, sigset);
171 *old_sigset = d.sig[0];
172}
173
174void target_to_host_old_sigset(sigset_t *sigset,
175 const abi_ulong *old_sigset)
176{
177 target_sigset_t d;
178 int i;
179
180 d.sig[0] = *old_sigset;
181 for(i = 1;i < TARGET_NSIG_WORDS; i++)
182 d.sig[i] = 0;
183 target_to_host_sigset(sigset, &d);
184}
185
186int block_signals(void)
187{
188 TaskState *ts = (TaskState *)thread_cpu->opaque;
189 sigset_t set;
190
191
192
193
194
195 sigfillset(&set);
196 sigprocmask(SIG_SETMASK, &set, 0);
197
198 return qatomic_xchg(&ts->signal_pending, 1);
199}
200
201
202
203
204
205
206
207
208int do_sigprocmask(int how, const sigset_t *set, sigset_t *oldset)
209{
210 TaskState *ts = (TaskState *)thread_cpu->opaque;
211
212 if (oldset) {
213 *oldset = ts->signal_mask;
214 }
215
216 if (set) {
217 int i;
218
219 if (block_signals()) {
220 return -TARGET_ERESTARTSYS;
221 }
222
223 switch (how) {
224 case SIG_BLOCK:
225 sigorset(&ts->signal_mask, &ts->signal_mask, set);
226 break;
227 case SIG_UNBLOCK:
228 for (i = 1; i <= NSIG; ++i) {
229 if (sigismember(set, i)) {
230 sigdelset(&ts->signal_mask, i);
231 }
232 }
233 break;
234 case SIG_SETMASK:
235 ts->signal_mask = *set;
236 break;
237 default:
238 g_assert_not_reached();
239 }
240
241
242 sigdelset(&ts->signal_mask, SIGKILL);
243 sigdelset(&ts->signal_mask, SIGSTOP);
244 }
245 return 0;
246}
247
248#if !defined(TARGET_NIOS2)
249
250
251
252void set_sigmask(const sigset_t *set)
253{
254 TaskState *ts = (TaskState *)thread_cpu->opaque;
255
256 ts->signal_mask = *set;
257}
258#endif
259
260
261
262int on_sig_stack(unsigned long sp)
263{
264 TaskState *ts = (TaskState *)thread_cpu->opaque;
265
266 return (sp - ts->sigaltstack_used.ss_sp
267 < ts->sigaltstack_used.ss_size);
268}
269
270int sas_ss_flags(unsigned long sp)
271{
272 TaskState *ts = (TaskState *)thread_cpu->opaque;
273
274 return (ts->sigaltstack_used.ss_size == 0 ? SS_DISABLE
275 : on_sig_stack(sp) ? SS_ONSTACK : 0);
276}
277
278abi_ulong target_sigsp(abi_ulong sp, struct target_sigaction *ka)
279{
280
281
282
283 TaskState *ts = (TaskState *)thread_cpu->opaque;
284
285 if ((ka->sa_flags & TARGET_SA_ONSTACK) && !sas_ss_flags(sp)) {
286 return ts->sigaltstack_used.ss_sp + ts->sigaltstack_used.ss_size;
287 }
288 return sp;
289}
290
291void target_save_altstack(target_stack_t *uss, CPUArchState *env)
292{
293 TaskState *ts = (TaskState *)thread_cpu->opaque;
294
295 __put_user(ts->sigaltstack_used.ss_sp, &uss->ss_sp);
296 __put_user(sas_ss_flags(get_sp_from_cpustate(env)), &uss->ss_flags);
297 __put_user(ts->sigaltstack_used.ss_size, &uss->ss_size);
298}
299
300
301
302static inline void host_to_target_siginfo_noswap(target_siginfo_t *tinfo,
303 const siginfo_t *info)
304{
305 int sig = host_to_target_signal(info->si_signo);
306 int si_code = info->si_code;
307 int si_type;
308 tinfo->si_signo = sig;
309 tinfo->si_errno = 0;
310 tinfo->si_code = info->si_code;
311
312
313
314
315
316
317
318 memset(tinfo->_sifields._pad, 0, sizeof(tinfo->_sifields._pad));
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335 switch (si_code) {
336 case SI_USER:
337 case SI_TKILL:
338 case SI_KERNEL:
339
340
341
342 tinfo->_sifields._kill._pid = info->si_pid;
343 tinfo->_sifields._kill._uid = info->si_uid;
344 si_type = QEMU_SI_KILL;
345 break;
346 default:
347
348 switch (sig) {
349 case TARGET_SIGCHLD:
350 tinfo->_sifields._sigchld._pid = info->si_pid;
351 tinfo->_sifields._sigchld._uid = info->si_uid;
352 tinfo->_sifields._sigchld._status = info->si_status;
353 tinfo->_sifields._sigchld._utime = info->si_utime;
354 tinfo->_sifields._sigchld._stime = info->si_stime;
355 si_type = QEMU_SI_CHLD;
356 break;
357 case TARGET_SIGIO:
358 tinfo->_sifields._sigpoll._band = info->si_band;
359 tinfo->_sifields._sigpoll._fd = info->si_fd;
360 si_type = QEMU_SI_POLL;
361 break;
362 default:
363
364 tinfo->_sifields._rt._pid = info->si_pid;
365 tinfo->_sifields._rt._uid = info->si_uid;
366
367 tinfo->_sifields._rt._sigval.sival_ptr
368 = (abi_ulong)(unsigned long)info->si_value.sival_ptr;
369 si_type = QEMU_SI_RT;
370 break;
371 }
372 break;
373 }
374
375 tinfo->si_code = deposit32(si_code, 16, 16, si_type);
376}
377
378void tswap_siginfo(target_siginfo_t *tinfo,
379 const target_siginfo_t *info)
380{
381 int si_type = extract32(info->si_code, 16, 16);
382 int si_code = sextract32(info->si_code, 0, 16);
383
384 __put_user(info->si_signo, &tinfo->si_signo);
385 __put_user(info->si_errno, &tinfo->si_errno);
386 __put_user(si_code, &tinfo->si_code);
387
388
389
390
391
392 switch (si_type) {
393 case QEMU_SI_KILL:
394 __put_user(info->_sifields._kill._pid, &tinfo->_sifields._kill._pid);
395 __put_user(info->_sifields._kill._uid, &tinfo->_sifields._kill._uid);
396 break;
397 case QEMU_SI_TIMER:
398 __put_user(info->_sifields._timer._timer1,
399 &tinfo->_sifields._timer._timer1);
400 __put_user(info->_sifields._timer._timer2,
401 &tinfo->_sifields._timer._timer2);
402 break;
403 case QEMU_SI_POLL:
404 __put_user(info->_sifields._sigpoll._band,
405 &tinfo->_sifields._sigpoll._band);
406 __put_user(info->_sifields._sigpoll._fd,
407 &tinfo->_sifields._sigpoll._fd);
408 break;
409 case QEMU_SI_FAULT:
410 __put_user(info->_sifields._sigfault._addr,
411 &tinfo->_sifields._sigfault._addr);
412 break;
413 case QEMU_SI_CHLD:
414 __put_user(info->_sifields._sigchld._pid,
415 &tinfo->_sifields._sigchld._pid);
416 __put_user(info->_sifields._sigchld._uid,
417 &tinfo->_sifields._sigchld._uid);
418 __put_user(info->_sifields._sigchld._status,
419 &tinfo->_sifields._sigchld._status);
420 __put_user(info->_sifields._sigchld._utime,
421 &tinfo->_sifields._sigchld._utime);
422 __put_user(info->_sifields._sigchld._stime,
423 &tinfo->_sifields._sigchld._stime);
424 break;
425 case QEMU_SI_RT:
426 __put_user(info->_sifields._rt._pid, &tinfo->_sifields._rt._pid);
427 __put_user(info->_sifields._rt._uid, &tinfo->_sifields._rt._uid);
428 __put_user(info->_sifields._rt._sigval.sival_ptr,
429 &tinfo->_sifields._rt._sigval.sival_ptr);
430 break;
431 default:
432 g_assert_not_reached();
433 }
434}
435
436void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info)
437{
438 target_siginfo_t tgt_tmp;
439 host_to_target_siginfo_noswap(&tgt_tmp, info);
440 tswap_siginfo(tinfo, &tgt_tmp);
441}
442
443
444
445void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo)
446{
447
448
449
450 abi_ulong sival_ptr;
451
452 __get_user(info->si_signo, &tinfo->si_signo);
453 __get_user(info->si_errno, &tinfo->si_errno);
454 __get_user(info->si_code, &tinfo->si_code);
455 __get_user(info->si_pid, &tinfo->_sifields._rt._pid);
456 __get_user(info->si_uid, &tinfo->_sifields._rt._uid);
457 __get_user(sival_ptr, &tinfo->_sifields._rt._sigval.sival_ptr);
458 info->si_value.sival_ptr = (void *)(long)sival_ptr;
459}
460
461static int fatal_signal (int sig)
462{
463 switch (sig) {
464 case TARGET_SIGCHLD:
465 case TARGET_SIGURG:
466 case TARGET_SIGWINCH:
467
468 return 0;
469 case TARGET_SIGCONT:
470 case TARGET_SIGSTOP:
471 case TARGET_SIGTSTP:
472 case TARGET_SIGTTIN:
473 case TARGET_SIGTTOU:
474
475 return 0;
476 default:
477 return 1;
478 }
479}
480
481
482static int core_dump_signal(int sig)
483{
484 switch (sig) {
485 case TARGET_SIGABRT:
486 case TARGET_SIGFPE:
487 case TARGET_SIGILL:
488 case TARGET_SIGQUIT:
489 case TARGET_SIGSEGV:
490 case TARGET_SIGTRAP:
491 case TARGET_SIGBUS:
492 return (1);
493 default:
494 return (0);
495 }
496}
497
498static void signal_table_init(void)
499{
500 int host_sig, target_sig, count;
501
502
503
504
505
506
507
508
509
510
511
512
513 for (host_sig = SIGRTMIN; host_sig <= SIGRTMAX; host_sig++) {
514 target_sig = host_sig - SIGRTMIN + TARGET_SIGRTMIN;
515 if (target_sig <= TARGET_NSIG) {
516 host_to_target_signal_table[host_sig] = target_sig;
517 }
518 }
519
520
521 for (target_sig = 1; target_sig <= TARGET_NSIG; target_sig++) {
522 target_to_host_signal_table[target_sig] = _NSIG;
523 }
524 for (host_sig = 1; host_sig < _NSIG; host_sig++) {
525 if (host_to_target_signal_table[host_sig] == 0) {
526 host_to_target_signal_table[host_sig] = host_sig;
527 }
528 target_sig = host_to_target_signal_table[host_sig];
529 if (target_sig <= TARGET_NSIG) {
530 target_to_host_signal_table[target_sig] = host_sig;
531 }
532 }
533
534 if (trace_event_get_state_backends(TRACE_SIGNAL_TABLE_INIT)) {
535 for (target_sig = 1, count = 0; target_sig <= TARGET_NSIG; target_sig++) {
536 if (target_to_host_signal_table[target_sig] == _NSIG) {
537 count++;
538 }
539 }
540 trace_signal_table_init(count);
541 }
542}
543
544void signal_init(void)
545{
546 TaskState *ts = (TaskState *)thread_cpu->opaque;
547 struct sigaction act;
548 struct sigaction oact;
549 int i;
550 int host_sig;
551
552
553 signal_table_init();
554
555
556 sigprocmask(0, 0, &ts->signal_mask);
557
558 sigfillset(&act.sa_mask);
559 act.sa_flags = SA_SIGINFO;
560 act.sa_sigaction = host_signal_handler;
561 for(i = 1; i <= TARGET_NSIG; i++) {
562#ifdef CONFIG_GPROF
563 if (i == TARGET_SIGPROF) {
564 continue;
565 }
566#endif
567 host_sig = target_to_host_signal(i);
568 sigaction(host_sig, NULL, &oact);
569 if (oact.sa_sigaction == (void *)SIG_IGN) {
570 sigact_table[i - 1]._sa_handler = TARGET_SIG_IGN;
571 } else if (oact.sa_sigaction == (void *)SIG_DFL) {
572 sigact_table[i - 1]._sa_handler = TARGET_SIG_DFL;
573 }
574
575
576
577
578
579
580 if (fatal_signal (i))
581 sigaction(host_sig, &act, NULL);
582 }
583}
584
585
586
587
588
589void force_sig(int sig)
590{
591 CPUState *cpu = thread_cpu;
592 CPUArchState *env = cpu->env_ptr;
593 target_siginfo_t info;
594
595 info.si_signo = sig;
596 info.si_errno = 0;
597 info.si_code = TARGET_SI_KERNEL;
598 info._sifields._kill._pid = 0;
599 info._sifields._kill._uid = 0;
600 queue_signal(env, info.si_signo, QEMU_SI_KILL, &info);
601}
602
603
604
605
606
607#if !defined(TARGET_RISCV)
608void force_sigsegv(int oldsig)
609{
610 if (oldsig == SIGSEGV) {
611
612
613
614 sigact_table[oldsig - 1]._sa_handler = TARGET_SIG_DFL;
615 }
616 force_sig(TARGET_SIGSEGV);
617}
618
619#endif
620
621
622static void QEMU_NORETURN dump_core_and_abort(int target_sig)
623{
624 CPUState *cpu = thread_cpu;
625 CPUArchState *env = cpu->env_ptr;
626 TaskState *ts = (TaskState *)cpu->opaque;
627 int host_sig, core_dumped = 0;
628 struct sigaction act;
629
630 host_sig = target_to_host_signal(target_sig);
631 trace_user_force_sig(env, target_sig, host_sig);
632 gdb_signalled(env, target_sig);
633
634
635 if (core_dump_signal(target_sig) && (ts->bprm->core_dump != NULL)) {
636 stop_all_tasks();
637 core_dumped =
638 ((*ts->bprm->core_dump)(target_sig, env) == 0);
639 }
640 if (core_dumped) {
641
642
643 struct rlimit nodump;
644 getrlimit(RLIMIT_CORE, &nodump);
645 nodump.rlim_cur=0;
646 setrlimit(RLIMIT_CORE, &nodump);
647 (void) fprintf(stderr, "qemu: uncaught target signal %d (%s) - %s\n",
648 target_sig, strsignal(host_sig), "core dumped" );
649 }
650
651
652
653
654
655
656
657 sigfillset(&act.sa_mask);
658 act.sa_handler = SIG_DFL;
659 act.sa_flags = 0;
660 sigaction(host_sig, &act, NULL);
661
662
663
664 kill(getpid(), host_sig);
665
666
667
668 sigdelset(&act.sa_mask, host_sig);
669 sigsuspend(&act.sa_mask);
670
671
672 abort();
673}
674
675
676
677int queue_signal(CPUArchState *env, int sig, int si_type,
678 target_siginfo_t *info)
679{
680 CPUState *cpu = env_cpu(env);
681 TaskState *ts = cpu->opaque;
682
683 trace_user_queue_signal(env, sig);
684
685 info->si_code = deposit32(info->si_code, 16, 16, si_type);
686
687 ts->sync_signal.info = *info;
688 ts->sync_signal.pending = sig;
689
690 qatomic_set(&ts->signal_pending, 1);
691 return 1;
692}
693
694#ifndef HAVE_SAFE_SYSCALL
695static inline void rewind_if_in_safe_syscall(void *puc)
696{
697
698}
699#endif
700
701static void host_signal_handler(int host_signum, siginfo_t *info,
702 void *puc)
703{
704 CPUArchState *env = thread_cpu->env_ptr;
705 CPUState *cpu = env_cpu(env);
706 TaskState *ts = cpu->opaque;
707
708 int sig;
709 target_siginfo_t tinfo;
710 ucontext_t *uc = puc;
711 struct emulated_sigtable *k;
712
713
714
715 if ((host_signum == SIGSEGV || host_signum == SIGBUS)
716 && info->si_code > 0) {
717 if (cpu_signal_handler(host_signum, info, puc))
718 return;
719 }
720
721
722 sig = host_to_target_signal(host_signum);
723 if (sig < 1 || sig > TARGET_NSIG)
724 return;
725 trace_user_host_signal(env, host_signum, sig);
726
727 rewind_if_in_safe_syscall(puc);
728
729 host_to_target_siginfo_noswap(&tinfo, info);
730 k = &ts->sigtab[sig - 1];
731 k->info = tinfo;
732 k->pending = sig;
733 ts->signal_pending = 1;
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749 memset(&uc->uc_sigmask, 0xff, SIGSET_T_SIZE);
750 sigdelset(&uc->uc_sigmask, SIGSEGV);
751 sigdelset(&uc->uc_sigmask, SIGBUS);
752
753
754 cpu_exit(thread_cpu);
755}
756
757
758
759abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong uoss_addr, abi_ulong sp)
760{
761 int ret;
762 struct target_sigaltstack oss;
763 TaskState *ts = (TaskState *)thread_cpu->opaque;
764
765
766 if(uoss_addr)
767 {
768 __put_user(ts->sigaltstack_used.ss_sp, &oss.ss_sp);
769 __put_user(ts->sigaltstack_used.ss_size, &oss.ss_size);
770 __put_user(sas_ss_flags(sp), &oss.ss_flags);
771 }
772
773 if(uss_addr)
774 {
775 struct target_sigaltstack *uss;
776 struct target_sigaltstack ss;
777 size_t minstacksize = TARGET_MINSIGSTKSZ;
778
779#if defined(TARGET_PPC64)
780
781 struct image_info *image = ((TaskState *)thread_cpu->opaque)->info;
782 if (get_ppc64_abi(image) > 1) {
783 minstacksize = 4096;
784 }
785#endif
786
787 ret = -TARGET_EFAULT;
788 if (!lock_user_struct(VERIFY_READ, uss, uss_addr, 1)) {
789 goto out;
790 }
791 __get_user(ss.ss_sp, &uss->ss_sp);
792 __get_user(ss.ss_size, &uss->ss_size);
793 __get_user(ss.ss_flags, &uss->ss_flags);
794 unlock_user_struct(uss, uss_addr, 0);
795
796 ret = -TARGET_EPERM;
797 if (on_sig_stack(sp))
798 goto out;
799
800 ret = -TARGET_EINVAL;
801 if (ss.ss_flags != TARGET_SS_DISABLE
802 && ss.ss_flags != TARGET_SS_ONSTACK
803 && ss.ss_flags != 0)
804 goto out;
805
806 if (ss.ss_flags == TARGET_SS_DISABLE) {
807 ss.ss_size = 0;
808 ss.ss_sp = 0;
809 } else {
810 ret = -TARGET_ENOMEM;
811 if (ss.ss_size < minstacksize) {
812 goto out;
813 }
814 }
815
816 ts->sigaltstack_used.ss_sp = ss.ss_sp;
817 ts->sigaltstack_used.ss_size = ss.ss_size;
818 }
819
820 if (uoss_addr) {
821 ret = -TARGET_EFAULT;
822 if (copy_to_user(uoss_addr, &oss, sizeof(oss)))
823 goto out;
824 }
825
826 ret = 0;
827out:
828 return ret;
829}
830
831
832int do_sigaction(int sig, const struct target_sigaction *act,
833 struct target_sigaction *oact)
834{
835 struct target_sigaction *k;
836 struct sigaction act1;
837 int host_sig;
838 int ret = 0;
839
840 trace_signal_do_sigaction_guest(sig, TARGET_NSIG);
841
842 if (sig < 1 || sig > TARGET_NSIG || sig == TARGET_SIGKILL || sig == TARGET_SIGSTOP) {
843 return -TARGET_EINVAL;
844 }
845
846 if (block_signals()) {
847 return -TARGET_ERESTARTSYS;
848 }
849
850 k = &sigact_table[sig - 1];
851 if (oact) {
852 __put_user(k->_sa_handler, &oact->_sa_handler);
853 __put_user(k->sa_flags, &oact->sa_flags);
854#ifdef TARGET_ARCH_HAS_SA_RESTORER
855 __put_user(k->sa_restorer, &oact->sa_restorer);
856#endif
857
858 oact->sa_mask = k->sa_mask;
859 }
860 if (act) {
861
862 __get_user(k->_sa_handler, &act->_sa_handler);
863 __get_user(k->sa_flags, &act->sa_flags);
864#ifdef TARGET_ARCH_HAS_SA_RESTORER
865 __get_user(k->sa_restorer, &act->sa_restorer);
866#endif
867
868 k->sa_mask = act->sa_mask;
869
870
871 host_sig = target_to_host_signal(sig);
872 trace_signal_do_sigaction_host(host_sig, TARGET_NSIG);
873 if (host_sig > SIGRTMAX) {
874
875 qemu_log_mask(LOG_UNIMP, "Unsupported target signal #%d, ignored\n",
876 sig);
877
878
879
880
881
882
883
884
885
886
887 return 0;
888 }
889 if (host_sig != SIGSEGV && host_sig != SIGBUS) {
890 sigfillset(&act1.sa_mask);
891 act1.sa_flags = SA_SIGINFO;
892 if (k->sa_flags & TARGET_SA_RESTART)
893 act1.sa_flags |= SA_RESTART;
894
895
896
897 if (k->_sa_handler == TARGET_SIG_IGN) {
898 act1.sa_sigaction = (void *)SIG_IGN;
899 } else if (k->_sa_handler == TARGET_SIG_DFL) {
900 if (fatal_signal (sig))
901 act1.sa_sigaction = host_signal_handler;
902 else
903 act1.sa_sigaction = (void *)SIG_DFL;
904 } else {
905 act1.sa_sigaction = host_signal_handler;
906 }
907 ret = sigaction(host_sig, &act1, NULL);
908 }
909 }
910 return ret;
911}
912
913static void handle_pending_signal(CPUArchState *cpu_env, int sig,
914 struct emulated_sigtable *k)
915{
916 CPUState *cpu = env_cpu(cpu_env);
917 abi_ulong handler;
918 sigset_t set;
919 target_sigset_t target_old_set;
920 struct target_sigaction *sa;
921 TaskState *ts = cpu->opaque;
922
923 trace_user_handle_signal(cpu_env, sig);
924
925 k->pending = 0;
926
927 sig = gdb_handlesig(cpu, sig);
928 if (!sig) {
929 sa = NULL;
930 handler = TARGET_SIG_IGN;
931 } else {
932 sa = &sigact_table[sig - 1];
933 handler = sa->_sa_handler;
934 }
935
936 if (unlikely(qemu_loglevel_mask(LOG_STRACE))) {
937 print_taken_signal(sig, &k->info);
938 }
939
940 if (handler == TARGET_SIG_DFL) {
941
942 if (sig == TARGET_SIGTSTP || sig == TARGET_SIGTTIN || sig == TARGET_SIGTTOU) {
943 kill(getpid(),SIGSTOP);
944 } else if (sig != TARGET_SIGCHLD &&
945 sig != TARGET_SIGURG &&
946 sig != TARGET_SIGWINCH &&
947 sig != TARGET_SIGCONT) {
948 dump_core_and_abort(sig);
949 }
950 } else if (handler == TARGET_SIG_IGN) {
951
952 } else if (handler == TARGET_SIG_ERR) {
953 dump_core_and_abort(sig);
954 } else {
955
956 sigset_t *blocked_set;
957
958 target_to_host_sigset(&set, &sa->sa_mask);
959
960
961 if (!(sa->sa_flags & TARGET_SA_NODEFER))
962 sigaddset(&set, target_to_host_signal(sig));
963
964
965
966 host_to_target_sigset_internal(&target_old_set, &ts->signal_mask);
967
968
969 blocked_set = ts->in_sigsuspend ?
970 &ts->sigsuspend_mask : &ts->signal_mask;
971 sigorset(&ts->signal_mask, blocked_set, &set);
972 ts->in_sigsuspend = 0;
973
974
975#if defined(TARGET_I386) && !defined(TARGET_X86_64)
976 {
977 CPUX86State *env = cpu_env;
978 if (env->eflags & VM_MASK)
979 save_v86_state(env);
980 }
981#endif
982
983#if defined(TARGET_ARCH_HAS_SETUP_FRAME)
984 if (sa->sa_flags & TARGET_SA_SIGINFO) {
985 setup_rt_frame(sig, sa, &k->info, &target_old_set, cpu_env);
986 } else {
987 setup_frame(sig, sa, &target_old_set, cpu_env);
988 }
989#else
990
991 setup_rt_frame(sig, sa, &k->info, &target_old_set, cpu_env);
992#endif
993 if (sa->sa_flags & TARGET_SA_RESETHAND) {
994 sa->_sa_handler = TARGET_SIG_DFL;
995 }
996 }
997}
998
999void process_pending_signals(CPUArchState *cpu_env)
1000{
1001 CPUState *cpu = env_cpu(cpu_env);
1002 int sig;
1003 TaskState *ts = cpu->opaque;
1004 sigset_t set;
1005 sigset_t *blocked_set;
1006
1007 while (qatomic_read(&ts->signal_pending)) {
1008
1009 sigfillset(&set);
1010 sigprocmask(SIG_SETMASK, &set, 0);
1011
1012 restart_scan:
1013 sig = ts->sync_signal.pending;
1014 if (sig) {
1015
1016
1017
1018
1019
1020
1021
1022
1023 if (sigismember(&ts->signal_mask, target_to_host_signal_table[sig])
1024 || sigact_table[sig - 1]._sa_handler == TARGET_SIG_IGN) {
1025 sigdelset(&ts->signal_mask, target_to_host_signal_table[sig]);
1026 sigact_table[sig - 1]._sa_handler = TARGET_SIG_DFL;
1027 }
1028
1029 handle_pending_signal(cpu_env, sig, &ts->sync_signal);
1030 }
1031
1032 for (sig = 1; sig <= TARGET_NSIG; sig++) {
1033 blocked_set = ts->in_sigsuspend ?
1034 &ts->sigsuspend_mask : &ts->signal_mask;
1035
1036 if (ts->sigtab[sig - 1].pending &&
1037 (!sigismember(blocked_set,
1038 target_to_host_signal_table[sig]))) {
1039 handle_pending_signal(cpu_env, sig, &ts->sigtab[sig - 1]);
1040
1041
1042
1043 goto restart_scan;
1044 }
1045 }
1046
1047
1048
1049
1050
1051 qatomic_set(&ts->signal_pending, 0);
1052 ts->in_sigsuspend = 0;
1053 set = ts->signal_mask;
1054 sigdelset(&set, SIGSEGV);
1055 sigdelset(&set, SIGBUS);
1056 sigprocmask(SIG_SETMASK, &set, 0);
1057 }
1058 ts->in_sigsuspend = 0;
1059}
1060