mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
tcg: Merge cpu_gen_code into tb_gen_code
As it's only caller, this tidies things a bit. Reviewed-by: Aurelien Jarno <aurelien@aurel32.net> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
parent
a3d5ad761c
commit
fec88f64bd
2 changed files with 59 additions and 74 deletions
|
@ -78,8 +78,6 @@ void restore_state_to_opc(CPUArchState *env, struct TranslationBlock *tb,
|
|||
int pc_pos);
|
||||
|
||||
void cpu_gen_init(void);
|
||||
int cpu_gen_code(CPUArchState *env, struct TranslationBlock *tb,
|
||||
int *gen_code_size_ptr);
|
||||
bool cpu_restore_state(CPUState *cpu, uintptr_t searched_pc);
|
||||
void page_size_init(void);
|
||||
|
||||
|
|
131
translate-all.c
131
translate-all.c
|
@ -168,73 +168,7 @@ void cpu_gen_init(void)
|
|||
tcg_context_init(&tcg_ctx);
|
||||
}
|
||||
|
||||
/* return non zero if the very first instruction is invalid so that
|
||||
* the virtual CPU can trigger an exception.
|
||||
*
|
||||
* '*gen_code_size_ptr' contains the size of the generated code (host
|
||||
* code).
|
||||
*
|
||||
* Called with mmap_lock held for user-mode emulation.
|
||||
*/
|
||||
int cpu_gen_code(CPUArchState *env, TranslationBlock *tb, int *gen_code_size_ptr)
|
||||
{
|
||||
TCGContext *s = &tcg_ctx;
|
||||
tcg_insn_unit *gen_code_buf;
|
||||
int gen_code_size;
|
||||
#ifdef CONFIG_PROFILER
|
||||
int64_t ti;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PROFILER
|
||||
s->tb_count1++; /* includes aborted translations because of
|
||||
exceptions */
|
||||
ti = profile_getclock();
|
||||
#endif
|
||||
tcg_func_start(s);
|
||||
|
||||
gen_intermediate_code(env, tb);
|
||||
|
||||
trace_translate_block(tb, tb->pc, tb->tc_ptr);
|
||||
|
||||
/* generate machine code */
|
||||
gen_code_buf = tb->tc_ptr;
|
||||
tb->tb_next_offset[0] = 0xffff;
|
||||
tb->tb_next_offset[1] = 0xffff;
|
||||
s->tb_next_offset = tb->tb_next_offset;
|
||||
#ifdef USE_DIRECT_JUMP
|
||||
s->tb_jmp_offset = tb->tb_jmp_offset;
|
||||
s->tb_next = NULL;
|
||||
#else
|
||||
s->tb_jmp_offset = NULL;
|
||||
s->tb_next = tb->tb_next;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PROFILER
|
||||
s->tb_count++;
|
||||
s->interm_time += profile_getclock() - ti;
|
||||
s->code_time -= profile_getclock();
|
||||
#endif
|
||||
gen_code_size = tcg_gen_code(s, gen_code_buf);
|
||||
*gen_code_size_ptr = gen_code_size;
|
||||
#ifdef CONFIG_PROFILER
|
||||
s->code_time += profile_getclock();
|
||||
s->code_in_len += tb->size;
|
||||
s->code_out_len += gen_code_size;
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG_DISAS
|
||||
if (qemu_loglevel_mask(CPU_LOG_TB_OUT_ASM)) {
|
||||
qemu_log("OUT: [size=%d]\n", gen_code_size);
|
||||
log_disas(tb->tc_ptr, gen_code_size);
|
||||
qemu_log("\n");
|
||||
qemu_log_flush();
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* The cpu state corresponding to 'searched_pc' is restored.
|
||||
*/
|
||||
/* The cpu state corresponding to 'searched_pc' is restored. */
|
||||
static int cpu_restore_state_from_tb(CPUState *cpu, TranslationBlock *tb,
|
||||
uintptr_t searched_pc)
|
||||
{
|
||||
|
@ -1034,7 +968,11 @@ TranslationBlock *tb_gen_code(CPUState *cpu,
|
|||
TranslationBlock *tb;
|
||||
tb_page_addr_t phys_pc, phys_page2;
|
||||
target_ulong virt_page2;
|
||||
int code_gen_size;
|
||||
tcg_insn_unit *gen_code_buf;
|
||||
int gen_code_size;
|
||||
#ifdef CONFIG_PROFILER
|
||||
int64_t ti;
|
||||
#endif
|
||||
|
||||
phys_pc = get_page_addr_code(env, pc);
|
||||
if (use_icount) {
|
||||
|
@ -1049,13 +987,62 @@ TranslationBlock *tb_gen_code(CPUState *cpu,
|
|||
/* Don't forget to invalidate previous TB info. */
|
||||
tcg_ctx.tb_ctx.tb_invalidated_flag = 1;
|
||||
}
|
||||
tb->tc_ptr = tcg_ctx.code_gen_ptr;
|
||||
|
||||
gen_code_buf = tcg_ctx.code_gen_ptr;
|
||||
tb->tc_ptr = gen_code_buf;
|
||||
tb->cs_base = cs_base;
|
||||
tb->flags = flags;
|
||||
tb->cflags = cflags;
|
||||
cpu_gen_code(env, tb, &code_gen_size);
|
||||
tcg_ctx.code_gen_ptr = (void *)(((uintptr_t)tcg_ctx.code_gen_ptr +
|
||||
code_gen_size + CODE_GEN_ALIGN - 1) & ~(CODE_GEN_ALIGN - 1));
|
||||
|
||||
#ifdef CONFIG_PROFILER
|
||||
tcg_ctx.tb_count1++; /* includes aborted translations because of
|
||||
exceptions */
|
||||
ti = profile_getclock();
|
||||
#endif
|
||||
|
||||
tcg_func_start(&tcg_ctx);
|
||||
|
||||
gen_intermediate_code(env, tb);
|
||||
|
||||
trace_translate_block(tb, tb->pc, tb->tc_ptr);
|
||||
|
||||
/* generate machine code */
|
||||
tb->tb_next_offset[0] = 0xffff;
|
||||
tb->tb_next_offset[1] = 0xffff;
|
||||
tcg_ctx.tb_next_offset = tb->tb_next_offset;
|
||||
#ifdef USE_DIRECT_JUMP
|
||||
tcg_ctx.tb_jmp_offset = tb->tb_jmp_offset;
|
||||
tcg_ctx.tb_next = NULL;
|
||||
#else
|
||||
tcg_ctx.tb_jmp_offset = NULL;
|
||||
tcg_ctx.tb_next = tb->tb_next;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PROFILER
|
||||
tcg_ctx.tb_count++;
|
||||
tcg_ctx.interm_time += profile_getclock() - ti;
|
||||
tcg_ctx.code_time -= profile_getclock();
|
||||
#endif
|
||||
|
||||
gen_code_size = tcg_gen_code(&tcg_ctx, gen_code_buf);
|
||||
|
||||
#ifdef CONFIG_PROFILER
|
||||
tcg_ctx.code_time += profile_getclock();
|
||||
tcg_ctx.code_in_len += tb->size;
|
||||
tcg_ctx.code_out_len += gen_code_size;
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG_DISAS
|
||||
if (qemu_loglevel_mask(CPU_LOG_TB_OUT_ASM)) {
|
||||
qemu_log("OUT: [size=%d]\n", gen_code_size);
|
||||
log_disas(tb->tc_ptr, gen_code_size);
|
||||
qemu_log("\n");
|
||||
qemu_log_flush();
|
||||
}
|
||||
#endif
|
||||
|
||||
tcg_ctx.code_gen_ptr = (void *)(((uintptr_t)gen_code_buf +
|
||||
gen_code_size + CODE_GEN_ALIGN - 1) & ~(CODE_GEN_ALIGN - 1));
|
||||
|
||||
/* check next page if needed */
|
||||
virt_page2 = (pc + tb->size - 1) & TARGET_PAGE_MASK;
|
||||
|
|
Loading…
Reference in a new issue