В настоящее время я экспериментирую с KVM и пытаюсь запустить работу ввода/вывода US (userpace). В настоящее время работает вывод (т. Е. out dx, eax
), и код США может видеть записанное значение, но вход (in eax, dx
), похоже, не работает - виртуальная машина не получает значение, написанное кодом США.KVM Userpace Port I/O
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 rax
(который должен быть 0xdeadbeef
), я получаю нуль. Из того, что я читал в документах (kvm/Documentation/api.txt
), я должен это делать. Я что-то упускаю?
В случае, когда я предшествую оператору continue
с run->io.count = run->io.count;
, ввод/вывод запускается снова (хотя count
не изменяется). Это ожидаемое поведение? Или я запускаю неопределенное поведение?