On Sat, Jul 4, 2015 at 1:12 AM, Peter Maydell <peter.mayd...@linaro.org>
wrote:

> On 3 July 2015 at 18:10, Jun Koi <junkoi2...@gmail.com> wrote:
> > On Sat, Jul 4, 2015 at 1:06 AM, Peter Maydell <peter.mayd...@linaro.org>
> > wrote:
> >> On 3 July 2015 at 18:02, Jun Koi <junkoi2...@gmail.com> wrote:
> >> > If this is true, then what if this TB is running infinitely, and do
> not
> >> > return, or it is in a very long loop? In this case, TCG thread cannot
> be
> >> > interrupted?
> >>
> >> Every TB starts with a little bit of generated code that checks
> >> the 'tcg_exit_req' flag in the CPUState for the CPU (see the
> >> gen_tb_start() function). If some other part of QEMU wants the
> >> CPU to stop running guest code and return to the top level loop,
> >> it calls cpu_exit() which sets this flag.
> >
> >
> > But this does not answer my question yet: if we the flag is only
> > enable when TB already enters the "long loop", then nothing can break
> > this TB execution?
>
> We check the flag for every TB we execute. Therefore in any
> loop we must check the flag each time round the loop. So
> if another thread sets the flag, we will exit.
>
> (A TB is always ended by any kind of branch instruction,
> so you can't have a loop within a single TB. A tight loop
> turns into a TB that ends with "branch back to the start
> of this TB", but that will re-execute the flag-check code.)
>

Oh right, this tight loop is my main concern. It makes sense now.

Thanks!!

Reply via email to