That's great thanks for the clarification. Is this patch going to make it to the mainline at some point?
Miltiadis Hatzimihail On Thu, May 11, 2017 at 1:44 PM, Paolo Bonzini <pbonz...@redhat.com> wrote: > > > 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 > > > > >