在 i386 目标的 QEMU 存储库中找不到 compute_all_xxx 函数的定义?
Can't find definition of compute_all_xxx functions in QEMU repository for i386 target?
我正在阅读 Qemu 的源代码,想知道 Qemu 如何模拟 x86 处理器的 eflags,在 target-i386/cc-helper.c
文件中我发现像 compute_all_addw
这样的函数可以完成这项工作,我想知道如何Qemu 实现了这些功能,但我找不到所有这些功能的定义。我错过了什么?请帮忙
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;
[...]
}
其中 glue()
是一个宏,它只是将其参数粘在一起。 SUFFIX
和 DATA_TYPE
是根据 SHIFT
的值在 .h 文件中较早定义的。 target-i386/cc_helper.c
然后 #include
多次使用模板 .h 文件,每次都不同地定义 SHIFT
。这导致从单个模板生成 compute_all_addb
、compute_all_addw
、compute_all_addl
和 compute_all_addq
的函数定义。
一般来说,如果您在 QEMU 的源代码中找不到带有 'grep' 的函数定义,那么很有可能它是像这样自动生成的——搜索函数名称的子字符串可能会有帮助。
我正在阅读 Qemu 的源代码,想知道 Qemu 如何模拟 x86 处理器的 eflags,在 target-i386/cc-helper.c
文件中我发现像 compute_all_addw
这样的函数可以完成这项工作,我想知道如何Qemu 实现了这些功能,但我找不到所有这些功能的定义。我错过了什么?请帮忙
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;
[...]
}
其中 glue()
是一个宏,它只是将其参数粘在一起。 SUFFIX
和 DATA_TYPE
是根据 SHIFT
的值在 .h 文件中较早定义的。 target-i386/cc_helper.c
然后 #include
多次使用模板 .h 文件,每次都不同地定义 SHIFT
。这导致从单个模板生成 compute_all_addb
、compute_all_addw
、compute_all_addl
和 compute_all_addq
的函数定义。
一般来说,如果您在 QEMU 的源代码中找不到带有 'grep' 的函数定义,那么很有可能它是像这样自动生成的——搜索函数名称的子字符串可能会有帮助。