Implement qemu_kvm_eat_signals only for CONFIG_LINUX
qemu_kvm_eat_signals requires POSIX support with realtime extensions for sigtimedwait. Not all our target platforms provide this. Moreover, undefined sigbus_reraise was referenced on non-Linux as well. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> CC: Andreas Färber <andreas.faerber@web.de> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
This commit is contained in:
parent
3c85e74fbf
commit
1ab3c6c073
94
cpus.c
94
cpus.c
@ -245,11 +245,58 @@ static void qemu_init_sigbus(void)
|
||||
prctl(PR_MCE_KILL, PR_MCE_KILL_SET, PR_MCE_KILL_EARLY, 0, 0);
|
||||
}
|
||||
|
||||
static void qemu_kvm_eat_signals(CPUState *env)
|
||||
{
|
||||
struct timespec ts = { 0, 0 };
|
||||
siginfo_t siginfo;
|
||||
sigset_t waitset;
|
||||
sigset_t chkset;
|
||||
int r;
|
||||
|
||||
sigemptyset(&waitset);
|
||||
sigaddset(&waitset, SIG_IPI);
|
||||
sigaddset(&waitset, SIGBUS);
|
||||
|
||||
do {
|
||||
r = sigtimedwait(&waitset, &siginfo, &ts);
|
||||
if (r == -1 && !(errno == EAGAIN || errno == EINTR)) {
|
||||
perror("sigtimedwait");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
switch (r) {
|
||||
case SIGBUS:
|
||||
if (kvm_on_sigbus_vcpu(env, siginfo.si_code, siginfo.si_addr)) {
|
||||
sigbus_reraise();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
r = sigpending(&chkset);
|
||||
if (r == -1) {
|
||||
perror("sigpending");
|
||||
exit(1);
|
||||
}
|
||||
} while (sigismember(&chkset, SIG_IPI) || sigismember(&chkset, SIGBUS));
|
||||
|
||||
#ifndef CONFIG_IOTHREAD
|
||||
if (sigismember(&chkset, SIGIO) || sigismember(&chkset, SIGALRM)) {
|
||||
qemu_notify_event();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#else /* !CONFIG_LINUX */
|
||||
|
||||
static void qemu_init_sigbus(void)
|
||||
{
|
||||
}
|
||||
|
||||
static void qemu_kvm_eat_signals(CPUState *env)
|
||||
{
|
||||
}
|
||||
#endif /* !CONFIG_LINUX */
|
||||
|
||||
#ifndef _WIN32
|
||||
@ -455,49 +502,6 @@ static void qemu_tcg_init_cpu_signals(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
static void qemu_kvm_eat_signals(CPUState *env)
|
||||
{
|
||||
struct timespec ts = { 0, 0 };
|
||||
siginfo_t siginfo;
|
||||
sigset_t waitset;
|
||||
sigset_t chkset;
|
||||
int r;
|
||||
|
||||
sigemptyset(&waitset);
|
||||
sigaddset(&waitset, SIG_IPI);
|
||||
sigaddset(&waitset, SIGBUS);
|
||||
|
||||
do {
|
||||
r = sigtimedwait(&waitset, &siginfo, &ts);
|
||||
if (r == -1 && !(errno == EAGAIN || errno == EINTR)) {
|
||||
perror("sigtimedwait");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
switch (r) {
|
||||
case SIGBUS:
|
||||
if (kvm_on_sigbus_vcpu(env, siginfo.si_code, siginfo.si_addr)) {
|
||||
sigbus_reraise();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
r = sigpending(&chkset);
|
||||
if (r == -1) {
|
||||
perror("sigpending");
|
||||
exit(1);
|
||||
}
|
||||
} while (sigismember(&chkset, SIG_IPI) || sigismember(&chkset, SIGBUS));
|
||||
|
||||
#ifndef CONFIG_IOTHREAD
|
||||
if (sigismember(&chkset, SIGIO) || sigismember(&chkset, SIGALRM)) {
|
||||
qemu_notify_event();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#else /* _WIN32 */
|
||||
|
||||
HANDLE qemu_event_handle;
|
||||
@ -526,10 +530,6 @@ static void qemu_event_increment(void)
|
||||
}
|
||||
}
|
||||
|
||||
static void qemu_kvm_eat_signals(CPUState *env)
|
||||
{
|
||||
}
|
||||
|
||||
static int qemu_signal_init(void)
|
||||
{
|
||||
return 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user