318 |
318 |
static QemuCond qemu_pause_cond;
|
319 |
319 |
static QemuCond qemu_work_cond;
|
320 |
320 |
|
321 |
|
static void tcg_block_io_signals(void);
|
322 |
|
static void kvm_block_io_signals(CPUState *env);
|
|
321 |
static void tcg_init_ipi(void);
|
|
322 |
static void kvm_init_ipi(CPUState *env);
|
323 |
323 |
static void unblock_io_signals(void);
|
324 |
324 |
|
325 |
325 |
int qemu_init_main_loop(void)
|
... | ... | |
464 |
464 |
if (kvm_enabled())
|
465 |
465 |
kvm_init_vcpu(env);
|
466 |
466 |
|
467 |
|
kvm_block_io_signals(env);
|
|
467 |
kvm_init_ipi(env);
|
468 |
468 |
|
469 |
469 |
/* signal CPU creation */
|
470 |
470 |
env->created = 1;
|
... | ... | |
487 |
487 |
{
|
488 |
488 |
CPUState *env = arg;
|
489 |
489 |
|
490 |
|
tcg_block_io_signals();
|
|
490 |
tcg_init_ipi();
|
491 |
491 |
qemu_thread_self(env->thread);
|
492 |
492 |
|
493 |
493 |
/* signal CPU creation */
|
... | ... | |
532 |
532 |
exit_request = 1;
|
533 |
533 |
}
|
534 |
534 |
|
535 |
|
static void tcg_block_io_signals(void)
|
|
535 |
static void tcg_init_ipi(void)
|
536 |
536 |
{
|
537 |
537 |
sigset_t set;
|
538 |
538 |
struct sigaction sigact;
|
539 |
539 |
|
540 |
|
sigemptyset(&set);
|
541 |
|
sigaddset(&set, SIGUSR2);
|
542 |
|
sigaddset(&set, SIGIO);
|
543 |
|
sigaddset(&set, SIGALRM);
|
544 |
|
sigaddset(&set, SIGCHLD);
|
545 |
|
pthread_sigmask(SIG_BLOCK, &set, NULL);
|
|
540 |
memset(&sigact, 0, sizeof(sigact));
|
|
541 |
sigact.sa_handler = cpu_signal;
|
|
542 |
sigaction(SIG_IPI, &sigact, NULL);
|
546 |
543 |
|
547 |
544 |
sigemptyset(&set);
|
548 |
545 |
sigaddset(&set, SIG_IPI);
|
549 |
546 |
pthread_sigmask(SIG_UNBLOCK, &set, NULL);
|
550 |
|
|
551 |
|
memset(&sigact, 0, sizeof(sigact));
|
552 |
|
sigact.sa_handler = cpu_signal;
|
553 |
|
sigaction(SIG_IPI, &sigact, NULL);
|
554 |
547 |
}
|
555 |
548 |
|
556 |
549 |
static void dummy_signal(int sig)
|
557 |
550 |
{
|
558 |
551 |
}
|
559 |
552 |
|
560 |
|
static void kvm_block_io_signals(CPUState *env)
|
|
553 |
static void kvm_init_ipi(CPUState *env)
|
561 |
554 |
{
|
562 |
555 |
int r;
|
563 |
556 |
sigset_t set;
|
564 |
557 |
struct sigaction sigact;
|
565 |
558 |
|
566 |
|
sigemptyset(&set);
|
567 |
|
sigaddset(&set, SIGUSR2);
|
568 |
|
sigaddset(&set, SIGIO);
|
569 |
|
sigaddset(&set, SIGALRM);
|
570 |
|
sigaddset(&set, SIGCHLD);
|
571 |
|
sigaddset(&set, SIG_IPI);
|
572 |
|
pthread_sigmask(SIG_BLOCK, &set, NULL);
|
573 |
|
|
574 |
|
pthread_sigmask(SIG_BLOCK, NULL, &set);
|
575 |
|
sigdelset(&set, SIG_IPI);
|
576 |
|
|
577 |
559 |
memset(&sigact, 0, sizeof(sigact));
|
578 |
560 |
sigact.sa_handler = dummy_signal;
|
579 |
561 |
sigaction(SIG_IPI, &sigact, NULL);
|
580 |
562 |
|
|
563 |
pthread_sigmask(SIG_BLOCK, NULL, &set);
|
|
564 |
sigdelset(&set, SIG_IPI);
|
581 |
565 |
r = kvm_set_signal_mask(env, &set);
|
582 |
566 |
if (r) {
|
583 |
567 |
fprintf(stderr, "kvm_set_signal_mask: %s\n", strerror(r));
|