On 11/05/2017 14:40, Miltiadis Hatzimihail wrote: > Thanks Paolo that worked! > > Btw, this line > > > + 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, > + N, N, N, N, N, N, > > I think it has 2 extra Ns (not removed from your change?).
Oops, you're right. > Those instructions were not implemented for a reason or is it simply a > chance of never seeing this issue that I saw? Never seeing this issue. >>> 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 for my benefit, does this mean that any RAM transaction is emulated > by QEMU or does it go through KVM to the bare metal? (and hence, KVM is > not emulating this?) The latter. The don't get any emulation. Paolo > > Milton > > > On Thu, May 11, 2017 at 12:51 PM, Paolo Bonzini <pbonz...@redhat.com > <mailto:pbonz...@redhat.com>> wrote: > > > > 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 > >