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
、テンプレート .h ファイルを複数回使用し、SHIFT
毎回異なる定義を行います。compute_all_addb
これにより、 、compute_all_addw
、compute_all_addl
およびの関数定義compute_all_addq
が単一のテンプレートから生成されます。
一般に、'grep' を使用して QEMU のソース コードで関数定義が見つからない場合は、このように自動生成されている可能性が高く、関数名の部分文字列を検索すると役立つ場合があります。
于 2016-11-29T15:43:51.177 に答える