0

私は現在、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;
}

runstruct 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れます。これは予想される動作ですか?または、未定義の動作をトリガーしていますか?

4

1 に答える 1