linuxのメモ

Linux kernelの実装を解説していきます (対象ver 4.5)

準仮想化 - ____PVOP_CALL()

概要

準仮想環境下で実行される命令の置き換え、及び実行するための命令を生成し、実行した値を取得する

詳細

このマクロでは以下の引数を受け取る

rettype型の戻り値retPVOP_CALL_ARGSで使用する可能性のあるレジスタに割り当てるための変数を初期化し、 PVOP_TEST_NULL()opを引数として実行し、opの値が無効な値でないことを確認する

その後、以下の内容で拡張インラインアセンブラ命令を生成する

  • 実行命令
  • 出力引数
    • call_clbr
  • 入力引数
    • paravirt_type()opを引数として実行して生成した値
    • paravirt_clobber()clbrを引数として実行して生成した値
    • 可変長引数が存在する場合は、それらも入力引数に追加する
  • 破壊レジスタ

このアセンブラ命令を実行後に出力引数に指定した値から返り値を取得するが、返り値の型の大きさによって返り値が以下のように異なります

  • rettype > sizeof(unsigned long)
    • 上位32bitを%edx、下位32bitを%eaxとする値
  • _rettype <= sizeof(unsigned long)
    • _%eax