Message ID | 20210502231844.1977630-7-richard.henderson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | tcg: Clean up code_gen_buffer allocation | expand |
Richard Henderson <richard.henderson@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.henderson@linaro.org> Reviewed-by: Alex Bennée <alex.bennee@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
From: Richard Henderson <richard.henderson@linaro.org> > 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.henderson@linaro.org> > --- > tcg/tcg.c | 37 ++++++++++++++++++++++--------------- > 1 file changed, 22 insertions(+), 15 deletions(-) Reviewed-by: Luis Pires <luis.pires@eldorado.org.br> -- Luis Pires Instituto de Pesquisas ELDORADO Aviso Legal - Disclaimer <https://www.eldorado.org.br/disclaimer.html>
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)) {
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.henderson@linaro.org> --- tcg/tcg.c | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) -- 2.25.1