Intel VT ベースのデバッガーを作成しています。
NMI-Exiting=1 の間、vmx-guest の iret 命令のパフォーマンスが変更されるため。したがって、vmx-host で NMI を自分で処理する必要があります。そうしないと、ゲストに nmi 再入可能バグが発生します。
Intelのマニュアルを確認しました:
NMI 割り込みハンドラの実行中、プロセッサは、次の IRET 命令が実行されるまで、NMI ハンドラへの追加の呼び出しを無効にします。後続の NMI をこのようにブロックすることで、NMI ハンドラへの呼び出しがスタックするのを防ぎます。
そのため、vmx-host で iret を自分でシミュレートしようとしています。CPL は ring0 のままで、スタックとコード セグメントは変更されません。
以下にサンプル コードを記述します。これは、NMI によって引き起こされた vmx-exit の後でした。
asm volatile(
"pushfq \n\t"
"mov %%cs.%%ax \n\t"
"push %%rax\n\t"
"mov $._restart_code,%%rax \n\t"
"push %%rax \n\t"
"iret \n\t"/*manully iret in the host before vmx-entry.*/
"._restart_code:"
"nop":);
誰でもいくつかのガイドを表示できますか?