QEMU中taget code翻译为TCG 中间码的过程

本文详细介绍了QEMU中TCG中间码的宏定义,包括位于tcg/tcg-opc.h文件下的部分定义,以及TCG微型操作码如INDEX_op_movi_i64等。接着,深入剖析了代码翻译过程,特别是gen_intermediate_code函数在PPC体系架构下的应用,该函数在target/ppc/translate.c中定义,并调用translator_loop函数进行进一步处理。
摘要由CSDN通过智能技术生成

目录

1.TCG中间码的宏定义

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;         
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值