mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
accel/tcg: Move gen_intermediate_code to TCGCPUOps.translate_core
Convert all targets simultaneously, as the gen_intermediate_code function disappears from the target. While there are possible workarounds, they're larger than simply performing the conversion. Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
@@ -1088,11 +1088,13 @@ bool tcg_exec_realizefn(CPUState *cpu, Error **errp)
|
||||
|
||||
if (!tcg_target_initialized) {
|
||||
/* Check mandatory TCGCPUOps handlers */
|
||||
const TCGCPUOps *tcg_ops = cpu->cc->tcg_ops;
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
assert(cpu->cc->tcg_ops->cpu_exec_halt);
|
||||
assert(cpu->cc->tcg_ops->cpu_exec_interrupt);
|
||||
assert(tcg_ops->cpu_exec_halt);
|
||||
assert(tcg_ops->cpu_exec_interrupt);
|
||||
#endif /* !CONFIG_USER_ONLY */
|
||||
cpu->cc->tcg_ops->initialize();
|
||||
assert(tcg_ops->translate_code);
|
||||
tcg_ops->initialize();
|
||||
tcg_target_initialized = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -276,8 +276,10 @@ static int setjmp_gen_code(CPUArchState *env, TranslationBlock *tb,
|
||||
|
||||
tcg_func_start(tcg_ctx);
|
||||
|
||||
tcg_ctx->cpu = env_cpu(env);
|
||||
gen_intermediate_code(env_cpu(env), tb, max_insns, pc, host_pc);
|
||||
CPUState *cs = env_cpu(env);
|
||||
tcg_ctx->cpu = cs;
|
||||
cs->cc->tcg_ops->translate_code(cs, tb, max_insns, pc, host_pc);
|
||||
|
||||
assert(tb->size != 0);
|
||||
tcg_ctx->cpu = NULL;
|
||||
*max_insns = tb->icount;
|
||||
@@ -364,7 +366,7 @@ TranslationBlock *tb_gen_code(CPUState *cpu,
|
||||
/*
|
||||
* Overflow of code_gen_buffer, or the current slice of it.
|
||||
*
|
||||
* TODO: We don't need to re-do gen_intermediate_code, nor
|
||||
* TODO: We don't need to re-do tcg_ops->translate_code, nor
|
||||
* should we re-do the tcg optimization currently hidden
|
||||
* inside tcg_gen_code. All that should be required is to
|
||||
* flush the TBs, allocate a new TB, re-initialize it per
|
||||
|
||||
@@ -21,20 +21,6 @@
|
||||
#include "qemu/bswap.h"
|
||||
#include "exec/vaddr.h"
|
||||
|
||||
/**
|
||||
* gen_intermediate_code
|
||||
* @cpu: cpu context
|
||||
* @tb: translation block
|
||||
* @max_insns: max number of instructions to translate
|
||||
* @pc: guest virtual program counter address
|
||||
* @host_pc: host physical program counter address
|
||||
*
|
||||
* This function must be provided by the target, which should create
|
||||
* the target-specific DisasContext, and then invoke translator_loop.
|
||||
*/
|
||||
void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int *max_insns,
|
||||
vaddr pc, void *host_pc);
|
||||
|
||||
/**
|
||||
* DisasJumpType:
|
||||
* @DISAS_NEXT: Next instruction in program order.
|
||||
|
||||
@@ -24,6 +24,19 @@ struct TCGCPUOps {
|
||||
* Called when the first CPU is realized.
|
||||
*/
|
||||
void (*initialize)(void);
|
||||
/**
|
||||
* @translate_code: Translate guest instructions to TCGOps
|
||||
* @cpu: cpu context
|
||||
* @tb: translation block
|
||||
* @max_insns: max number of instructions to translate
|
||||
* @pc: guest virtual program counter address
|
||||
* @host_pc: host physical program counter address
|
||||
*
|
||||
* This function must be provided by the target, which should create
|
||||
* the target-specific DisasContext, and then invoke translator_loop.
|
||||
*/
|
||||
void (*translate_code)(CPUState *cpu, TranslationBlock *tb,
|
||||
int *max_insns, vaddr pc, void *host_pc);
|
||||
/**
|
||||
* @synchronize_from_tb: Synchronize state from a TCG #TranslationBlock
|
||||
*
|
||||
|
||||
@@ -224,6 +224,7 @@ static const struct SysemuCPUOps alpha_sysemu_ops = {
|
||||
|
||||
static const TCGCPUOps alpha_tcg_ops = {
|
||||
.initialize = alpha_translate_init,
|
||||
.translate_code = alpha_translate_code,
|
||||
.synchronize_from_tb = alpha_cpu_synchronize_from_tb,
|
||||
.restore_state_to_opc = alpha_restore_state_to_opc,
|
||||
|
||||
|
||||
@@ -431,6 +431,8 @@ enum {
|
||||
};
|
||||
|
||||
void alpha_translate_init(void);
|
||||
void alpha_translate_code(CPUState *cs, TranslationBlock *tb,
|
||||
int *max_insns, vaddr pc, void *host_pc);
|
||||
|
||||
#define CPU_RESOLVING_TYPE TYPE_ALPHA_CPU
|
||||
|
||||
|
||||
@@ -2955,8 +2955,8 @@ static const TranslatorOps alpha_tr_ops = {
|
||||
.tb_stop = alpha_tr_tb_stop,
|
||||
};
|
||||
|
||||
void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int *max_insns,
|
||||
vaddr pc, void *host_pc)
|
||||
void alpha_translate_code(CPUState *cpu, TranslationBlock *tb,
|
||||
int *max_insns, vaddr pc, void *host_pc)
|
||||
{
|
||||
DisasContext dc;
|
||||
translator_loop(cpu, tb, max_insns, pc, host_pc, &alpha_tr_ops, &dc.base);
|
||||
|
||||
@@ -2682,6 +2682,7 @@ static const struct SysemuCPUOps arm_sysemu_ops = {
|
||||
#ifdef CONFIG_TCG
|
||||
static const TCGCPUOps arm_tcg_ops = {
|
||||
.initialize = arm_translate_init,
|
||||
.translate_code = arm_translate_code,
|
||||
.synchronize_from_tb = arm_cpu_synchronize_from_tb,
|
||||
.debug_excp_handler = arm_debug_excp_handler,
|
||||
.restore_state_to_opc = arm_restore_state_to_opc,
|
||||
|
||||
@@ -357,6 +357,8 @@ void init_cpreg_list(ARMCPU *cpu);
|
||||
|
||||
void arm_cpu_register_gdb_regs_for_features(ARMCPU *cpu);
|
||||
void arm_translate_init(void);
|
||||
void arm_translate_code(CPUState *cs, TranslationBlock *tb,
|
||||
int *max_insns, vaddr pc, void *host_pc);
|
||||
|
||||
void arm_cpu_register_gdb_commands(ARMCPU *cpu);
|
||||
void aarch64_cpu_register_gdb_commands(ARMCPU *cpu, GString *,
|
||||
|
||||
@@ -234,6 +234,7 @@ static void cortex_m55_initfn(Object *obj)
|
||||
|
||||
static const TCGCPUOps arm_v7m_tcg_ops = {
|
||||
.initialize = arm_translate_init,
|
||||
.translate_code = arm_translate_code,
|
||||
.synchronize_from_tb = arm_cpu_synchronize_from_tb,
|
||||
.debug_excp_handler = arm_debug_excp_handler,
|
||||
.restore_state_to_opc = arm_restore_state_to_opc,
|
||||
|
||||
@@ -8093,9 +8093,8 @@ static const TranslatorOps thumb_translator_ops = {
|
||||
.tb_stop = arm_tr_tb_stop,
|
||||
};
|
||||
|
||||
/* generate intermediate code for basic block 'tb'. */
|
||||
void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int *max_insns,
|
||||
vaddr pc, void *host_pc)
|
||||
void arm_translate_code(CPUState *cpu, TranslationBlock *tb,
|
||||
int *max_insns, vaddr pc, void *host_pc)
|
||||
{
|
||||
DisasContext dc = { };
|
||||
const TranslatorOps *ops = &arm_translator_ops;
|
||||
|
||||
@@ -207,6 +207,7 @@ static const struct SysemuCPUOps avr_sysemu_ops = {
|
||||
|
||||
static const TCGCPUOps avr_tcg_ops = {
|
||||
.initialize = avr_cpu_tcg_init,
|
||||
.translate_code = avr_cpu_translate_code,
|
||||
.synchronize_from_tb = avr_cpu_synchronize_from_tb,
|
||||
.restore_state_to_opc = avr_restore_state_to_opc,
|
||||
.cpu_exec_interrupt = avr_cpu_exec_interrupt,
|
||||
|
||||
@@ -183,6 +183,8 @@ static inline void set_avr_feature(CPUAVRState *env, int feature)
|
||||
}
|
||||
|
||||
void avr_cpu_tcg_init(void);
|
||||
void avr_cpu_translate_code(CPUState *cs, TranslationBlock *tb,
|
||||
int *max_insns, vaddr pc, void *host_pc);
|
||||
|
||||
int cpu_avr_exec(CPUState *cpu);
|
||||
|
||||
|
||||
@@ -2599,7 +2599,7 @@ static bool trans_WDR(DisasContext *ctx, arg_WDR *a)
|
||||
*
|
||||
* - translate()
|
||||
* - canonicalize_skip()
|
||||
* - gen_intermediate_code()
|
||||
* - translate_code()
|
||||
* - restore_state_to_opc()
|
||||
*
|
||||
*/
|
||||
@@ -2795,8 +2795,8 @@ static const TranslatorOps avr_tr_ops = {
|
||||
.tb_stop = avr_tr_tb_stop,
|
||||
};
|
||||
|
||||
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
|
||||
vaddr pc, void *host_pc)
|
||||
void avr_cpu_translate_code(CPUState *cs, TranslationBlock *tb,
|
||||
int *max_insns, vaddr pc, void *host_pc)
|
||||
{
|
||||
DisasContext dc = { };
|
||||
translator_loop(cs, tb, max_insns, pc, host_pc, &avr_tr_ops, &dc.base);
|
||||
|
||||
@@ -325,6 +325,7 @@ static void hexagon_cpu_init(Object *obj)
|
||||
|
||||
static const TCGCPUOps hexagon_tcg_ops = {
|
||||
.initialize = hexagon_translate_init,
|
||||
.translate_code = hexagon_translate_code,
|
||||
.synchronize_from_tb = hexagon_cpu_synchronize_from_tb,
|
||||
.restore_state_to_opc = hexagon_restore_state_to_opc,
|
||||
};
|
||||
|
||||
@@ -150,6 +150,8 @@ static inline void cpu_get_tb_cpu_state(CPUHexagonState *env, vaddr *pc,
|
||||
typedef HexagonCPU ArchCPU;
|
||||
|
||||
void hexagon_translate_init(void);
|
||||
void hexagon_translate_code(CPUState *cs, TranslationBlock *tb,
|
||||
int *max_insns, vaddr pc, void *host_pc);
|
||||
|
||||
#include "exec/cpu-all.h"
|
||||
|
||||
|
||||
@@ -1026,8 +1026,8 @@ static const TranslatorOps hexagon_tr_ops = {
|
||||
.tb_stop = hexagon_tr_tb_stop,
|
||||
};
|
||||
|
||||
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
|
||||
vaddr pc, void *host_pc)
|
||||
void hexagon_translate_code(CPUState *cs, TranslationBlock *tb,
|
||||
int *max_insns, vaddr pc, void *host_pc)
|
||||
{
|
||||
DisasContext ctx;
|
||||
|
||||
|
||||
@@ -223,6 +223,7 @@ static const struct SysemuCPUOps hppa_sysemu_ops = {
|
||||
|
||||
static const TCGCPUOps hppa_tcg_ops = {
|
||||
.initialize = hppa_translate_init,
|
||||
.translate_code = hppa_translate_code,
|
||||
.synchronize_from_tb = hppa_cpu_synchronize_from_tb,
|
||||
.restore_state_to_opc = hppa_restore_state_to_opc,
|
||||
|
||||
|
||||
@@ -303,6 +303,8 @@ static inline int HPPA_BTLB_ENTRIES(CPUHPPAState *env)
|
||||
}
|
||||
|
||||
void hppa_translate_init(void);
|
||||
void hppa_translate_code(CPUState *cs, TranslationBlock *tb,
|
||||
int *max_insns, vaddr pc, void *host_pc);
|
||||
|
||||
#define CPU_RESOLVING_TYPE TYPE_HPPA_CPU
|
||||
|
||||
|
||||
@@ -4869,8 +4869,8 @@ static const TranslatorOps hppa_tr_ops = {
|
||||
#endif
|
||||
};
|
||||
|
||||
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
|
||||
vaddr pc, void *host_pc)
|
||||
void hppa_translate_code(CPUState *cs, TranslationBlock *tb,
|
||||
int *max_insns, vaddr pc, void *host_pc)
|
||||
{
|
||||
DisasContext ctx = { };
|
||||
translator_loop(cs, tb, max_insns, pc, host_pc, &hppa_tr_ops, &ctx.base);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user