diff -urp kvm-test.1/guest.s kvm-test.2/guest.s --- kvm-test.1/guest.s 2021-04-19 23:12:10.000000000 +0200 +++ kvm-test.2/guest.s 2021-04-23 23:27:57.832780453 +0200 @@ -1,4 +1,13 @@ _guest_start: + mov $0xe9, %dx + movb $'H', %al + outb %al, %dx + movb $'i', %al + outb %al, %dx + movb $'!', %al + outb %al, %dx + movb $'\n', %al + outb %al, %dx movq %cr0, %rdx smswl %eax hlt diff -urp kvm-test.1/test.c kvm-test.2/test.c --- kvm-test.1/test.c 2021-04-19 23:12:10.000000000 +0200 +++ kvm-test.2/test.c 2021-04-23 23:26:11.093987426 +0200 @@ -157,6 +157,20 @@ int vm_run(int fd, struct kvm_run *r) printf("EDX: %llx\n", regs.rdx); return 1; + case KVM_EXIT_IO: + if ((r->io.direction == KVM_EXIT_IO_OUT) && (r->io.port == 0xe9)) { + char *p = (char *)r; + + if (r->io.size != 1) { + fprintf(stderr, "Bad I/O of size %d!!!\n", r->io.size); + } else { + printf("%c", *(p + r->io.data_offset)); + fflush(stdout); + } + } else { + fprintf(stderr, "Bad I/O to port %d!!!\n", r->io.port); + } + break; default: fprintf(stderr, "VM Exit reason: %d, expected KVM_EXIT_HLT (%d)\n", r->exit_reason, KVM_EXIT_HLT);