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