tcg: Move tcg prologue pointer out of TCGContext

This value is constant across all thread-local copies of TCGContext,
so we might as well move it out of thread-local storage.

Use the correct function pointer type, and name the variable
tcg_qemu_tb_exec, which means that we are able to remove the
macro that does the casting.

Replace HAVE_TCG_QEMU_TB_EXEC with CONFIG_TCG_INTERPRETER,
as this is somewhat clearer in intent.

Reviewed-by: Joelle van Dyne <j@getutm.app>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Richard Henderson 2020-10-28 14:11:54 -07:00
parent 664a79735e
commit b91ccb3115
3 changed files with 14 additions and 8 deletions

View File

@ -621,7 +621,6 @@ struct TCGContext {
here, because there's too much arithmetic throughout that relies here, because there's too much arithmetic throughout that relies
on addition and subtraction working on bytes. Rely on the GCC on addition and subtraction working on bytes. Rely on the GCC
extension that allows arithmetic on void*. */ extension that allows arithmetic on void*. */
void *code_gen_prologue;
void *code_gen_epilogue; void *code_gen_epilogue;
void *code_gen_buffer; void *code_gen_buffer;
size_t code_gen_buffer_size; size_t code_gen_buffer_size;
@ -1222,11 +1221,11 @@ static inline unsigned get_mmuidx(TCGMemOpIdx oi)
#define TB_EXIT_IDXMAX 1 #define TB_EXIT_IDXMAX 1
#define TB_EXIT_REQUESTED 3 #define TB_EXIT_REQUESTED 3
#ifdef HAVE_TCG_QEMU_TB_EXEC #ifdef CONFIG_TCG_INTERPRETER
uintptr_t tcg_qemu_tb_exec(CPUArchState *env, uint8_t *tb_ptr); uintptr_t tcg_qemu_tb_exec(CPUArchState *env, void *tb_ptr);
#else #else
# define tcg_qemu_tb_exec(env, tb_ptr) \ typedef uintptr_t tcg_prologue_fn(CPUArchState *env, void *tb_ptr);
((uintptr_t (*)(void *, void *))tcg_ctx->code_gen_prologue)(env, tb_ptr) extern tcg_prologue_fn *tcg_qemu_tb_exec;
#endif #endif
void tcg_register_jit(void *buf, size_t buf_size); void tcg_register_jit(void *buf, size_t buf_size);

View File

@ -162,6 +162,10 @@ static TCGContext **tcg_ctxs;
static unsigned int n_tcg_ctxs; static unsigned int n_tcg_ctxs;
TCGv_env cpu_env = 0; TCGv_env cpu_env = 0;
#ifndef CONFIG_TCG_INTERPRETER
tcg_prologue_fn *tcg_qemu_tb_exec;
#endif
struct tcg_region_tree { struct tcg_region_tree {
QemuMutex lock; QemuMutex lock;
GTree *tree; GTree *tree;
@ -1055,7 +1059,10 @@ void tcg_prologue_init(TCGContext *s)
s->code_ptr = buf0; s->code_ptr = buf0;
s->code_buf = buf0; s->code_buf = buf0;
s->data_gen_ptr = NULL; s->data_gen_ptr = NULL;
s->code_gen_prologue = buf0;
#ifndef CONFIG_TCG_INTERPRETER
tcg_qemu_tb_exec = (tcg_prologue_fn *)buf0;
#endif
/* Compute a high-water mark, at which we voluntarily flush the buffer /* Compute a high-water mark, at which we voluntarily flush the buffer
and start over. The size here is arbitrary, significantly larger and start over. The size here is arbitrary, significantly larger

View File

@ -481,9 +481,9 @@ static bool tci_compare64(uint64_t u0, uint64_t u1, TCGCond condition)
* One possible operation in the pseudo code is a call to binary code. * One possible operation in the pseudo code is a call to binary code.
* Therefore, disable CFI checks in the interpreter function * Therefore, disable CFI checks in the interpreter function
*/ */
QEMU_DISABLE_CFI uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env, void *v_tb_ptr)
uintptr_t tcg_qemu_tb_exec(CPUArchState *env, uint8_t *tb_ptr)
{ {
uint8_t *tb_ptr = v_tb_ptr;
tcg_target_ulong regs[TCG_TARGET_NB_REGS]; tcg_target_ulong regs[TCG_TARGET_NB_REGS];
long tcg_temps[CPU_TEMP_BUF_NLONGS]; long tcg_temps[CPU_TEMP_BUF_NLONGS];
uintptr_t sp_value = (uintptr_t)(tcg_temps + CPU_TEMP_BUF_NLONGS); uintptr_t sp_value = (uintptr_t)(tcg_temps + CPU_TEMP_BUF_NLONGS);