Jun Koi writes: > 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. I'm not sure if "rep"-style x86 instructions loop inside the same TB, though. Cheers, Lluis -- "And it's much the same thing with knowledge, for whenever you learn something new, the whole world becomes that much richer." -- The Princess of Pure Reason, as told by Norton Juster in The Phantom Tollbooth