Revision 1ab3c6c0 cpus.c

b/cpus.c
245 245
    prctl(PR_MCE_KILL, PR_MCE_KILL_SET, PR_MCE_KILL_EARLY, 0, 0);
246 246
}
247 247

  
248
static void qemu_kvm_eat_signals(CPUState *env)
249
{
250
    struct timespec ts = { 0, 0 };
251
    siginfo_t siginfo;
252
    sigset_t waitset;
253
    sigset_t chkset;
254
    int r;
255

  
256
    sigemptyset(&waitset);
257
    sigaddset(&waitset, SIG_IPI);
258
    sigaddset(&waitset, SIGBUS);
259

  
260
    do {
261
        r = sigtimedwait(&waitset, &siginfo, &ts);
262
        if (r == -1 && !(errno == EAGAIN || errno == EINTR)) {
263
            perror("sigtimedwait");
264
            exit(1);
265
        }
266

  
267
        switch (r) {
268
        case SIGBUS:
269
            if (kvm_on_sigbus_vcpu(env, siginfo.si_code, siginfo.si_addr)) {
270
                sigbus_reraise();
271
            }
272
            break;
273
        default:
274
            break;
275
        }
276

  
277
        r = sigpending(&chkset);
278
        if (r == -1) {
279
            perror("sigpending");
280
            exit(1);
281
        }
282
    } while (sigismember(&chkset, SIG_IPI) || sigismember(&chkset, SIGBUS));
283

  
284
#ifndef CONFIG_IOTHREAD
285
    if (sigismember(&chkset, SIGIO) || sigismember(&chkset, SIGALRM)) {
286
        qemu_notify_event();
287
    }
288
#endif
289
}
290

  
248 291
#else /* !CONFIG_LINUX */
249 292

  
250 293
static void qemu_init_sigbus(void)
251 294
{
252 295
}
296

  
297
static void qemu_kvm_eat_signals(CPUState *env)
298
{
299
}
253 300
#endif /* !CONFIG_LINUX */
254 301

  
255 302
#ifndef _WIN32
......
455 502
#endif
456 503
}
457 504

  
458
static void qemu_kvm_eat_signals(CPUState *env)
459
{
460
    struct timespec ts = { 0, 0 };
461
    siginfo_t siginfo;
462
    sigset_t waitset;
463
    sigset_t chkset;
464
    int r;
465

  
466
    sigemptyset(&waitset);
467
    sigaddset(&waitset, SIG_IPI);
468
    sigaddset(&waitset, SIGBUS);
469

  
470
    do {
471
        r = sigtimedwait(&waitset, &siginfo, &ts);
472
        if (r == -1 && !(errno == EAGAIN || errno == EINTR)) {
473
            perror("sigtimedwait");
474
            exit(1);
475
        }
476

  
477
        switch (r) {
478
        case SIGBUS:
479
            if (kvm_on_sigbus_vcpu(env, siginfo.si_code, siginfo.si_addr)) {
480
                sigbus_reraise();
481
            }
482
            break;
483
        default:
484
            break;
485
        }
486

  
487
        r = sigpending(&chkset);
488
        if (r == -1) {
489
            perror("sigpending");
490
            exit(1);
491
        }
492
    } while (sigismember(&chkset, SIG_IPI) || sigismember(&chkset, SIGBUS));
493

  
494
#ifndef CONFIG_IOTHREAD
495
    if (sigismember(&chkset, SIGIO) || sigismember(&chkset, SIGALRM)) {
496
        qemu_notify_event();
497
    }
498
#endif
499
}
500

  
501 505
#else /* _WIN32 */
502 506

  
503 507
HANDLE qemu_event_handle;
......
526 530
    }
527 531
}
528 532

  
529
static void qemu_kvm_eat_signals(CPUState *env)
530
{
531
}
532

  
533 533
static int qemu_signal_init(void)
534 534
{
535 535
    return 0;

Also available in: Unified diff