Revision 714bd040
b/cpus.c | ||
---|---|---|
196 | 196 |
#endif |
197 | 197 |
} |
198 | 198 |
|
199 |
#ifdef CONFIG_IOTHREAD |
|
200 |
static void cpu_signal(int sig) |
|
201 |
{ |
|
202 |
if (cpu_single_env) { |
|
203 |
cpu_exit(cpu_single_env); |
|
204 |
} |
|
205 |
exit_request = 1; |
|
206 |
} |
|
207 |
#endif |
|
208 |
|
|
199 | 209 |
#ifdef CONFIG_LINUX |
200 | 210 |
static void sigbus_reraise(void) |
201 | 211 |
{ |
... | ... | |
390 | 400 |
return 0; |
391 | 401 |
} |
392 | 402 |
|
403 |
static void qemu_kvm_init_cpu_signals(CPUState *env) |
|
404 |
{ |
|
405 |
int r; |
|
406 |
sigset_t set; |
|
407 |
struct sigaction sigact; |
|
408 |
|
|
409 |
memset(&sigact, 0, sizeof(sigact)); |
|
410 |
sigact.sa_handler = dummy_signal; |
|
411 |
sigaction(SIG_IPI, &sigact, NULL); |
|
412 |
|
|
413 |
#ifdef CONFIG_IOTHREAD |
|
414 |
pthread_sigmask(SIG_BLOCK, NULL, &set); |
|
415 |
sigdelset(&set, SIG_IPI); |
|
416 |
sigdelset(&set, SIGBUS); |
|
417 |
r = kvm_set_signal_mask(env, &set); |
|
418 |
if (r) { |
|
419 |
fprintf(stderr, "kvm_set_signal_mask: %s\n", strerror(-r)); |
|
420 |
exit(1); |
|
421 |
} |
|
422 |
#else |
|
423 |
sigemptyset(&set); |
|
424 |
sigaddset(&set, SIG_IPI); |
|
425 |
sigaddset(&set, SIGIO); |
|
426 |
sigaddset(&set, SIGALRM); |
|
427 |
pthread_sigmask(SIG_BLOCK, &set, NULL); |
|
428 |
|
|
429 |
pthread_sigmask(SIG_BLOCK, NULL, &set); |
|
430 |
sigdelset(&set, SIGIO); |
|
431 |
sigdelset(&set, SIGALRM); |
|
432 |
#endif |
|
433 |
sigdelset(&set, SIG_IPI); |
|
434 |
sigdelset(&set, SIGBUS); |
|
435 |
r = kvm_set_signal_mask(env, &set); |
|
436 |
if (r) { |
|
437 |
fprintf(stderr, "kvm_set_signal_mask: %s\n", strerror(-r)); |
|
438 |
exit(1); |
|
439 |
} |
|
440 |
} |
|
441 |
|
|
442 |
static void qemu_tcg_init_cpu_signals(void) |
|
443 |
{ |
|
444 |
#ifdef CONFIG_IOTHREAD |
|
445 |
sigset_t set; |
|
446 |
struct sigaction sigact; |
|
447 |
|
|
448 |
memset(&sigact, 0, sizeof(sigact)); |
|
449 |
sigact.sa_handler = cpu_signal; |
|
450 |
sigaction(SIG_IPI, &sigact, NULL); |
|
451 |
|
|
452 |
sigemptyset(&set); |
|
453 |
sigaddset(&set, SIG_IPI); |
|
454 |
pthread_sigmask(SIG_UNBLOCK, &set, NULL); |
|
455 |
#endif |
|
456 |
} |
|
457 |
|
|
393 | 458 |
static void qemu_kvm_eat_signals(CPUState *env) |
394 | 459 |
{ |
395 | 460 |
struct timespec ts = { 0, 0 }; |
... | ... | |
470 | 535 |
return 0; |
471 | 536 |
} |
472 | 537 |
|
473 |
#endif /* _WIN32 */ |
|
474 |
|
|
475 |
#ifndef CONFIG_IOTHREAD |
|
476 | 538 |
static void qemu_kvm_init_cpu_signals(CPUState *env) |
477 | 539 |
{ |
478 |
#ifndef _WIN32 |
|
479 |
int r; |
|
480 |
sigset_t set; |
|
481 |
struct sigaction sigact; |
|
482 |
|
|
483 |
memset(&sigact, 0, sizeof(sigact)); |
|
484 |
sigact.sa_handler = dummy_signal; |
|
485 |
sigaction(SIG_IPI, &sigact, NULL); |
|
486 |
|
|
487 |
sigemptyset(&set); |
|
488 |
sigaddset(&set, SIG_IPI); |
|
489 |
sigaddset(&set, SIGIO); |
|
490 |
sigaddset(&set, SIGALRM); |
|
491 |
pthread_sigmask(SIG_BLOCK, &set, NULL); |
|
540 |
abort(); |
|
541 |
} |
|
492 | 542 |
|
493 |
pthread_sigmask(SIG_BLOCK, NULL, &set); |
|
494 |
sigdelset(&set, SIG_IPI); |
|
495 |
sigdelset(&set, SIGBUS); |
|
496 |
sigdelset(&set, SIGIO); |
|
497 |
sigdelset(&set, SIGALRM); |
|
498 |
r = kvm_set_signal_mask(env, &set); |
|
499 |
if (r) { |
|
500 |
fprintf(stderr, "kvm_set_signal_mask: %s\n", strerror(-r)); |
|
501 |
exit(1); |
|
502 |
} |
|
503 |
#endif |
|
543 |
static void qemu_tcg_init_cpu_signals(void) |
|
544 |
{ |
|
504 | 545 |
} |
546 |
#endif /* _WIN32 */ |
|
505 | 547 |
|
548 |
#ifndef CONFIG_IOTHREAD |
|
506 | 549 |
int qemu_init_main_loop(void) |
507 | 550 |
{ |
508 | 551 |
int ret; |
... | ... | |
536 | 579 |
exit(1); |
537 | 580 |
} |
538 | 581 |
qemu_kvm_init_cpu_signals(env); |
582 |
} else { |
|
583 |
qemu_tcg_init_cpu_signals(); |
|
539 | 584 |
} |
540 | 585 |
} |
541 | 586 |
|
... | ... | |
616 | 661 |
static QemuCond qemu_pause_cond; |
617 | 662 |
static QemuCond qemu_work_cond; |
618 | 663 |
|
619 |
static void cpu_signal(int sig) |
|
620 |
{ |
|
621 |
if (cpu_single_env) { |
|
622 |
cpu_exit(cpu_single_env); |
|
623 |
} |
|
624 |
exit_request = 1; |
|
625 |
} |
|
626 |
|
|
627 |
static void qemu_kvm_init_cpu_signals(CPUState *env) |
|
628 |
{ |
|
629 |
int r; |
|
630 |
sigset_t set; |
|
631 |
struct sigaction sigact; |
|
632 |
|
|
633 |
memset(&sigact, 0, sizeof(sigact)); |
|
634 |
sigact.sa_handler = dummy_signal; |
|
635 |
sigaction(SIG_IPI, &sigact, NULL); |
|
636 |
|
|
637 |
pthread_sigmask(SIG_BLOCK, NULL, &set); |
|
638 |
sigdelset(&set, SIG_IPI); |
|
639 |
sigdelset(&set, SIGBUS); |
|
640 |
r = kvm_set_signal_mask(env, &set); |
|
641 |
if (r) { |
|
642 |
fprintf(stderr, "kvm_set_signal_mask: %s\n", strerror(-r)); |
|
643 |
exit(1); |
|
644 |
} |
|
645 |
} |
|
646 |
|
|
647 |
static void qemu_tcg_init_cpu_signals(void) |
|
648 |
{ |
|
649 |
sigset_t set; |
|
650 |
struct sigaction sigact; |
|
651 |
|
|
652 |
memset(&sigact, 0, sizeof(sigact)); |
|
653 |
sigact.sa_handler = cpu_signal; |
|
654 |
sigaction(SIG_IPI, &sigact, NULL); |
|
655 |
|
|
656 |
sigemptyset(&set); |
|
657 |
sigaddset(&set, SIG_IPI); |
|
658 |
pthread_sigmask(SIG_UNBLOCK, &set, NULL); |
|
659 |
} |
|
660 |
|
|
661 | 664 |
int qemu_init_main_loop(void) |
662 | 665 |
{ |
663 | 666 |
int ret; |
Also available in: Unified diff