wrong placement of RIP-relative address computing

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

 



Avi,
I met a wrong address from instruction emulation, and it corrupted
guest page table silently.  seems it's caused by eip which has not
reached next instruction.  In my case, eip was pointing to immediate
data of current instruction.

I used below patch to fix it, but I didn't further check other logic.  Can
you please take a look?

Thanks!
-Xin


diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 6df88c7..e269d20 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -3547,9 +3547,6 @@ done_prefixes:
        if (memop.type == OP_MEM && c->ad_bytes != 8)
                memop.addr.mem.ea = (u32)memop.addr.mem.ea;

-       if (memop.type == OP_MEM && c->rip_relative)
-               memop.addr.mem.ea += c->eip;
-
        /*
         * Decode and fetch the source operand: register, memory
         * or immediate.
@@ -3704,6 +3701,9 @@ done_prefixes:
        }

 done:
+       if (memop.type == OP_MEM && c->rip_relative)
+               memop.addr.mem.ea += c->eip;
+
        return (rc == X86EMUL_UNHANDLEABLE) ? EMULATION_FAILED : EMULATION_OK;
 }

--
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