mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 01:03:55 -06:00
tcg: define tcg_init_ctx and make tcg_ctx a pointer
Groundwork for supporting multiple TCG contexts. The core of this patch is this change to tcg/tcg.h: > -extern TCGContext tcg_ctx; > +extern TCGContext tcg_init_ctx; > +extern TCGContext *tcg_ctx; Note that for now we set *tcg_ctx to whatever TCGContext is passed to tcg_context_init -- in this case &tcg_init_ctx. Reviewed-by: Richard Henderson <rth@twiddle.net> Signed-off-by: Emilio G. Cota <cota@braap.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
44ded3d048
commit
b1311c4acf
29 changed files with 130 additions and 126 deletions
46
tcg/tcg-op.c
46
tcg/tcg-op.c
|
@ -48,7 +48,7 @@ extern TCGv_i32 TCGV_HIGH_link_error(TCGv_i64);
|
|||
|
||||
static inline TCGOp *tcg_emit_op(TCGOpcode opc)
|
||||
{
|
||||
TCGContext *ctx = &tcg_ctx;
|
||||
TCGContext *ctx = tcg_ctx;
|
||||
int oi = ctx->gen_next_op_idx;
|
||||
int ni = oi + 1;
|
||||
int pi = oi - 1;
|
||||
|
@ -121,7 +121,7 @@ void tcg_gen_op6(TCGOpcode opc, TCGArg a1, TCGArg a2, TCGArg a3,
|
|||
|
||||
void tcg_gen_mb(TCGBar mb_type)
|
||||
{
|
||||
if (tcg_ctx.tb_cflags & CF_PARALLEL) {
|
||||
if (tcg_ctx->tb_cflags & CF_PARALLEL) {
|
||||
tcg_gen_op1(INDEX_op_mb, mb_type);
|
||||
}
|
||||
}
|
||||
|
@ -2552,8 +2552,8 @@ void tcg_gen_goto_tb(unsigned idx)
|
|||
tcg_debug_assert(idx <= 1);
|
||||
#ifdef CONFIG_DEBUG_TCG
|
||||
/* Verify that we havn't seen this numbered exit before. */
|
||||
tcg_debug_assert((tcg_ctx.goto_tb_issue_mask & (1 << idx)) == 0);
|
||||
tcg_ctx.goto_tb_issue_mask |= 1 << idx;
|
||||
tcg_debug_assert((tcg_ctx->goto_tb_issue_mask & (1 << idx)) == 0);
|
||||
tcg_ctx->goto_tb_issue_mask |= 1 << idx;
|
||||
#endif
|
||||
tcg_gen_op1i(INDEX_op_goto_tb, idx);
|
||||
}
|
||||
|
@ -2562,7 +2562,7 @@ void tcg_gen_lookup_and_goto_ptr(void)
|
|||
{
|
||||
if (TCG_TARGET_HAS_goto_ptr && !qemu_loglevel_mask(CPU_LOG_TB_NOCHAIN)) {
|
||||
TCGv_ptr ptr = tcg_temp_new_ptr();
|
||||
gen_helper_lookup_tb_ptr(ptr, tcg_ctx.tcg_env);
|
||||
gen_helper_lookup_tb_ptr(ptr, tcg_ctx->tcg_env);
|
||||
tcg_gen_op1i(INDEX_op_goto_ptr, tcgv_ptr_arg(ptr));
|
||||
tcg_temp_free_ptr(ptr);
|
||||
} else {
|
||||
|
@ -2648,7 +2648,7 @@ void tcg_gen_qemu_ld_i32(TCGv_i32 val, TCGv addr, TCGArg idx, TCGMemOp memop)
|
|||
{
|
||||
tcg_gen_req_mo(TCG_MO_LD_LD | TCG_MO_ST_LD);
|
||||
memop = tcg_canonicalize_memop(memop, 0, 0);
|
||||
trace_guest_mem_before_tcg(tcg_ctx.cpu, tcg_ctx.tcg_env,
|
||||
trace_guest_mem_before_tcg(tcg_ctx->cpu, tcg_ctx->tcg_env,
|
||||
addr, trace_mem_get_info(memop, 0));
|
||||
gen_ldst_i32(INDEX_op_qemu_ld_i32, val, addr, memop, idx);
|
||||
}
|
||||
|
@ -2657,7 +2657,7 @@ void tcg_gen_qemu_st_i32(TCGv_i32 val, TCGv addr, TCGArg idx, TCGMemOp memop)
|
|||
{
|
||||
tcg_gen_req_mo(TCG_MO_LD_ST | TCG_MO_ST_ST);
|
||||
memop = tcg_canonicalize_memop(memop, 0, 1);
|
||||
trace_guest_mem_before_tcg(tcg_ctx.cpu, tcg_ctx.tcg_env,
|
||||
trace_guest_mem_before_tcg(tcg_ctx->cpu, tcg_ctx->tcg_env,
|
||||
addr, trace_mem_get_info(memop, 1));
|
||||
gen_ldst_i32(INDEX_op_qemu_st_i32, val, addr, memop, idx);
|
||||
}
|
||||
|
@ -2676,7 +2676,7 @@ void tcg_gen_qemu_ld_i64(TCGv_i64 val, TCGv addr, TCGArg idx, TCGMemOp memop)
|
|||
}
|
||||
|
||||
memop = tcg_canonicalize_memop(memop, 1, 0);
|
||||
trace_guest_mem_before_tcg(tcg_ctx.cpu, tcg_ctx.tcg_env,
|
||||
trace_guest_mem_before_tcg(tcg_ctx->cpu, tcg_ctx->tcg_env,
|
||||
addr, trace_mem_get_info(memop, 0));
|
||||
gen_ldst_i64(INDEX_op_qemu_ld_i64, val, addr, memop, idx);
|
||||
}
|
||||
|
@ -2690,7 +2690,7 @@ void tcg_gen_qemu_st_i64(TCGv_i64 val, TCGv addr, TCGArg idx, TCGMemOp memop)
|
|||
}
|
||||
|
||||
memop = tcg_canonicalize_memop(memop, 1, 1);
|
||||
trace_guest_mem_before_tcg(tcg_ctx.cpu, tcg_ctx.tcg_env,
|
||||
trace_guest_mem_before_tcg(tcg_ctx->cpu, tcg_ctx->tcg_env,
|
||||
addr, trace_mem_get_info(memop, 1));
|
||||
gen_ldst_i64(INDEX_op_qemu_st_i64, val, addr, memop, idx);
|
||||
}
|
||||
|
@ -2780,7 +2780,7 @@ void tcg_gen_atomic_cmpxchg_i32(TCGv_i32 retv, TCGv addr, TCGv_i32 cmpv,
|
|||
{
|
||||
memop = tcg_canonicalize_memop(memop, 0, 0);
|
||||
|
||||
if (!(tcg_ctx.tb_cflags & CF_PARALLEL)) {
|
||||
if (!(tcg_ctx->tb_cflags & CF_PARALLEL)) {
|
||||
TCGv_i32 t1 = tcg_temp_new_i32();
|
||||
TCGv_i32 t2 = tcg_temp_new_i32();
|
||||
|
||||
|
@ -2806,11 +2806,11 @@ void tcg_gen_atomic_cmpxchg_i32(TCGv_i32 retv, TCGv addr, TCGv_i32 cmpv,
|
|||
#ifdef CONFIG_SOFTMMU
|
||||
{
|
||||
TCGv_i32 oi = tcg_const_i32(make_memop_idx(memop & ~MO_SIGN, idx));
|
||||
gen(retv, tcg_ctx.tcg_env, addr, cmpv, newv, oi);
|
||||
gen(retv, tcg_ctx->tcg_env, addr, cmpv, newv, oi);
|
||||
tcg_temp_free_i32(oi);
|
||||
}
|
||||
#else
|
||||
gen(retv, tcg_ctx.tcg_env, addr, cmpv, newv);
|
||||
gen(retv, tcg_ctx->tcg_env, addr, cmpv, newv);
|
||||
#endif
|
||||
|
||||
if (memop & MO_SIGN) {
|
||||
|
@ -2824,7 +2824,7 @@ void tcg_gen_atomic_cmpxchg_i64(TCGv_i64 retv, TCGv addr, TCGv_i64 cmpv,
|
|||
{
|
||||
memop = tcg_canonicalize_memop(memop, 1, 0);
|
||||
|
||||
if (!(tcg_ctx.tb_cflags & CF_PARALLEL)) {
|
||||
if (!(tcg_ctx->tb_cflags & CF_PARALLEL)) {
|
||||
TCGv_i64 t1 = tcg_temp_new_i64();
|
||||
TCGv_i64 t2 = tcg_temp_new_i64();
|
||||
|
||||
|
@ -2851,14 +2851,14 @@ void tcg_gen_atomic_cmpxchg_i64(TCGv_i64 retv, TCGv addr, TCGv_i64 cmpv,
|
|||
#ifdef CONFIG_SOFTMMU
|
||||
{
|
||||
TCGv_i32 oi = tcg_const_i32(make_memop_idx(memop, idx));
|
||||
gen(retv, tcg_ctx.tcg_env, addr, cmpv, newv, oi);
|
||||
gen(retv, tcg_ctx->tcg_env, addr, cmpv, newv, oi);
|
||||
tcg_temp_free_i32(oi);
|
||||
}
|
||||
#else
|
||||
gen(retv, tcg_ctx.tcg_env, addr, cmpv, newv);
|
||||
gen(retv, tcg_ctx->tcg_env, addr, cmpv, newv);
|
||||
#endif
|
||||
#else
|
||||
gen_helper_exit_atomic(tcg_ctx.tcg_env);
|
||||
gen_helper_exit_atomic(tcg_ctx->tcg_env);
|
||||
/* Produce a result, so that we have a well-formed opcode stream
|
||||
with respect to uses of the result in the (dead) code following. */
|
||||
tcg_gen_movi_i64(retv, 0);
|
||||
|
@ -2914,11 +2914,11 @@ static void do_atomic_op_i32(TCGv_i32 ret, TCGv addr, TCGv_i32 val,
|
|||
#ifdef CONFIG_SOFTMMU
|
||||
{
|
||||
TCGv_i32 oi = tcg_const_i32(make_memop_idx(memop & ~MO_SIGN, idx));
|
||||
gen(ret, tcg_ctx.tcg_env, addr, val, oi);
|
||||
gen(ret, tcg_ctx->tcg_env, addr, val, oi);
|
||||
tcg_temp_free_i32(oi);
|
||||
}
|
||||
#else
|
||||
gen(ret, tcg_ctx.tcg_env, addr, val);
|
||||
gen(ret, tcg_ctx->tcg_env, addr, val);
|
||||
#endif
|
||||
|
||||
if (memop & MO_SIGN) {
|
||||
|
@ -2959,14 +2959,14 @@ static void do_atomic_op_i64(TCGv_i64 ret, TCGv addr, TCGv_i64 val,
|
|||
#ifdef CONFIG_SOFTMMU
|
||||
{
|
||||
TCGv_i32 oi = tcg_const_i32(make_memop_idx(memop & ~MO_SIGN, idx));
|
||||
gen(ret, tcg_ctx.tcg_env, addr, val, oi);
|
||||
gen(ret, tcg_ctx->tcg_env, addr, val, oi);
|
||||
tcg_temp_free_i32(oi);
|
||||
}
|
||||
#else
|
||||
gen(ret, tcg_ctx.tcg_env, addr, val);
|
||||
gen(ret, tcg_ctx->tcg_env, addr, val);
|
||||
#endif
|
||||
#else
|
||||
gen_helper_exit_atomic(tcg_ctx.tcg_env);
|
||||
gen_helper_exit_atomic(tcg_ctx->tcg_env);
|
||||
/* Produce a result, so that we have a well-formed opcode stream
|
||||
with respect to uses of the result in the (dead) code following. */
|
||||
tcg_gen_movi_i64(ret, 0);
|
||||
|
@ -3001,7 +3001,7 @@ static void * const table_##NAME[16] = { \
|
|||
void tcg_gen_atomic_##NAME##_i32 \
|
||||
(TCGv_i32 ret, TCGv addr, TCGv_i32 val, TCGArg idx, TCGMemOp memop) \
|
||||
{ \
|
||||
if (tcg_ctx.tb_cflags & CF_PARALLEL) { \
|
||||
if (tcg_ctx->tb_cflags & CF_PARALLEL) { \
|
||||
do_atomic_op_i32(ret, addr, val, idx, memop, table_##NAME); \
|
||||
} else { \
|
||||
do_nonatomic_op_i32(ret, addr, val, idx, memop, NEW, \
|
||||
|
@ -3011,7 +3011,7 @@ void tcg_gen_atomic_##NAME##_i32 \
|
|||
void tcg_gen_atomic_##NAME##_i64 \
|
||||
(TCGv_i64 ret, TCGv addr, TCGv_i64 val, TCGArg idx, TCGMemOp memop) \
|
||||
{ \
|
||||
if (tcg_ctx.tb_cflags & CF_PARALLEL) { \
|
||||
if (tcg_ctx->tb_cflags & CF_PARALLEL) { \
|
||||
do_atomic_op_i64(ret, addr, val, idx, memop, table_##NAME); \
|
||||
} else { \
|
||||
do_nonatomic_op_i64(ret, addr, val, idx, memop, NEW, \
|
||||
|
|
22
tcg/tcg.c
22
tcg/tcg.c
|
@ -243,7 +243,7 @@ static void tcg_out_label(TCGContext *s, TCGLabel *l, tcg_insn_unit *ptr)
|
|||
|
||||
TCGLabel *gen_new_label(void)
|
||||
{
|
||||
TCGContext *s = &tcg_ctx;
|
||||
TCGContext *s = tcg_ctx;
|
||||
TCGLabel *l = tcg_malloc(sizeof(TCGLabel));
|
||||
|
||||
*l = (TCGLabel){
|
||||
|
@ -382,6 +382,8 @@ void tcg_context_init(TCGContext *s)
|
|||
for (; i < ARRAY_SIZE(tcg_target_reg_alloc_order); ++i) {
|
||||
indirect_reg_alloc_order[i] = tcg_target_reg_alloc_order[i];
|
||||
}
|
||||
|
||||
tcg_ctx = s;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -522,7 +524,7 @@ void tcg_set_frame(TCGContext *s, TCGReg reg, intptr_t start, intptr_t size)
|
|||
|
||||
TCGv_i32 tcg_global_reg_new_i32(TCGReg reg, const char *name)
|
||||
{
|
||||
TCGContext *s = &tcg_ctx;
|
||||
TCGContext *s = tcg_ctx;
|
||||
TCGTemp *t;
|
||||
|
||||
if (tcg_regset_test_reg(s->reserved_regs, reg)) {
|
||||
|
@ -534,7 +536,7 @@ TCGv_i32 tcg_global_reg_new_i32(TCGReg reg, const char *name)
|
|||
|
||||
TCGv_i64 tcg_global_reg_new_i64(TCGReg reg, const char *name)
|
||||
{
|
||||
TCGContext *s = &tcg_ctx;
|
||||
TCGContext *s = tcg_ctx;
|
||||
TCGTemp *t;
|
||||
|
||||
if (tcg_regset_test_reg(s->reserved_regs, reg)) {
|
||||
|
@ -547,7 +549,7 @@ TCGv_i64 tcg_global_reg_new_i64(TCGReg reg, const char *name)
|
|||
TCGTemp *tcg_global_mem_new_internal(TCGType type, TCGv_ptr base,
|
||||
intptr_t offset, const char *name)
|
||||
{
|
||||
TCGContext *s = &tcg_ctx;
|
||||
TCGContext *s = tcg_ctx;
|
||||
TCGTemp *base_ts = tcgv_ptr_temp(base);
|
||||
TCGTemp *ts = tcg_global_alloc(s);
|
||||
int indirect_reg = 0, bigendian = 0;
|
||||
|
@ -602,7 +604,7 @@ TCGTemp *tcg_global_mem_new_internal(TCGType type, TCGv_ptr base,
|
|||
|
||||
static TCGTemp *tcg_temp_new_internal(TCGType type, int temp_local)
|
||||
{
|
||||
TCGContext *s = &tcg_ctx;
|
||||
TCGContext *s = tcg_ctx;
|
||||
TCGTemp *ts;
|
||||
int idx, k;
|
||||
|
||||
|
@ -659,7 +661,7 @@ TCGv_i64 tcg_temp_new_internal_i64(int temp_local)
|
|||
|
||||
static void tcg_temp_free_internal(TCGTemp *ts)
|
||||
{
|
||||
TCGContext *s = &tcg_ctx;
|
||||
TCGContext *s = tcg_ctx;
|
||||
int k, idx;
|
||||
|
||||
#if defined(CONFIG_DEBUG_TCG)
|
||||
|
@ -723,13 +725,13 @@ TCGv_i64 tcg_const_local_i64(int64_t val)
|
|||
#if defined(CONFIG_DEBUG_TCG)
|
||||
void tcg_clear_temp_count(void)
|
||||
{
|
||||
TCGContext *s = &tcg_ctx;
|
||||
TCGContext *s = tcg_ctx;
|
||||
s->temps_in_use = 0;
|
||||
}
|
||||
|
||||
int tcg_check_temp_count(void)
|
||||
{
|
||||
TCGContext *s = &tcg_ctx;
|
||||
TCGContext *s = tcg_ctx;
|
||||
if (s->temps_in_use) {
|
||||
/* Clear the count so that we don't give another
|
||||
* warning immediately next time around.
|
||||
|
@ -969,7 +971,7 @@ bool tcg_op_supported(TCGOpcode op)
|
|||
and endian swap in tcg_reg_alloc_call(). */
|
||||
void tcg_gen_callN(void *func, TCGTemp *ret, int nargs, TCGTemp **args)
|
||||
{
|
||||
TCGContext *s = &tcg_ctx;
|
||||
TCGContext *s = tcg_ctx;
|
||||
int i, real_args, nb_rets, pi;
|
||||
unsigned sizemask, flags;
|
||||
TCGHelperInfo *info;
|
||||
|
@ -2908,7 +2910,7 @@ int tcg_gen_code(TCGContext *s, TranslationBlock *tb)
|
|||
#ifdef CONFIG_PROFILER
|
||||
void tcg_dump_info(FILE *f, fprintf_function cpu_fprintf)
|
||||
{
|
||||
TCGContext *s = &tcg_ctx;
|
||||
TCGContext *s = tcg_ctx;
|
||||
int64_t tb_count = s->tb_count;
|
||||
int64_t tb_div_count = tb_count ? tb_count : 1;
|
||||
int64_t tot = s->interm_time + s->code_time;
|
||||
|
|
21
tcg/tcg.h
21
tcg/tcg.h
|
@ -688,12 +688,13 @@ struct TCGContext {
|
|||
target_ulong gen_insn_data[TCG_MAX_INSNS][TARGET_INSN_START_WORDS];
|
||||
};
|
||||
|
||||
extern TCGContext tcg_ctx;
|
||||
extern TCGContext tcg_init_ctx;
|
||||
extern TCGContext *tcg_ctx;
|
||||
|
||||
static inline size_t temp_idx(TCGTemp *ts)
|
||||
{
|
||||
ptrdiff_t n = ts - tcg_ctx.temps;
|
||||
tcg_debug_assert(n >= 0 && n < tcg_ctx.nb_temps);
|
||||
ptrdiff_t n = ts - tcg_ctx->temps;
|
||||
tcg_debug_assert(n >= 0 && n < tcg_ctx->nb_temps);
|
||||
return n;
|
||||
}
|
||||
|
||||
|
@ -713,7 +714,7 @@ static inline TCGTemp *arg_temp(TCGArg a)
|
|||
static inline TCGTemp *tcgv_i32_temp(TCGv_i32 v)
|
||||
{
|
||||
uintptr_t o = (uintptr_t)v;
|
||||
TCGTemp *t = (void *)&tcg_ctx + o;
|
||||
TCGTemp *t = (void *)tcg_ctx + o;
|
||||
tcg_debug_assert(offsetof(TCGContext, temps[temp_idx(t)]) == o);
|
||||
return t;
|
||||
}
|
||||
|
@ -746,7 +747,7 @@ static inline TCGArg tcgv_ptr_arg(TCGv_ptr v)
|
|||
static inline TCGv_i32 temp_tcgv_i32(TCGTemp *t)
|
||||
{
|
||||
(void)temp_idx(t); /* trigger embedded assert */
|
||||
return (TCGv_i32)((void *)t - (void *)&tcg_ctx);
|
||||
return (TCGv_i32)((void *)t - (void *)tcg_ctx);
|
||||
}
|
||||
|
||||
static inline TCGv_i64 temp_tcgv_i64(TCGTemp *t)
|
||||
|
@ -773,13 +774,13 @@ static inline TCGv_i32 TCGV_HIGH(TCGv_i64 t)
|
|||
|
||||
static inline void tcg_set_insn_param(int op_idx, int arg, TCGArg v)
|
||||
{
|
||||
tcg_ctx.gen_op_buf[op_idx].args[arg] = v;
|
||||
tcg_ctx->gen_op_buf[op_idx].args[arg] = v;
|
||||
}
|
||||
|
||||
/* The number of opcodes emitted so far. */
|
||||
static inline int tcg_op_buf_count(void)
|
||||
{
|
||||
return tcg_ctx.gen_next_op_idx;
|
||||
return tcg_ctx->gen_next_op_idx;
|
||||
}
|
||||
|
||||
/* Test for whether to terminate the TB for using too many opcodes. */
|
||||
|
@ -798,7 +799,7 @@ TranslationBlock *tcg_tb_alloc(TCGContext *s);
|
|||
/* Called with tb_lock held. */
|
||||
static inline void *tcg_malloc(int size)
|
||||
{
|
||||
TCGContext *s = &tcg_ctx;
|
||||
TCGContext *s = tcg_ctx;
|
||||
uint8_t *ptr, *ptr_end;
|
||||
|
||||
/* ??? This is a weak placeholder for minimum malloc alignment. */
|
||||
|
@ -807,7 +808,7 @@ static inline void *tcg_malloc(int size)
|
|||
ptr = s->pool_cur;
|
||||
ptr_end = ptr + size;
|
||||
if (unlikely(ptr_end > s->pool_end)) {
|
||||
return tcg_malloc_internal(&tcg_ctx, size);
|
||||
return tcg_malloc_internal(tcg_ctx, size);
|
||||
} else {
|
||||
s->pool_cur = ptr_end;
|
||||
return ptr;
|
||||
|
@ -1147,7 +1148,7 @@ static inline unsigned get_mmuidx(TCGMemOpIdx oi)
|
|||
uintptr_t tcg_qemu_tb_exec(CPUArchState *env, uint8_t *tb_ptr);
|
||||
#else
|
||||
# define tcg_qemu_tb_exec(env, tb_ptr) \
|
||||
((uintptr_t (*)(void *, void *))tcg_ctx.code_gen_prologue)(env, tb_ptr)
|
||||
((uintptr_t (*)(void *, void *))tcg_ctx->code_gen_prologue)(env, tb_ptr)
|
||||
#endif
|
||||
|
||||
void tcg_register_jit(void *buf, size_t buf_size);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue