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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to