0

我正在阅读 Qemu 的源代码,想知道 Qemu 如何模拟 x86 处理器的 eflags,在target-i386/cc-helper.c文件中我发现类似的功能可以compute_all_addw完成这项工作,我想知道 Qemu 如何实现这些功能,但我找不到所有这些功能的定义. 我错过了什么?请帮忙。

4

1 回答 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()是一个宏,它只是将其参数粘在一起。SUFFIXDATA_TYPE根据 .h 文件的值在前面定义SHIFTtarget-i386/cc_helper.c然后#includes 模板 .h 文件多次,SHIFT每次定义不同。这导致从单个模板生成compute_all_addbcompute_all_addwcompute_all_addl的函数定义。compute_all_addq

一般来说,如果你在 QEMU 的源代码中找不到使用 'grep' 的函数定义,那么很有可能它会像这样自动生成——搜索函数名的子字符串可能会有所帮助。

于 2016-11-29T15:43:51.177 回答