mirror of https://github.com/xemu-project/xemu.git
i386: partial revert of interrupt poll fix
Processing CPU_INTERRUPT_POLL requests in cpu_has_work functions break the determinism of cpu_exec. This patch is required to make interrupts processing deterministic. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Pavel Dovgalyuk <pavel.dovgaluk@ispras.ru> Message-Id: <20150917162331.8676.15286.stgit@PASHA-ISP.def.inno> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
4ecd4d16a0
commit
6220e900bc
|
@ -27,6 +27,9 @@
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
#include "qemu/rcu.h"
|
#include "qemu/rcu.h"
|
||||||
#include "exec/tb-hash.h"
|
#include "exec/tb-hash.h"
|
||||||
|
#if defined(TARGET_I386) && !defined(CONFIG_USER_ONLY)
|
||||||
|
#include "hw/i386/apic.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
/* -icount align implementation. */
|
/* -icount align implementation. */
|
||||||
|
|
||||||
|
@ -343,6 +346,12 @@ int cpu_exec(CPUState *cpu)
|
||||||
SyncClocks sc;
|
SyncClocks sc;
|
||||||
|
|
||||||
if (cpu->halted) {
|
if (cpu->halted) {
|
||||||
|
#if defined(TARGET_I386) && !defined(CONFIG_USER_ONLY)
|
||||||
|
if (cpu->interrupt_request & CPU_INTERRUPT_POLL) {
|
||||||
|
apic_poll_irq(x86_cpu->apic_state);
|
||||||
|
cpu_reset_interrupt(cpu, CPU_INTERRUPT_POLL);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if (!cpu_has_work(cpu)) {
|
if (!cpu_has_work(cpu)) {
|
||||||
return EXCP_HALTED;
|
return EXCP_HALTED;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3098,14 +3098,8 @@ static bool x86_cpu_has_work(CPUState *cs)
|
||||||
X86CPU *cpu = X86_CPU(cs);
|
X86CPU *cpu = X86_CPU(cs);
|
||||||
CPUX86State *env = &cpu->env;
|
CPUX86State *env = &cpu->env;
|
||||||
|
|
||||||
#if !defined(CONFIG_USER_ONLY)
|
return ((cs->interrupt_request & (CPU_INTERRUPT_HARD |
|
||||||
if (cs->interrupt_request & CPU_INTERRUPT_POLL) {
|
CPU_INTERRUPT_POLL)) &&
|
||||||
apic_poll_irq(cpu->apic_state);
|
|
||||||
cpu_reset_interrupt(cs, CPU_INTERRUPT_POLL);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return ((cs->interrupt_request & CPU_INTERRUPT_HARD) &&
|
|
||||||
(env->eflags & IF_MASK)) ||
|
(env->eflags & IF_MASK)) ||
|
||||||
(cs->interrupt_request & (CPU_INTERRUPT_NMI |
|
(cs->interrupt_request & (CPU_INTERRUPT_NMI |
|
||||||
CPU_INTERRUPT_INIT |
|
CPU_INTERRUPT_INIT |
|
||||||
|
|
Loading…
Reference in New Issue