All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew Cooper <andrew.cooper3@citrix.com>
To: Jan Beulich <JBeulich@suse.com>,
	xen-devel <xen-devel@lists.xenproject.org>
Subject: Re: [PATCH v4 01/17] x86emul: support most memory accessing MMX/SSE{, 2, 3} insns
Date: Wed, 1 Mar 2017 13:17:17 +0000	[thread overview]
Message-ID: <7e83a504-c35f-bada-46fb-be229c9735da@citrix.com> (raw)
In-Reply-To: <58B57FFD020000780013E29C@prv-mh.provo.novell.com>

On 28/02/17 12:49, Jan Beulich wrote:
> e 0x0f-escape
> space with memory operands. Not covered here are irregular moves,
> converts, and {,U}COMIS{S,D} (modifying EFLAGS).

Your email has text corruption in this paragraph, but the patch itself
looks ok.

> --- a/xen/arch/x86/x86_emulate/x86_emulate.c
> +++ b/xen/arch/x86/x86_emulate/x86_emulate.c
> @@ -2602,13 +2698,53 @@ x86_decode(
>          ea.mem.off = truncate_ea(ea.mem.off);
>      }
>  
> -    /*
> -     * When prefix 66 has a meaning different from operand-size override,
> -     * operand size defaults to 4 and can't be overridden to 2.
> -     */
> -    if ( op_bytes == 2 &&
> -         (ctxt->opcode & X86EMUL_OPC_PFX_MASK) == X86EMUL_OPC_66(0, 0) )
> -        op_bytes = 4;

Can we have a comment here along the lines of:

"Simple op_bytes calculations.  More complicated cases use 0 and are
further decoded during execute." ?

> +    switch ( state->simd_size )
> +    {
> +    case simd_none:
> +        /*
> +         * When prefix 66 has a meaning different from operand-size override,
> +         * operand size defaults to 4 and can't be overridden to 2.
> +         */
> +        if ( op_bytes == 2 &&
> +             (ctxt->opcode & X86EMUL_OPC_PFX_MASK) == X86EMUL_OPC_66(0, 0) )
> +            op_bytes = 4;
> +        break;
> +
> +    case simd_packed_int:
> +        switch ( vex.pfx )
> +        {
> +        case vex_none: op_bytes = 8;           break;
> +        case vex_66:   op_bytes = 16 << vex.l; break;
> +        default:       op_bytes = 0;           break;
> +        }
> +        break;
> +
> +    case simd_single_fp:
> +        if ( vex.pfx & VEX_PREFIX_DOUBLE_MASK )
> +        {
> +            op_bytes = 0;
> +            break;
> +    case simd_packed_fp:
> +            if ( vex.pfx & VEX_PREFIX_SCALAR_MASK )
> +            {
> +                op_bytes = 0;
> +                break;
> +            }
> +        }
> +        /* fall through */
> +    case simd_any_fp:
> +        switch ( vex.pfx )
> +        {
> +        default:     op_bytes = 16 << vex.l; break;
> +        case vex_f3: op_bytes = 4;           break;
> +        case vex_f2: op_bytes = 8;           break;
> +        }
> +        break;
> +
> +    default:
> +        op_bytes = 0;
> +        break;
> +    }
>  
>   done:
>      return rc;
> @@ -5413,6 +5671,81 @@ x86_emulate(
>          break;
>      }
>  
> +    CASE_SIMD_PACKED_INT(0x0f, 0x70):    /* pshuf{w,d} $imm8,{,x}mm/mem,{,x}mm */
> +    case X86EMUL_OPC_VEX_66(0x0f, 0x70): /* vpshufd $imm8,{x,y}mm/mem,{x,y}mm */
> +    case X86EMUL_OPC_F3(0x0f, 0x70):     /* pshufhw $imm8,xmm/m128,xmm */
> +    case X86EMUL_OPC_VEX_F3(0x0f, 0x70): /* vpshufhw $imm8,{x,y}mm/mem,{x,y}mm */
> +    case X86EMUL_OPC_F2(0x0f, 0x70):     /* pshuflw $imm8,xmm/m128,xmm */
> +    case X86EMUL_OPC_VEX_F2(0x0f, 0x70): /* vpshuflw $imm8,{x,y}mm/mem,{x,y}mm */
> +        d = (d & ~SrcMask) | SrcMem | TwoOp;
> +        op_bytes = vex.pfx ? 16 << vex.l : 8;
> +    simd_0f_int_imm8:
> +        if ( vex.opcx != vex_none )
> +        {
> +            if ( vex.l )
> +                host_and_vcpu_must_have(avx2);
> +            else
> +            {
> +    simd_0f_imm8_avx:
> +                host_and_vcpu_must_have(avx);
> +            }
> +            get_fpu(X86EMUL_FPU_ymm, &fic);
> +        }
> +        else if ( vex.pfx )
> +        {
> +    simd_0f_imm8_sse2:
> +            vcpu_must_have(sse2);
> +            get_fpu(X86EMUL_FPU_xmm, &fic);
> +        }
> +        else
> +        {
> +            host_and_vcpu_must_have(mmx);
> +            vcpu_must_have(sse);
> +            get_fpu(X86EMUL_FPU_mmx, &fic);
> +        }
> +    simd_0f_imm8:
> +    {
> +        uint8_t *buf = get_stub(stub);
> +
> +        buf[0] = 0x3e;
> +        buf[1] = 0x3e;
> +        buf[2] = 0x0f;
> +        buf[3] = b;
> +        buf[4] = modrm;
> +        if ( ea.type == OP_MEM )
> +        {
> +            /* Convert memory operand to (%rAX). */
> +            rex_prefix &= ~REX_B;
> +            vex.b = 1;
> +            buf[4] &= 0x38;
> +        }
> +        buf[5] = imm1;
> +        fic.insn_bytes = 6;

What is the expectation with setting up the ret in the stub or not? 
This seems rather inconsistent at the moment.

> @@ -6159,6 +6551,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

Is this stale?  Everywhere else is just get_stub() without any ifdefary.

~Andrew

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

  reply	other threads:[~2017-03-01 13:17 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-28 12:42 [PATCH v4 00/17] x86emul: MMX/SSEn support Jan Beulich
2017-02-28 12:49 ` [PATCH v4 01/17] x86emul: support most memory accessing MMX/SSE{, 2, 3} insns Jan Beulich
2017-03-01 13:17   ` Andrew Cooper [this message]
2017-03-01 13:50     ` Jan Beulich
2017-03-01 18:08       ` Andrew Cooper
2017-02-28 12:50 ` [PATCH v4 02/17] x86emul: support MMX/SSE{,2,3} moves Jan Beulich
2017-03-01 13:59   ` [PATCH v4 02/17] x86emul: support MMX/SSE{, 2, 3} moves Andrew Cooper
2017-03-01 14:19     ` Jan Beulich
2017-03-01 19:56       ` Andrew Cooper
2017-03-02  8:07         ` Jan Beulich
2017-02-28 12:51 ` [PATCH v4 03/17] x86emul: support MMX/SSE/SSE2 converts Jan Beulich
2017-03-01 14:09   ` Andrew Cooper
2017-02-28 12:51 ` [PATCH v4 04/17] x86emul: support {,V}{,U}COMIS{S,D} Jan Beulich
2017-03-01 14:16   ` [PATCH v4 04/17] x86emul: support {, V}{, U}COMIS{S, D} Andrew Cooper
2017-03-01 14:26     ` Jan Beulich
2017-03-01 14:31       ` Andrew Cooper
2017-02-28 12:52 ` [PATCH v4 05/17] x86emul: support MMX/SSE{, 2, 4a} insns with only register operands Jan Beulich
2017-03-01 14:36   ` Andrew Cooper
2017-03-01 14:43     ` Jan Beulich
2017-03-01 20:01       ` Andrew Cooper
2017-02-28 12:52 ` [PATCH v4 06/17] x86emul: support {,V}{LD,ST}MXCSR Jan Beulich
2017-03-01 14:57   ` Andrew Cooper
2017-02-28 12:53 ` [PATCH v4 07/17] x86emul: support {,V}MOVNTDQA Jan Beulich
2017-03-01 14:58   ` Andrew Cooper
2017-02-28 12:53 ` [PATCH v4 08/17] x86emul: test coverage for SSE/SSE2 insns Jan Beulich
2017-02-28 12:54 ` [PATCH v4 09/17] x86emul: honor MMXEXT feature flag Jan Beulich
2017-02-28 12:54 ` [PATCH v4 10/17] x86emul: add tables for 0f38 and 0f3a extension space Jan Beulich
2017-03-01 15:49   ` Andrew Cooper
2017-03-01 16:11     ` Jan Beulich
2017-03-01 20:35       ` Andrew Cooper
2017-03-02  8:15         ` Jan Beulich
2017-02-28 12:55 ` [PATCH v4 11/17] x86emul: support SSSE3 insns Jan Beulich
2017-03-01 16:06   ` Andrew Cooper
2017-02-28 12:56 ` [PATCH v4 12/17] x86emul: support SSE4.1 insns Jan Beulich
2017-03-01 16:58   ` Andrew Cooper
2017-03-02  8:26     ` Jan Beulich
2017-02-28 12:56 ` [PATCH v4 13/17] x86emul: support SSE4.2 insns Jan Beulich
2017-03-01 17:21   ` Andrew Cooper
2017-02-28 12:57 ` [PATCH v4 14/17] x86emul: test coverage for SSE3/SSSE3/SSE4* insns Jan Beulich
2017-03-01 17:22   ` Andrew Cooper
2017-02-28 12:58 ` [PATCH v4 15/17] x86emul: support PCLMULQDQ Jan Beulich
2017-03-01 17:44   ` Andrew Cooper
2017-03-02  8:30     ` Jan Beulich
2017-02-28 12:58 ` [PATCH v4 16/17] x86emul: support AESNI insns Jan Beulich
2017-02-28 12:59 ` [PATCH v4 17/17] x86emul: support SHA insns Jan Beulich
2017-03-01 17:51   ` Andrew Cooper

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=7e83a504-c35f-bada-46fb-be229c9735da@citrix.com \
    --to=andrew.cooper3@citrix.com \
    --cc=JBeulich@suse.com \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.