* [PATCH] KVM: x86 emulator: emulate MOVNTDQ
@ 2014-07-11 17:56 Alex Williamson
2014-07-11 19:31 ` Eric Northup
2014-08-29 12:55 ` Paolo Bonzini
0 siblings, 2 replies; 6+ messages in thread
From: Alex Williamson @ 2014-07-11 17:56 UTC (permalink / raw)
To: kvm; +Cc: linux-kernel, Alex Williamson, Paolo Bonzini
Windows 8.1 guest with NVIDIA driver and GPU fails to boot with an
emulation failure. The KVM spew suggests the fault is with lack of
movntdq emulation (courtesy of Paolo):
Code=02 00 00 b8 08 00 00 00 f3 0f 6f 44 0a f0 f3 0f 6f 4c 0a e0 <66> 0f e7 41 f0 66 0f e7 49 e0 48 83 e9 40 f3 0f 6f 44 0a 10 f3 0f 6f 0c 0a 66 0f e7 41 10
$ as -o a.out
.section .text
.byte 0x66, 0x0f, 0xe7, 0x41, 0xf0
.byte 0x66, 0x0f, 0xe7, 0x49, 0xe0
$ objdump -d a.out
0: 66 0f e7 41 f0 movntdq %xmm0,-0x10(%rcx)
5: 66 0f e7 49 e0 movntdq %xmm1,-0x20(%rcx)
Add the necessary emulation.
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
---
Hope I got all the flags correct from copying similar MOV ops, but it
allows the guest to boot, so I suspect it's ok.
arch/x86/kvm/emulate.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index e4e833d..ae39f08 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -3681,6 +3681,10 @@ static const struct gprefix pfx_0f_28_0f_29 = {
I(Aligned, em_mov), I(Aligned, em_mov), N, N,
};
+static const struct gprefix pfx_0f_e7 = {
+ N, I(Sse, em_mov), N, N,
+};
+
static const struct escape escape_d9 = { {
N, N, N, N, N, N, N, I(DstMem, em_fnstcw),
}, {
@@ -3951,7 +3955,8 @@ static const struct opcode twobyte_table[256] = {
/* 0xD0 - 0xDF */
N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N,
/* 0xE0 - 0xEF */
- N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N,
+ N, N, N, N, N, N, N, GP(SrcReg | DstMem | ModRM | Mov, &pfx_0f_e7),
+ N, N, N, N, N, N, N, N,
/* 0xF0 - 0xFF */
N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N
};
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH] KVM: x86 emulator: emulate MOVNTDQ 2014-07-11 17:56 [PATCH] KVM: x86 emulator: emulate MOVNTDQ Alex Williamson @ 2014-07-11 19:31 ` Eric Northup 2014-07-11 20:05 ` Alex Williamson 2014-08-29 12:55 ` Paolo Bonzini 1 sibling, 1 reply; 6+ messages in thread From: Eric Northup @ 2014-07-11 19:31 UTC (permalink / raw) To: Alex Williamson; +Cc: KVM, Linux Kernel Mailing List, Paolo Bonzini On Fri, Jul 11, 2014 at 10:56 AM, Alex Williamson <alex.williamson@redhat.com> wrote: > Windows 8.1 guest with NVIDIA driver and GPU fails to boot with an > emulation failure. The KVM spew suggests the fault is with lack of > movntdq emulation (courtesy of Paolo): > > Code=02 00 00 b8 08 00 00 00 f3 0f 6f 44 0a f0 f3 0f 6f 4c 0a e0 <66> 0f e7 41 f0 66 0f e7 49 e0 48 83 e9 40 f3 0f 6f 44 0a 10 f3 0f 6f 0c 0a 66 0f e7 41 10 > > $ as -o a.out > .section .text > .byte 0x66, 0x0f, 0xe7, 0x41, 0xf0 > .byte 0x66, 0x0f, 0xe7, 0x49, 0xe0 > $ objdump -d a.out > 0: 66 0f e7 41 f0 movntdq %xmm0,-0x10(%rcx) > 5: 66 0f e7 49 e0 movntdq %xmm1,-0x20(%rcx) > > Add the necessary emulation. > > Signed-off-by: Alex Williamson <alex.williamson@redhat.com> > Cc: Paolo Bonzini <pbonzini@redhat.com> > --- > > Hope I got all the flags correct from copying similar MOV ops, but it > allows the guest to boot, so I suspect it's ok. > > arch/x86/kvm/emulate.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c > index e4e833d..ae39f08 100644 > --- a/arch/x86/kvm/emulate.c > +++ b/arch/x86/kvm/emulate.c > @@ -3681,6 +3681,10 @@ static const struct gprefix pfx_0f_28_0f_29 = { > I(Aligned, em_mov), I(Aligned, em_mov), N, N, > }; > > +static const struct gprefix pfx_0f_e7 = { > + N, I(Sse, em_mov), N, N, I think you need 'Aligned' flag in here - from my reading of the manual, this instruction will #GP if the memory operand isn't aligned. > +}; > + > static const struct escape escape_d9 = { { > N, N, N, N, N, N, N, I(DstMem, em_fnstcw), > }, { > @@ -3951,7 +3955,8 @@ static const struct opcode twobyte_table[256] = { > /* 0xD0 - 0xDF */ > N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, > /* 0xE0 - 0xEF */ > - N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, > + N, N, N, N, N, N, N, GP(SrcReg | DstMem | ModRM | Mov, &pfx_0f_e7), > + N, N, N, N, N, N, N, N, > /* 0xF0 - 0xFF */ > N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N > }; > > -- > To unsubscribe from this list: send the line "unsubscribe kvm" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] KVM: x86 emulator: emulate MOVNTDQ 2014-07-11 19:31 ` Eric Northup @ 2014-07-11 20:05 ` Alex Williamson 2014-07-11 20:40 ` Paolo Bonzini 0 siblings, 1 reply; 6+ messages in thread From: Alex Williamson @ 2014-07-11 20:05 UTC (permalink / raw) To: Eric Northup; +Cc: KVM, Linux Kernel Mailing List, Paolo Bonzini On Fri, 2014-07-11 at 12:31 -0700, Eric Northup wrote: > On Fri, Jul 11, 2014 at 10:56 AM, Alex Williamson > <alex.williamson@redhat.com> wrote: > > Windows 8.1 guest with NVIDIA driver and GPU fails to boot with an > > emulation failure. The KVM spew suggests the fault is with lack of > > movntdq emulation (courtesy of Paolo): > > > > Code=02 00 00 b8 08 00 00 00 f3 0f 6f 44 0a f0 f3 0f 6f 4c 0a e0 <66> 0f e7 41 f0 66 0f e7 49 e0 48 83 e9 40 f3 0f 6f 44 0a 10 f3 0f 6f 0c 0a 66 0f e7 41 10 > > > > $ as -o a.out > > .section .text > > .byte 0x66, 0x0f, 0xe7, 0x41, 0xf0 > > .byte 0x66, 0x0f, 0xe7, 0x49, 0xe0 > > $ objdump -d a.out > > 0: 66 0f e7 41 f0 movntdq %xmm0,-0x10(%rcx) > > 5: 66 0f e7 49 e0 movntdq %xmm1,-0x20(%rcx) > > > > Add the necessary emulation. > > > > Signed-off-by: Alex Williamson <alex.williamson@redhat.com> > > Cc: Paolo Bonzini <pbonzini@redhat.com> > > --- > > > > Hope I got all the flags correct from copying similar MOV ops, but it > > allows the guest to boot, so I suspect it's ok. > > > > arch/x86/kvm/emulate.c | 7 ++++++- > > 1 file changed, 6 insertions(+), 1 deletion(-) > > > > diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c > > index e4e833d..ae39f08 100644 > > --- a/arch/x86/kvm/emulate.c > > +++ b/arch/x86/kvm/emulate.c > > @@ -3681,6 +3681,10 @@ static const struct gprefix pfx_0f_28_0f_29 = { > > I(Aligned, em_mov), I(Aligned, em_mov), N, N, > > }; > > > > +static const struct gprefix pfx_0f_e7 = { > > + N, I(Sse, em_mov), N, N, > > I think you need 'Aligned' flag in here - from my reading of the > manual, this instruction will #GP if the memory operand isn't aligned. Hi Eric, It seemed like this would be handled by default, see commit 1c11b376: x86 defines three classes of vector instructions: explicitly aligned (#GP(0) if unaligned, explicitly unaligned, and default (which depends on the encoding: AVX is unaligned, SSE is aligned). So SSE should imply aligned. We also have: /* * x86 defines three classes of vector instructions: explicitly * aligned, explicitly unaligned, and the rest, which change behaviour * depending on whether they're AVX encoded or not. * * Also included is CMPXCHG16B which is not a vector instruction, yet it is * subject to the same check. */ static bool insn_aligned(struct x86_emulate_ctxt *ctxt, unsigned size) { if (likely(size < 16)) return false; if (ctxt->d & Aligned) return true; else if (ctxt->d & Unaligned) return false; else if (ctxt->d & Avx) return false; else return true; } Which will return 'true' for this whether I specify Aligned or not. If the standard convention is to make it explicit, I'm happy to add the extra flag, but I think we already #GP on unaligned as implemented here. Thanks, Alex > > +}; > > + > > static const struct escape escape_d9 = { { > > N, N, N, N, N, N, N, I(DstMem, em_fnstcw), > > }, { > > @@ -3951,7 +3955,8 @@ static const struct opcode twobyte_table[256] = { > > /* 0xD0 - 0xDF */ > > N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, > > /* 0xE0 - 0xEF */ > > - N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, > > + N, N, N, N, N, N, N, GP(SrcReg | DstMem | ModRM | Mov, &pfx_0f_e7), > > + N, N, N, N, N, N, N, N, > > /* 0xF0 - 0xFF */ > > N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N > > }; > > > > -- > > To unsubscribe from this list: send the line "unsubscribe kvm" in > > the body of a message to majordomo@vger.kernel.org > > More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] KVM: x86 emulator: emulate MOVNTDQ 2014-07-11 20:05 ` Alex Williamson @ 2014-07-11 20:40 ` Paolo Bonzini 2014-07-13 16:12 ` Avi Kivity 0 siblings, 1 reply; 6+ messages in thread From: Paolo Bonzini @ 2014-07-11 20:40 UTC (permalink / raw) To: Alex Williamson, Eric Northup; +Cc: KVM, Linux Kernel Mailing List Il 11/07/2014 22:05, Alex Williamson ha scritto: > Which will return 'true' for this whether I specify Aligned or not. If > the standard convention is to make it explicit, I'm happy to add the > extra flag, but I think we already #GP on unaligned as implemented here. > Thanks, We should still specify Aligned if the corresponding AVX instruction requires an aligned operand. ISTR that this is not the case for MOVNTDQ, so your patch is correct. I'll check the SDM more carefully next Monday. Paolo ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] KVM: x86 emulator: emulate MOVNTDQ 2014-07-11 20:40 ` Paolo Bonzini @ 2014-07-13 16:12 ` Avi Kivity 0 siblings, 0 replies; 6+ messages in thread From: Avi Kivity @ 2014-07-13 16:12 UTC (permalink / raw) To: Paolo Bonzini, Alex Williamson, Eric Northup Cc: KVM, Linux Kernel Mailing List On 07/11/2014 11:40 PM, Paolo Bonzini wrote: > Il 11/07/2014 22:05, Alex Williamson ha scritto: >> Which will return 'true' for this whether I specify Aligned or not. If >> the standard convention is to make it explicit, I'm happy to add the >> extra flag, but I think we already #GP on unaligned as implemented here. >> Thanks, > > We should still specify Aligned if the corresponding AVX instruction > requires an aligned operand. ISTR that this is not the case for > MOVNTDQ, so your patch is correct. I'll check the SDM more carefully > next Monday. > The explicitly aligned/unaligned instructions have an A or a U to indicate this (e.g. MOVDQU = explicitly unaligned, MOVDQA = explicitly aligned, MOVNTDQ = default). ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] KVM: x86 emulator: emulate MOVNTDQ 2014-07-11 17:56 [PATCH] KVM: x86 emulator: emulate MOVNTDQ Alex Williamson 2014-07-11 19:31 ` Eric Northup @ 2014-08-29 12:55 ` Paolo Bonzini 1 sibling, 0 replies; 6+ messages in thread From: Paolo Bonzini @ 2014-08-29 12:55 UTC (permalink / raw) To: Alex Williamson, kvm; +Cc: linux-kernel Il 11/07/2014 19:56, Alex Williamson ha scritto: > Windows 8.1 guest with NVIDIA driver and GPU fails to boot with an > emulation failure. The KVM spew suggests the fault is with lack of > movntdq emulation (courtesy of Paolo): > > Code=02 00 00 b8 08 00 00 00 f3 0f 6f 44 0a f0 f3 0f 6f 4c 0a e0 <66> 0f e7 41 f0 66 0f e7 49 e0 48 83 e9 40 f3 0f 6f 44 0a 10 f3 0f 6f 0c 0a 66 0f e7 41 10 > > $ as -o a.out > .section .text > .byte 0x66, 0x0f, 0xe7, 0x41, 0xf0 > .byte 0x66, 0x0f, 0xe7, 0x49, 0xe0 > $ objdump -d a.out > 0: 66 0f e7 41 f0 movntdq %xmm0,-0x10(%rcx) > 5: 66 0f e7 49 e0 movntdq %xmm1,-0x20(%rcx) > > Add the necessary emulation. > > Signed-off-by: Alex Williamson <alex.williamson@redhat.com> > Cc: Paolo Bonzini <pbonzini@redhat.com> > --- > > Hope I got all the flags correct from copying similar MOV ops, but it > allows the guest to boot, so I suspect it's ok. > > arch/x86/kvm/emulate.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c > index e4e833d..ae39f08 100644 > --- a/arch/x86/kvm/emulate.c > +++ b/arch/x86/kvm/emulate.c > @@ -3681,6 +3681,10 @@ static const struct gprefix pfx_0f_28_0f_29 = { > I(Aligned, em_mov), I(Aligned, em_mov), N, N, > }; > > +static const struct gprefix pfx_0f_e7 = { > + N, I(Sse, em_mov), N, N, > +}; > + > static const struct escape escape_d9 = { { > N, N, N, N, N, N, N, I(DstMem, em_fnstcw), > }, { > @@ -3951,7 +3955,8 @@ static const struct opcode twobyte_table[256] = { > /* 0xD0 - 0xDF */ > N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, > /* 0xE0 - 0xEF */ > - N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, > + N, N, N, N, N, N, N, GP(SrcReg | DstMem | ModRM | Mov, &pfx_0f_e7), > + N, N, N, N, N, N, N, N, > /* 0xF0 - 0xFF */ > N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N > }; > This slipped through the cracks, I'm applying to kvm/queue now. Paolo ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2014-08-29 12:55 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-07-11 17:56 [PATCH] KVM: x86 emulator: emulate MOVNTDQ Alex Williamson 2014-07-11 19:31 ` Eric Northup 2014-07-11 20:05 ` Alex Williamson 2014-07-11 20:40 ` Paolo Bonzini 2014-07-13 16:12 ` Avi Kivity 2014-08-29 12:55 ` Paolo Bonzini
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).