Richard Henderson <richard.hender...@linaro.org> writes:
> This has only one user, but will make more sense after some > code motion. > > Always leave the tcg_init_ctx initialized to the first region, > in preparation for tcg_prologue_init(). This also requires > that we don't re-allocate the region for the first cpu, lest > we hit the assertion for total number of regions allocated . > > Signed-off-by: Richard Henderson <richard.hender...@linaro.org> Reviewed-by: Alex Bennée <alex.ben...@linaro.org> > --- > tcg/tcg.c | 37 ++++++++++++++++++++++--------------- > 1 file changed, 22 insertions(+), 15 deletions(-) > > diff --git a/tcg/tcg.c b/tcg/tcg.c > index df78c89673..ee3319e163 100644 > --- a/tcg/tcg.c > +++ b/tcg/tcg.c > @@ -885,10 +885,26 @@ void tcg_region_init(void) > > tcg_region_trees_init(); > > - /* In user-mode we support only one ctx, so do the initial allocation > now */ > -#ifdef CONFIG_USER_ONLY > - tcg_region_initial_alloc__locked(tcg_ctx); > -#endif > + /* > + * Leave the initial context initialized to the first region. > + * This will be the context into which we generate the prologue. > + * It is also the only context for CONFIG_USER_ONLY. > + */ > + tcg_region_initial_alloc__locked(&tcg_init_ctx); > +} > + > +static void tcg_region_prologue_set(TCGContext *s) > +{ > + /* Deduct the prologue from the first region. */ > + g_assert(region.start == s->code_gen_buffer); > + region.start = s->code_ptr; > + > + /* Recompute boundaries of the first region. */ > + tcg_region_assign(s, 0); > + > + /* Register the balance of the buffer with gdb. */ > + tcg_register_jit(tcg_splitwx_to_rx(region.start), > + region.end - region.start); > } > > #ifdef CONFIG_DEBUG_TCG > @@ -968,10 +984,10 @@ void tcg_register_thread(void) > > if (n > 0) { > alloc_tcg_plugin_context(s); > + tcg_region_initial_alloc(s); > } > > tcg_ctx = s; > - tcg_region_initial_alloc(s); > } > #endif /* !CONFIG_USER_ONLY */ > > @@ -1211,8 +1227,6 @@ void tcg_prologue_init(TCGContext *s) > { > size_t prologue_size; > > - /* Put the prologue at the beginning of code_gen_buffer. */ > - tcg_region_assign(s, 0); > s->code_ptr = s->code_gen_ptr; > s->code_buf = s->code_gen_ptr; > s->data_gen_ptr = NULL; > @@ -1244,14 +1258,7 @@ void tcg_prologue_init(TCGContext *s) > (uintptr_t)s->code_buf, prologue_size); > #endif > > - /* Deduct the prologue from the first region. */ > - region.start = s->code_ptr; > - > - /* Recompute boundaries of the first region. */ > - tcg_region_assign(s, 0); > - > - tcg_register_jit(tcg_splitwx_to_rx(region.start), > - region.end - region.start); > + tcg_region_prologue_set(s); > > #ifdef DEBUG_DISAS > if (qemu_loglevel_mask(CPU_LOG_TB_OUT_ASM)) { -- Alex Bennée