Revision 55541c8a cpus.c
b/cpus.c | ||
---|---|---|
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)); |
Also available in: Unified diff