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