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次に#include、テンプレート .h ファイルを複数回使用し、SHIFT毎回異なる定義を行います。compute_all_addbこれにより、 、compute_all_addwcompute_all_addlおよびの関数定義compute_all_addqが単一のテンプレートから生成されます。

一般に、'grep' を使用して QEMU のソース コードで関数定義が見つからない場合は、このように自動生成されている可能性が高く、関数名の部分文字列を検索すると役立つ場合があります。

于 2016-11-29T15:43:51.177 に答える