271 |
271 |
static QEMUBootSetHandler *boot_set_handler;
|
272 |
272 |
static void *boot_set_opaque;
|
273 |
273 |
|
|
274 |
#ifdef SIGRTMIN
|
|
275 |
#define SIG_IPI (SIGRTMIN+4)
|
|
276 |
#else
|
|
277 |
#define SIG_IPI SIGUSR1
|
|
278 |
#endif
|
|
279 |
|
274 |
280 |
static int default_serial = 1;
|
275 |
281 |
static int default_parallel = 1;
|
276 |
282 |
static int default_virtcon = 1;
|
... | ... | |
3380 |
3386 |
static QemuCond qemu_system_cond;
|
3381 |
3387 |
static QemuCond qemu_pause_cond;
|
3382 |
3388 |
|
3383 |
|
static void block_io_signals(void);
|
|
3389 |
static void tcg_block_io_signals(void);
|
|
3390 |
static void kvm_block_io_signals(CPUState *env);
|
3384 |
3391 |
static void unblock_io_signals(void);
|
3385 |
3392 |
static int tcg_has_work(void);
|
3386 |
3393 |
static int cpu_has_work(CPUState *env);
|
... | ... | |
3432 |
3439 |
qemu_wait_io_event_common(env);
|
3433 |
3440 |
}
|
3434 |
3441 |
|
|
3442 |
static void qemu_kvm_eat_signal(CPUState *env, int timeout)
|
|
3443 |
{
|
|
3444 |
struct timespec ts;
|
|
3445 |
int r, e;
|
|
3446 |
siginfo_t siginfo;
|
|
3447 |
sigset_t waitset;
|
|
3448 |
|
|
3449 |
ts.tv_sec = timeout / 1000;
|
|
3450 |
ts.tv_nsec = (timeout % 1000) * 1000000;
|
|
3451 |
|
|
3452 |
sigemptyset(&waitset);
|
|
3453 |
sigaddset(&waitset, SIG_IPI);
|
|
3454 |
|
|
3455 |
qemu_mutex_unlock(&qemu_global_mutex);
|
|
3456 |
r = sigtimedwait(&waitset, &siginfo, &ts);
|
|
3457 |
e = errno;
|
|
3458 |
qemu_mutex_lock(&qemu_global_mutex);
|
|
3459 |
|
|
3460 |
if (r == -1 && !(e == EAGAIN || e == EINTR)) {
|
|
3461 |
fprintf(stderr, "sigtimedwait: %s\n", strerror(e));
|
|
3462 |
exit(1);
|
|
3463 |
}
|
|
3464 |
}
|
|
3465 |
|
3435 |
3466 |
static void qemu_kvm_wait_io_event(CPUState *env)
|
3436 |
3467 |
{
|
3437 |
3468 |
while (!cpu_has_work(env))
|
3438 |
3469 |
qemu_cond_timedwait(env->halt_cond, &qemu_global_mutex, 1000);
|
3439 |
3470 |
|
|
3471 |
qemu_kvm_eat_signal(env, 0);
|
3440 |
3472 |
qemu_wait_io_event_common(env);
|
3441 |
3473 |
}
|
3442 |
3474 |
|
... | ... | |
3446 |
3478 |
{
|
3447 |
3479 |
CPUState *env = arg;
|
3448 |
3480 |
|
3449 |
|
block_io_signals();
|
3450 |
3481 |
qemu_thread_self(env->thread);
|
3451 |
3482 |
if (kvm_enabled())
|
3452 |
3483 |
kvm_init_vcpu(env);
|
3453 |
3484 |
|
|
3485 |
kvm_block_io_signals(env);
|
|
3486 |
|
3454 |
3487 |
/* signal CPU creation */
|
3455 |
3488 |
qemu_mutex_lock(&qemu_global_mutex);
|
3456 |
3489 |
env->created = 1;
|
... | ... | |
3475 |
3508 |
{
|
3476 |
3509 |
CPUState *env = arg;
|
3477 |
3510 |
|
3478 |
|
block_io_signals();
|
|
3511 |
tcg_block_io_signals();
|
3479 |
3512 |
qemu_thread_self(env->thread);
|
3480 |
3513 |
|
3481 |
3514 |
/* signal CPU creation */
|
... | ... | |
3501 |
3534 |
CPUState *env = _env;
|
3502 |
3535 |
qemu_cond_broadcast(env->halt_cond);
|
3503 |
3536 |
if (kvm_enabled())
|
3504 |
|
qemu_thread_signal(env->thread, SIGUSR1);
|
|
3537 |
qemu_thread_signal(env->thread, SIG_IPI);
|
3505 |
3538 |
}
|
3506 |
3539 |
|
3507 |
3540 |
int qemu_cpu_self(void *_env)
|
... | ... | |
3520 |
3553 |
cpu_exit(cpu_single_env);
|
3521 |
3554 |
}
|
3522 |
3555 |
|
3523 |
|
static void block_io_signals(void)
|
|
3556 |
static void tcg_block_io_signals(void)
|
3524 |
3557 |
{
|
3525 |
3558 |
sigset_t set;
|
3526 |
3559 |
struct sigaction sigact;
|
... | ... | |
3533 |
3566 |
pthread_sigmask(SIG_BLOCK, &set, NULL);
|
3534 |
3567 |
|
3535 |
3568 |
sigemptyset(&set);
|
3536 |
|
sigaddset(&set, SIGUSR1);
|
|
3569 |
sigaddset(&set, SIG_IPI);
|
3537 |
3570 |
pthread_sigmask(SIG_UNBLOCK, &set, NULL);
|
3538 |
3571 |
|
3539 |
3572 |
memset(&sigact, 0, sizeof(sigact));
|
3540 |
3573 |
sigact.sa_handler = cpu_signal;
|
3541 |
|
sigaction(SIGUSR1, &sigact, NULL);
|
|
3574 |
sigaction(SIG_IPI, &sigact, NULL);
|
|
3575 |
}
|
|
3576 |
|
|
3577 |
static void dummy_signal(int sig)
|
|
3578 |
{
|
|
3579 |
}
|
|
3580 |
|
|
3581 |
static void kvm_block_io_signals(CPUState *env)
|
|
3582 |
{
|
|
3583 |
int r;
|
|
3584 |
sigset_t set;
|
|
3585 |
struct sigaction sigact;
|
|
3586 |
|
|
3587 |
sigemptyset(&set);
|
|
3588 |
sigaddset(&set, SIGUSR2);
|
|
3589 |
sigaddset(&set, SIGIO);
|
|
3590 |
sigaddset(&set, SIGALRM);
|
|
3591 |
sigaddset(&set, SIGCHLD);
|
|
3592 |
sigaddset(&set, SIG_IPI);
|
|
3593 |
pthread_sigmask(SIG_BLOCK, &set, NULL);
|
|
3594 |
|
|
3595 |
pthread_sigmask(SIG_BLOCK, NULL, &set);
|
|
3596 |
sigdelset(&set, SIG_IPI);
|
|
3597 |
|
|
3598 |
memset(&sigact, 0, sizeof(sigact));
|
|
3599 |
sigact.sa_handler = dummy_signal;
|
|
3600 |
sigaction(SIG_IPI, &sigact, NULL);
|
|
3601 |
|
|
3602 |
r = kvm_set_signal_mask(env, &set);
|
|
3603 |
if (r) {
|
|
3604 |
fprintf(stderr, "kvm_set_signal_mask: %s\n", strerror(r));
|
|
3605 |
exit(1);
|
|
3606 |
}
|
3542 |
3607 |
}
|
3543 |
3608 |
|
3544 |
3609 |
static void unblock_io_signals(void)
|
... | ... | |
3552 |
3617 |
pthread_sigmask(SIG_UNBLOCK, &set, NULL);
|
3553 |
3618 |
|
3554 |
3619 |
sigemptyset(&set);
|
3555 |
|
sigaddset(&set, SIGUSR1);
|
|
3620 |
sigaddset(&set, SIG_IPI);
|
3556 |
3621 |
pthread_sigmask(SIG_BLOCK, &set, NULL);
|
3557 |
3622 |
}
|
3558 |
3623 |
|
... | ... | |
3561 |
3626 |
qemu_mutex_lock(&qemu_fair_mutex);
|
3562 |
3627 |
|
3563 |
3628 |
while (qemu_mutex_trylock(&qemu_global_mutex)) {
|
3564 |
|
qemu_thread_signal(tcg_cpu_thread, SIGUSR1);
|
|
3629 |
qemu_thread_signal(tcg_cpu_thread, SIG_IPI);
|
3565 |
3630 |
if (!qemu_mutex_timedlock(&qemu_global_mutex, msecs))
|
3566 |
3631 |
break;
|
3567 |
3632 |
}
|
... | ... | |
3602 |
3667 |
|
3603 |
3668 |
while (penv) {
|
3604 |
3669 |
penv->stop = 1;
|
3605 |
|
qemu_thread_signal(penv->thread, SIGUSR1);
|
|
3670 |
qemu_thread_signal(penv->thread, SIG_IPI);
|
3606 |
3671 |
qemu_cpu_kick(penv);
|
3607 |
3672 |
penv = (CPUState *)penv->next_cpu;
|
3608 |
3673 |
}
|
... | ... | |
3611 |
3676 |
qemu_cond_timedwait(&qemu_pause_cond, &qemu_global_mutex, 100);
|
3612 |
3677 |
penv = first_cpu;
|
3613 |
3678 |
while (penv) {
|
3614 |
|
qemu_thread_signal(penv->thread, SIGUSR1);
|
|
3679 |
qemu_thread_signal(penv->thread, SIG_IPI);
|
3615 |
3680 |
penv = (CPUState *)penv->next_cpu;
|
3616 |
3681 |
}
|
3617 |
3682 |
}
|
... | ... | |
3624 |
3689 |
while (penv) {
|
3625 |
3690 |
penv->stop = 0;
|
3626 |
3691 |
penv->stopped = 0;
|
3627 |
|
qemu_thread_signal(penv->thread, SIGUSR1);
|
|
3692 |
qemu_thread_signal(penv->thread, SIG_IPI);
|
3628 |
3693 |
qemu_cpu_kick(penv);
|
3629 |
3694 |
penv = (CPUState *)penv->next_cpu;
|
3630 |
3695 |
}
|