>>> On 03.03.17 at 15:58, <jbeul...@suse.com> wrote:
> @@ -6183,6 +6579,76 @@ x86_emulate(
>          goto cannot_emulate;
>      }
>  
> +    if ( state->simd_size )
> +    {
> +#ifdef __XEN__
> +        uint8_t *buf = stub.ptr;
> +#else
> +        uint8_t *buf = get_stub(stub);
> +#endif
> +
> +        generate_exception_if(!op_bytes, EXC_UD);
> +        generate_exception_if(vex.opcx && (d & TwoOp) && vex.reg != 0xf,
> +                              EXC_UD);
> +
> +        if ( !buf )
> +            BUG();
> +        if ( vex.opcx == vex_none )
> +            SET_SSE_PREFIX(buf[0], vex.pfx);
> +
> +        buf[fic.insn_bytes] = 0xc3;
> +        copy_REX_VEX(buf, rex_prefix, vex);
> +
> +        if ( ea.type == OP_MEM )
> +        {
> +            uint32_t mxcsr = 0;
> +
> +            if ( op_bytes < 16 ||
> +                 (vex.opcx
> +                  ? /* vmov{a,nt}p{s,d} are exceptions. */
> +                    ext != ext_0f || ((b | 1) != 0x29 && b != 0x2b)
> +                  : /* movup{s,d} and lddqu are exceptions. */
> +                    ext == ext_0f && ((b | 1) == 0x11 || b == 0xf0)) )
> +                mxcsr = MXCSR_MM;
> +            else if ( vcpu_has_misalignsse() )
> +                asm ( "stmxcsr %0" : "=m" (mxcsr) );
> +            generate_exception_if(!(mxcsr & MXCSR_MM) &&
> +                                  !is_aligned(ea.mem.seg, ea.mem.off, 
> op_bytes,
> +                                              ctxt, ops),
> +                                  EXC_GP, 0);
> +            if ( (d & SrcMask) == SrcMem )
> +            {
> +                rc = ops->read(ea.mem.seg, ea.mem.off, mmvalp, op_bytes, 
> ctxt);
> +                if ( rc != X86EMUL_OKAY )
> +                    goto done;
> +                dst.type = OP_NONE;
> +            }
> +            else if ( (d & DstMask) == DstMem )
> +            {
> +                fail_if(!ops->write); /* Check before running the stub. */
> +                ASSERT(d & Mov);
> +                dst.type = OP_MEM;
> +                dst.bytes = op_bytes;
> +                dst.mem = ea.mem;
> +            }
> +            else if ( (d & SrcMask) == SrcMem16 )
> +                dst.type = OP_NONE;
> +            else
> +            {
> +                ASSERT_UNREACHABLE();
> +                return X86EMUL_UNHANDLEABLE;

I've changed this to "goto cannot_emulate" to be on the safe side
on production builds (to avoid bypassing put_fpu() / put_stub()).

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

Reply via email to