From: Mihai Donțu <mdontu@xxxxxxxxxxxxxxx> This extends the previous xorpd by creating a dedicated group, something I should have done since the very beginning. Signed-off-by: Mihai Donțu <mdontu@xxxxxxxxxxxxxxx> Signed-off-by: Adalbert Lazăr <alazar@xxxxxxxxxxxxxxx> --- arch/x86/kvm/emulate.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 28aac552b34b..14895c043edc 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c @@ -1178,6 +1178,22 @@ static int em_fnstsw(struct x86_emulate_ctxt *ctxt) return X86EMUL_CONTINUE; } +static int em_xorps(struct x86_emulate_ctxt *ctxt) +{ + const sse128_t *src = &ctxt->src.vec_val; + sse128_t *dst = &ctxt->dst.vec_val; + sse128_t xmm0; + + asm volatile("movdqu %%xmm0, %0\n" + "movdqu %1, %%xmm0\n" + "xorps %2, %%xmm0\n" + "movdqu %%xmm0, %1\n" + "movdqu %0, %%xmm0" + : "+m"(xmm0), "+m"(*dst) : "m"(*src)); + + return X86EMUL_CONTINUE; +} + static int em_xorpd(struct x86_emulate_ctxt *ctxt) { const sse128_t *src = &ctxt->src.vec_val; @@ -4615,6 +4631,10 @@ static const struct gprefix pfx_0f_e7 = { N, I(Sse, em_mov), N, N, }; +static const struct gprefix pfx_0f_57 = { + I(Unaligned, em_xorps), I(Unaligned, em_xorpd), N, N +}; + static const struct escape escape_d9 = { { N, N, N, N, N, N, N, I(DstMem16 | Mov, em_fnstcw), }, { @@ -4847,7 +4867,7 @@ static const struct opcode twobyte_table[256] = { /* 0x40 - 0x4F */ X16(D(DstReg | SrcMem | ModRM)), /* 0x50 - 0x5F */ - N, N, N, N, N, N, N, I(SrcMem | DstReg | ModRM | Unaligned | Sse, em_xorpd), + N, N, N, N, N, N, N, GP(SrcMem | DstReg | ModRM | Sse, &pfx_0f_57), N, N, N, N, N, N, N, N, /* 0x60 - 0x6F */ N, N, N, N,