> From: Paolo Bonzini [mailto:pbonz...@redhat.com]
> On 02/11/2017 12:24, Pavel Dovgalyuk wrote:
> >> I am not sure about this.  I think if instead you should return false
> >> from here and EXCP_INTERRUPT from cpu_exec.
> > The problem is inside the TB. It checks cpu->icount_decr.u16.high which is 
> > -1.
> > And we have to enter the TB to cause an exception (because it exists in 
> > replay log).
> > That is why we reset this flag and try to execute the TB.
> 
> But if u16.high is -1, shouldn't you return EXCP_INTERRUPT first (via
> "Finally, check if we need to exit to the main loop" in
> cpu_handle_interrupt)?  Then only cause the exception when that one is
> processed.

The case is the following.
1. There are no pending instructions to execute, cpu_loop_exec_tb finished.
2. There are no interrupts and cpu_handle_interrupt sets cpu->exception_index = 
EXCP_INTERRUPT
3. There are no pending exceptions and cpu_handle_exception goes to the last 
branch,
   because there is an exception flag in the log.
4. cpu_exec_nocache translates the block and tries to execute it, causing an 
exception

> 
> Paolo
> 
> >> More important: there is still a race, because high can be set to -1
> >> right after your atomic_set.
> > I'm not sure about it. But even the race exists, exec_nocache attempt will 
> > be repeated
> > after failed try.
> >
> > Returning true is ok here, because we know that exception will happen 
> > (because it is
> > recorded in the log).


Pavel Dovgalyuk


Reply via email to