On 11/05/2017 09:00, Miltiadis Hatzimihail wrote: > > The interesting thing is that in the ram case the test is passing, but in > the io is failing. Also, if I try this without KVM, it passes in both cases.
Yes, in the RAM case KVM is not invoked at all. > So I ve done some reading and for the 2 cases above I get: > > - KVM_EXIT_MMIO on memory_region_init_io (KVM attempts and fails to > emulate MOVSS), > - KVM_EXIT_EXCEPTION on memory_region_init_ram(QEMU emulates MOVSS) No, you don't get any exit for memory_region_init_ram. > Is that right? > > Now the question is, if I want to use the IO instead of a RAM, what's the > best way to solve this? Please try this KVM patch: diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index c25cfaf584e7..53fbd1589d2e 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c @@ -3534,6 +3534,22 @@ static int em_rdpmc(struct x86_emulate_ctxt *ctxt) return X86EMUL_CONTINUE; } +static int em_movss(struct x86_emulate_ctxt *ctxt) +{ + memcpy(ctxt->dst.valptr, ctxt->src.valptr, 4); + ctxt->op_bytes = 4; + ctxt->dst.bytes = 4; + return X86EMUL_CONTINUE; +} + +static int em_movsd(struct x86_emulate_ctxt *ctxt) +{ + memcpy(ctxt->dst.valptr, ctxt->src.valptr, 8); + ctxt->op_bytes = 8; + ctxt->dst.bytes = 8; + return X86EMUL_CONTINUE; +} + static int em_mov(struct x86_emulate_ctxt *ctxt) { memcpy(ctxt->dst.valptr, ctxt->src.valptr, sizeof(ctxt->src.valptr)); @@ -4407,6 +4423,11 @@ static int check_perm_out(struct x86_emulate_ctxt *ctxt) I(Mmx, em_mov), I(Sse | Aligned, em_mov), N, I(Sse | Unaligned, em_mov), }; +static const struct gprefix pfx_0f_10_0f_11 = { + I(Sse | Unaligned, em_mov), I(Sse | Unaligned, em_mov), + I(Sse, em_movsd), I(Sse, em_movss), +}; + static const struct instr_dual instr_dual_0f_2b = { I(0, em_mov), N }; @@ -4626,6 +4647,8 @@ static int check_perm_out(struct x86_emulate_ctxt *ctxt) DI(ImplicitOps | Priv, invd), DI(ImplicitOps | Priv, wbinvd), N, N, N, D(ImplicitOps | ModRM | SrcMem | NoAccess), N, N, /* 0x10 - 0x1F */ + GP(SrcMem | DstReg | ModRM | Mov, &pfx_0f_10_0f_11), + GP(SrcReg | DstMem | ModRM | Mov, &pfx_0f_10_0f_11), N, N, N, N, N, N, N, N, D(ImplicitOps | ModRM | SrcMem | NoAccess), N, N, N, N, N, N, D(ImplicitOps | ModRM | SrcMem | NoAccess), Thanks, Paolo