On 12/14/20 3:02 PM, Richard Henderson wrote: > Create a function to determine if a pointer is within the buffer. > > Signed-off-by: Richard Henderson <richard.hender...@linaro.org> > --- > include/tcg/tcg.h | 6 ++++++ > accel/tcg/translate-all.c | 26 ++++++++------------------ > 2 files changed, 14 insertions(+), 18 deletions(-) > > diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h > index bb1e97b13b..e4d0ace44b 100644 > --- a/include/tcg/tcg.h > +++ b/include/tcg/tcg.h > @@ -680,6 +680,12 @@ extern __thread TCGContext *tcg_ctx; > extern void *tcg_code_gen_epilogue; > extern TCGv_env cpu_env; > > +static inline bool in_code_gen_buffer(const void *p) > +{ > + const TCGContext *s = &tcg_init_ctx; > + return (size_t)(p - s->code_gen_buffer) <= s->code_gen_buffer_size;
If 'p == s->code_gen_buffer + s->code_gen_buffer_size', is it really "in" the buffer? > +} > + > static inline size_t temp_idx(TCGTemp *ts) > { > ptrdiff_t n = ts - tcg_ctx->temps; > diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c > index 4572b4901f..744f97a717 100644 > --- a/accel/tcg/translate-all.c > +++ b/accel/tcg/translate-all.c > @@ -392,27 +392,18 @@ void tb_destroy(TranslationBlock *tb) > > bool cpu_restore_state(CPUState *cpu, uintptr_t host_pc, bool will_exit) > { > - TranslationBlock *tb; > - bool r = false; > - uintptr_t check_offset; > - > - /* The host_pc has to be in the region of current code buffer. If > - * it is not we will not be able to resolve it here. The two cases > - * where host_pc will not be correct are: > + /* > + * The host_pc has to be in the region of the code buffer. > + * If it is not we will not be able to resolve it here. > + * The two cases where host_pc will not be correct are: > * > * - fault during translation (instruction fetch) > * - fault from helper (not using GETPC() macro) > * > * Either way we need return early as we can't resolve it here. > - * > - * We are using unsigned arithmetic so if host_pc < > - * tcg_init_ctx.code_gen_buffer check_offset will wrap to way > - * above the code_gen_buffer_size > */ > - check_offset = host_pc - (uintptr_t) tcg_init_ctx.code_gen_buffer; > - > - if (check_offset < tcg_init_ctx.code_gen_buffer_size) { > - tb = tcg_tb_lookup(host_pc); > + if (in_code_gen_buffer((const void *)host_pc)) { > + TranslationBlock *tb = tcg_tb_lookup(host_pc); > if (tb) { > cpu_restore_state_from_tb(cpu, tb, host_pc, will_exit); > if (tb_cflags(tb) & CF_NOCACHE) { > @@ -421,11 +412,10 @@ bool cpu_restore_state(CPUState *cpu, uintptr_t > host_pc, bool will_exit) > tcg_tb_remove(tb); > tb_destroy(tb); > } > - r = true; > + return true; > } > } > - > - return r; > + return false; > } > > static void page_init(void) >