|
From: | Richard Henderson |
Subject: | Re: [Qemu-devel] [PATCH v3 4/6] target/arm/translate: ensure gen_goto_tb sets exit flags |
Date: | Tue, 11 Jul 2017 11:08:01 -1000 |
User-agent: | Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.1 |
On 07/11/2017 09:20 AM, Alex Bennée wrote:
Richard Henderson <address@hidden> writes:On 07/11/2017 07:59 AM, Alex Bennée wrote:if (use_goto_tb(s, dest)) { tcg_gen_goto_tb(n); gen_set_pc_im(s, dest); tcg_gen_exit_tb((uintptr_t)s->tb + n); + s->is_jmp = DISAS_TB_JUMP; } else { gen_set_pc_im(s, dest); gen_goto_ptr(); + s->is_jmp = DISAS_JUMP; }I think DISAS_TB_JUMP is appropriate for both cases. When not using goto_tb, the jump is still static and we still chain to the next TB via goto_ptr.OK - I guess we need to nail down what the essential difference is between the two. I understood DISAS_TB_JUMP as a static known PC which can be patched in the generated code because we know the two addresses are in the same page - whereas DISAS_JUMP is a "computed" jump although in this case the PC is already known. Does making a distinction between computed and non-computer inter-page jumps make any sense anyway?
*shrug* probably not.Honestly, the only thing that's really interesting here is that is_jmp indicate that we have already exited the TB and that all following code is dead.
As a response to one of Lluis' threads, I suggested that the generic term for this be DISAS_NORETURN. Which also covers exiting the TB via calling a helper that does not return, e.g. throwing an illegal opcode exception, aka DISAS_EXC in the current target/arm sources.
r~
[Prev in Thread] | Current Thread | [Next in Thread] |