私の会社はハイパーバイザーを開発しており、この質問は AMD の SVM (Secure-Virtual-Machine) API の使用に関するものです。
特定の期間にゲスト OS で実行された命令の数を正確に追跡したいと考えています。AMD は、0x10h ファミリ CPU (Phenom x2 など) の実装において、PerfEvtSel MSR (0xc0010000..3) でいわゆる「HO」および「GO」または「HostOnly」および「GuestOnly」ビットを親切に提供しました。ファミリ 0x10h の BKDG は、これらのビットが 64 ビット PerfEvtSel レジスタの 40 と 41 であることを示します。ただし、ファミリ 0x11h の BKDG には、HostOnly ビットと GuestOnly ビットの存在が記載されていません。
私が持っているコードは次のようになります。
reg_svm_pes_set_unit_mask(&pes, 0x00);
reg_svm_pes_set_usr(&pes, 1); // Count user mode cycles
reg_svm_pes_set_os(&pes, 1); // Count system cycles
reg_svm_pes_set_e(&pes, 0); // Level, not edge
reg_svm_pes_set_pc(&pes, 0);
reg_svm_pes_set_int(&pes, 1); // Trigger interrupt on overflow
reg_svm_pes_set_en(&pes, enabled);
reg_svm_pes_set_inv(&pes, 0); // No invert sense
reg_svm_pes_set_go(&pes, 1); // Count in the guest
reg_svm_pes_set_ho(&pes, 0); // And not in the host...
これらはそれぞれ、PMC レジスタに適切なビットを設定する正しく記述されたインライン関数であり、指定されたコードは MSR のビット 40 と 41 を正常に書き込み、読み取ることができるという私の言葉を受け入れる必要があります。これを確認しました。
私が経験したことは、カウンターがゲストとホストの両方でカウントされることです。これにより、ゲストで何が起こったのかだけを正確に説明することは非常に困難になります。
私の質問は次のとおりです。
- HostOnly および GuestOnly ビットはファミリー 0x10h CPU で動作しますか?
- これが機能するために構成する必要がある他のマシン状態はありますか?
- この CPU のこの機能が機能するのを見たことがありますか?
- ファミリ 0x11h CPU の BKDG にこの機能が存在しない理由を知っている人はいますか? つまり、問題のビットはそのファミリで予約されています。
- ホストにいる間に SVM 実装で PMC をオフにする既知の方法は他にありますか?