私は現在、KVM を試していて、US (ユーザー空間) I/O を動作させようとしています。現在、出力 (つまりout dx, eax
) は機能し、US コードは書き込まれた値を見ることができますが、入力 ( in eax, dx
) は機能していないようです - VM は US コードによって書き込まれた値を受け取りません。
if (run->io.port == 0xface && run->io.direction == KVM_EXIT_IO_IN)
{
printf("Port 0xface read\n");
*(volatile uint32_t *)((uintptr_t)run + run->io.data_offset) = 0xdeadbeefu;
continue;
}
run
struct kvm_run
以前に編集され、mmap
十分なスペースがある (つまりrun->io.data_offset
、ポインターからの有効なオフセット) へのポインターです。このcontinue
ステートメントにより、最終的に VM が再起動され、コードは正常に続行されます。ただし、VM のrax
レジスタ ( である必要があります0xdeadbeef
) を取得しようとすると、ゼロになります。ドキュメント ( kvm/Documentation/api.txt
) で読んだことから、これが私がすべき方法です。何か不足していますか?
半関連のメモとして、continue
ステートメントの前に を付けるとrun->io.count = run->io.count;
、(変更されていなくても) I/O が再度トリガーさcount
れます。これは予想される動作ですか?または、未定義の動作をトリガーしていますか?