準仮想化 - ____PVOP_CALL()
概要
準仮想環境下で実行される命令の置き換え、及び実行するための命令を生成し、実行した値を取得する
詳細
このマクロでは以下の引数を受け取る
- 取得する値の型を示す : rettype
- 実行する命令のポインタを示す : op
- 命令内で使用するレジスタの種類を示す : clbr
- アセンブラ命令の出力引数として指定する引数のリストを示す : call_clbr
- アセンブラ命令内で変更されるレジスタのリストを示す : extra_clbr
- 生成されるアセンブラ命令の前に実行する命令を示すアセンブラ命令の文字列 : pre
- 生成されるアセンブラ命令の後に実行する命令を示すアセンブラ命令の文字列 : post
rettype型の戻り値retとPVOP_CALL_ARGSで使用する可能性のあるレジスタに割り当てるための変数を初期化し、 PVOP_TEST_NULL()にopを引数として実行し、opの値が無効な値でないことを確認する
その後、以下の内容で拡張インラインアセンブラ命令を生成する
- 実行命令
- pre + paravirt_alt()にPARAVIRT_CALLを引数として生成した命令 + postから成るアセンブラ命令
- 出力引数
- call_clbr
- 入力引数
- paravirt_type()にopを引数として実行して生成した値
- paravirt_clobber()にclbrを引数として実行して生成した値
- 可変長引数が存在する場合は、それらも入力引数に追加する
- 破壊レジスタ
- memory
- cc (ステータスレジスタ)
- extra_clbr
このアセンブラ命令を実行後に出力引数に指定した値から返り値を取得するが、返り値の型の大きさによって返り値が以下のように異なります
- rettype > sizeof(unsigned long)
- 上位32bitを%edx、下位32bitを%eaxとする値
- _rettype <= sizeof(unsigned long)
- _%eax