vmx real mode emulated mmio?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I don't really know what I'm doing messing around with realmode
exception handling, but are we missing something like this:

--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -4332,7 +4332,8 @@ static int handle_exception(struct kvm_vcpu *vcpu)
                if (vcpu->arch.halt_request) {
                        vcpu->arch.halt_request = 0;
                        return kvm_emulate_halt(vcpu);
-               }
+               } else if (vcpu->mmio_needed)
+                       return 0;
                return 1;
        }
 

The background is that I was playing around with when the MMIO regions
of PCI assigned devices get direct mapped through KVM and start using
memory slots and I found that the boot ROM on an e1000e card that I
often use for testing causes the VM to hang when not directly mapped
through a memory slot.  This happens with both pci-assign and vfio-pci.
Debugging further, I see the kernel instruction emulator decodes this
and sets all the necessary flags and fragments for userspace to complete
the access, but since it happened in real mode, vcpu_enter_guest always
returns 1 and therefore KVM_RUN never exits to userspace and KVM gets
stuck in an infinite loop re-handling this instruction.

The above is pretty trivial and allows the ROM to work again.  Is it
correct?  What other exceptions are we missing here that should allow an
exit?  This particular access generated a GP_VECTOR exception if we want
to key on that somewhere.  Thanks,

Alex

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux