[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 05/17] x86emul: add XOP decoding



On 08/09/16 14:11, Jan Beulich wrote:
> This way we can at least size (and e.g. skip) them if needed, and we
> also won't raise the wrong fault due to not having read all relevant
> bytes.
>
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
>
> --- a/xen/arch/x86/x86_emulate/x86_emulate.c
> +++ b/xen/arch/x86/x86_emulate/x86_emulate.c
> @@ -279,6 +279,12 @@ static const opcode_desc_t twobyte_table
>      ModRM, ModRM, ModRM, ModRM, ModRM, ModRM, ModRM, ModRM
>  };
>  
> +static const opcode_desc_t xop_table[] = {
> +    DstReg|SrcImmByte|ModRM,
> +    DstReg|SrcMem|ModRM,
> +    DstReg|SrcImm|ModRM,
> +};
> +
>  #define REX_PREFIX 0x40
>  #define REX_B 0x01
>  #define REX_X 0x02
> @@ -1580,6 +1586,9 @@ struct x86_emulate_state {
>          ext_0f   = vex_0f,
>          ext_0f38 = vex_0f38,
>          ext_0f3a = vex_0f3a,
> +        ext_8f08 = 8,
> +        ext_8f09,
> +        ext_8f0a,

What is this = 8 for?  I presume you didn't slip it in accidentally, but
I still can't figure out why.

>      } ext;
>      uint8_t opcode;
>      uint8_t modrm, modrm_mod, modrm_reg, modrm_rm;
> @@ -1802,7 +1811,7 @@ x86_decode(
>          modrm = insn_fetch_type(uint8_t);
>          modrm_mod = (modrm & 0xc0) >> 6;
>  
> -        if ( !ext && ((b & ~1) == 0xc4) )
> +        if ( !ext && ((b & ~1) == 0xc4 || (b == 0x8f && (modrm & 0x18))) )
>              switch ( def_ad_bytes )
>              {
>              default:
> @@ -1816,11 +1825,11 @@ x86_decode(
>                      break;
>                  /* fall through */
>              case 8:
> -                /* VEX */
> +                /* VEX / XOP */
>                  generate_exception_if(rex_prefix || vex.pfx, EXC_UD, -1);
>  
>                  vex.raw[0] = modrm;
> -                if ( b & 1 )
> +                if ( b == 0xc5 )
>                  {
>                      vex.raw[1] = modrm;
>                      vex.opcx = vex_0f;
> @@ -1848,18 +1857,30 @@ x86_decode(
>                      rex_prefix |= REX_R;
>  
>                  b = insn_fetch_type(uint8_t);
> -                switch ( ext = vex.opcx )
> +                ext = vex.opcx;
> +                if ( b != 0x8f )
> +                {
> +                    switch ( ext )
> +                    {
> +                    case vex_0f:
> +                        d = twobyte_table[b];
> +                        break;
> +                    case vex_0f38:
> +                        d = twobyte_table[0x38];
> +                        break;
> +                    case vex_0f3a:
> +                        d = twobyte_table[0x3a];
> +                        break;
> +                    default:
> +                        rc = X86EMUL_UNHANDLEABLE;
> +                        goto done;
> +                    }
> +                }
> +                else if ( ext < ext_8f08 +
> +                                sizeof(xop_table) / sizeof(*xop_table) )

ARRAY_SIZE() ?

~Andrew

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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.