On Wed, 17 Jan 2018 18:40:36 +0100 David Hildenbrand <da...@redhat.com> wrote:
> This is a prparation for floating interrupt support and only applies to s/prparation/preparation/ (can fix while applying) > MTTCG, single threaded TCG works just fine. If a floating interrupt wakes > up a VCPU and the CPU thinks it can run (clearing cs->halted), at > the point where the interrupt would be delivered, already another VCPU > might have picked up the interrupt, resulting in a wakeup without an > interrupt (executing wrong code). > > It is wrong to let the VCPU continue to execute (the WAIT PSW). Instead, > we have to put the VCPU back to sleep. > > Signed-off-by: David Hildenbrand <da...@redhat.com> > --- > target/s390x/excp_helper.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/target/s390x/excp_helper.c b/target/s390x/excp_helper.c > index a18842ccbd..eeffb49f63 100644 > --- a/target/s390x/excp_helper.c > +++ b/target/s390x/excp_helper.c > @@ -503,6 +503,11 @@ bool s390_cpu_exec_interrupt(CPUState *cs, int > interrupt_request) > s390_cpu_do_interrupt(cs); > return true; > } > + if (env->psw.mask & PSW_MASK_WAIT) { > + /* Woken up because of a floating interrupt but it has already > + * been delivered. Go back to sleep. */ > + cpu_interrupt(CPU(cpu), CPU_INTERRUPT_HALT); > + } > } > return false; > }