目录
2. 代码翻译过程(gen_intermediate_code函数的解析,这里以PPC体系架构为例)
1.TCG中间码的宏定义
该头文件位于tcg/tcg-opc.h文件下,部分定义如下所示:
DEF(mov_i32, 1, 1, 0, TCG_OPF_NOT_PRESENT)
DEF(movi_i32, 1, 0, 1, TCG_OPF_NOT_PRESENT)
DEF(setcond_i32, 1, 2, 1, 0)
DEF(movcond_i32, 1, 4, 1, IMPL(TCG_TARGET_HAS_movcond_i32))
/* load/store */
DEF(ld8u_i32, 1, 1, 1, 0)
DEF(ld8s_i32, 1, 1, 1, 0)
DEF(ld16u_i32, 1, 1, 1, 0)
DEF(ld16s_i32, 1, 1, 1, 0)
DEF(ld_i32, 1, 1, 1, 0)
DEF(st8_i32, 0, 2, 1, 0)
DEF(st16_i32, 0, 2, 1, 0)
DEF(st_i32, 0, 2, 1, 0)
以上TCG微型操作码的宏定义位于tcg/tcg.h文件中line204,宏定义如下
typedef enum TCGOpcode {
#define DEF(name, oargs, iargs, cargs, flags) INDEX_op_ ## name,
#include "tcg-opc.h"
#undef DEF
NB_OPS,
} TCGOpcode;
最终生成的TCG微型操作码有INDEX_op_movi_i64、INDEX_op_ld8u_i64、INDEX_op_discard等还有一些qemu专用的如INDEX_op_insn_start、INDEX_op_exit_tb等。
2. 代码翻译过程(gen_intermediate_code函数的解析,这里以PPC体系架构为例)
gen_intermediate_code函数定义位于target/ppc/traslate.c文件中,具体定义如下
void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb)
{
DisasContext ctx;
translator_loop(&ppc_tr_ops, &ctx.base, cs, tb);
}
其中调用了translator_loop函数位于accel/tcg/translator.c文件下,函数具体定义如下:
void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
CPUState *cpu, TranslationBlock *tb)
{
int max_insns;
/* Initialize DisasContext */
db->tb = tb;
db->pc_first = tb->pc; //TB目标机中的第一条指令的地址
db->pc_next = db->pc_first; //pc_next是当前正在进行反汇编的指令的地址
db->is_jmp = DISAS_NEXT; //接下来要反汇编的指令类型
db->num_insns = 0;