An Ubuntu 9.10 Karmic Koala guest is unable to boot or install due to
missing movdqa emulation:

kvm_exit: reason EXCEPTION_NMI rip 0x7fef3e025a7b info 7fef3e799000 80000b0e
kvm_page_fault: address 7fef3e799000 error_code f
kvm_emulate_insn: 0:7fef3e025a7b: 66 0f 7f 07 (prot64)

movdqa %xmm0,(%rdi)

This patch adds movdqa to the emulator but does not implement #GP when
the memory operand is unaligned to 16 bytes.  I'm not sure whether
alignment checking can be implemented as an opcode .flag or if it needs
to be done in em_movdqa().

A more fundamental question: why do we have to emulate this guest
userspace SSE instruction in the first place?  This host machine lacks
EPT but can't we service the page fault and then retry execution inside
the guest?

Signed-off-by: Stefan Hajnoczi <[email protected]>
---
 arch/x86/kvm/emulate.c |    9 ++++++++-
 1 files changed, 8 insertions(+), 1 deletions(-)

diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 8547958..0424569 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -2653,6 +2653,13 @@ static int em_mov_sreg_rm(struct x86_emulate_ctxt *ctxt)
        return load_segment_descriptor(ctxt, sel, ctxt->modrm_reg);
 }
 
+static int em_movdqa(struct x86_emulate_ctxt *ctxt)
+{
+       /* TODO alignment */
+       memcpy(&ctxt->dst.vec_val, &ctxt->src.vec_val, ctxt->op_bytes);
+       return X86EMUL_CONTINUE;
+}
+
 static int em_movdqu(struct x86_emulate_ctxt *ctxt)
 {
        memcpy(&ctxt->dst.vec_val, &ctxt->src.vec_val, ctxt->op_bytes);
@@ -3115,7 +3122,7 @@ static struct opcode group11[] = {
 };
 
 static struct gprefix pfx_0f_6f_0f_7f = {
-       N, N, N, I(Sse, em_movdqu),
+       N, I(Sse, em_movdqa), N, I(Sse, em_movdqu),
 };
 
 static struct opcode opcode_table[256] = {
-- 
1.7.7.3

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