On Fri, 10 Sept 2021 at 07:46, Richard Henderson <richard.hender...@linaro.org> wrote: > > On 9/9/21 3:46 PM, Peter Maydell wrote: > > On Fri, 3 Sept 2021 at 14:58, Richard Henderson > > <richard.hender...@linaro.org> wrote: > >> I think you need to go ahead and end the TB and resync immediately. > >> Just set dc->base.is_jmp = DISAS_UPDATE_NOCHAIN instead. > > > > Is there a rule for when we should set is_jmp to DISAS_UPDATE_NOCHAIN, > > when we should set it to DISAS_UPDATE_EXIT, and when we should call > > gen_lookup_tb() ? We seem to use all three methods at various points > > for "I changed some CPU state and want to end the TB"... > > UPDATE_EXIT is for when you need to return to the main loop; UPDATE_NOCHAIN > merely avoids > goto_tb. Direct use of gen_goto_ptr should be reserved for branches (which I > think is > already the case).
And what about gen_lookup_tb() ? As far as I can tell the semantics of this are the same as setting is_jmp to DISAS_UPDATE_EXIT: the "set PC to s->base.pc_next" happens immediately rather than being done later in arm_tr_tb_stop(), but I don't think that should make a difference. Or is there a case where it matters? If gen_lookup_tb() and DISAS_UPDATE_EXIT are the same, maybe we should get rid of gen_lookup_tb() entirely ? -- PMM