我正在阅读 Qemu 的源代码,想知道 Qemu 如何模拟 x86 处理器的 eflags,在target-i386/cc-helper.c
文件中我发现类似的功能可以compute_all_addw
完成这项工作,我想知道 Qemu 如何实现这些功能,但我找不到所有这些功能的定义. 我错过了什么?请帮忙。
问问题
59 次
1 回答
2
QEMU 在这里使用了一个它经常使用的技巧——使用 C 预处理器创建多个非常相似的函数,而无需手动将它们全部写出来。
在这种特定情况下,代码位于 target-i386/cc_helper_template.h 中:
static int glue(compute_all_add, SUFFIX)(DATA_TYPE dst, DATA_TYPE src1)
{
int cf, pf, af, zf, sf, of;
[...]
}
whereglue()
是一个宏,它只是将其参数粘在一起。SUFFIX
并DATA_TYPE
根据 .h 文件的值在前面定义SHIFT
。target-i386/cc_helper.c
然后#include
s 模板 .h 文件多次,SHIFT
每次定义不同。这导致从单个模板生成compute_all_addb
、compute_all_addw
和compute_all_addl
的函数定义。compute_all_addq
一般来说,如果你在 QEMU 的源代码中找不到使用 'grep' 的函数定义,那么很有可能它会像这样自动生成——搜索函数名的子字符串可能会有所帮助。
于 2016-11-29T15:43:51.177 回答