VcpuExit::IoIn(port, data) and VcpuExit::IoOut(port, data) flatten kvm_run.io.size * kvm_run.io.count into a single &[u8] of length size * count. Once the variant is constructed, the per-iteration io.size is no longer recoverable from the variant — only the product is. This makes it impossible for downstream VMMs to dispatch repeated PIO accesses (rep ins/outs, string IO) the way QEMU does, where each iteration is a single bus transaction at the same port with io.size bytes.
We need to break the API and change VcpuExit:IoIn/Out to embed the size
VcpuExit::IoIn(port, data)andVcpuExit::IoOut(port, data)flattenkvm_run.io.size * kvm_run.io.countinto a single&[u8]of lengthsize * count. Once the variant is constructed, the per-iterationio.sizeis no longer recoverable from the variant — only the product is. This makes it impossible for downstream VMMs to dispatch repeated PIO accesses (rep ins/outs, string IO) the way QEMU does, where each iteration is a single bus transaction at the same port withio.sizebytes.We need to break the API and change
VcpuExit:IoIn/Outto embed the size