首先要知道的是,VCPU从哪里进入code cache:
在$QEMUDIR/cpu-exec.c的函数cpu_exec(),这个函数是VCPU模拟CPU功能的主函数,包括异常,中断等的处理、binary translate、TB(translate block)管理查找以及真正CPU指令的执行。在跳过一大段中断异常的处理后,在代码599行(qemu-1.3.0):
这行代码表示当前VCPU线程真正进入code cache。
在查找tcg_qemu_tb_exec这个函数定义的时候会发现整个qemu代码中有三处定义:
1.$QEMUDIR/tcg/ppc/tcg-target.h中,从它的目录中看出他并不是我们要找的。
2.$QEMUDIR/tci.c,这里对tcg_qemu_tb_exec这个函数有完整的定义,但是它并不是这里我要讨论。tci.c中的这个函数是在interpret模式下使用的,在默认config下我们可以删除这个tci.c进行编译,完全不影响。而我现在要讨论的是在binary translate方式时使用的这个tcg_qemu_tb_exec。
3.$QEMUDIR/tcg/tcg.h中定义。没错,这个才是我们要找的:
#if !defined(tcg_qemu_tb_exec)
# define tcg_qemu_tb_exec(env, tb_ptr) \
((tcg_target_ulong (*)(void *, void *))code_gen_prologue)(env, tb_ptr)
#endif
但是这个macro只定义