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

Re: [Xen-devel] [PATCH v4 05/44] x86emul: support basic AVX512 moves



>>> On 13.11.18 at 18:12, <andrew.cooper3@xxxxxxxxxx> wrote:
> On 25/09/2018 14:28, Jan Beulich wrote:
>> +#define avx512_vlen_check(lig) do { \
>> +    switch ( evex.lr ) \
>> +    { \
>> +    default: \
>> +        generate_exception(EXC_UD); \
>> +    case 2: \
>> +        break; \
>> +    case 0: case 1: \
>> +        if (!(lig)) \
> 
> if ( !(lig) )

Oops. By now I've looked at this many dozen times, and I've
never noticed the style issue.

>> @@ -3272,6 +3387,7 @@ x86_emulate(
>>      b = ctxt->opcode;
>>      d = state.desc;
>>  #define state (&state)
>> +    elem_bytes = 4 << evex.w;
> 
> evex.w isn't filled by this point, is it?  We only fill evex.lr in the
> !evex_encoded() case AFAICT.

Well, that's another bit of (pre-existing) trickery: When we decode
these special prefixes (VEX, XOP, and EVEX) we first read the bytes
into vex.raw[]. The code dealing with the EVEX case then copies
the two vex.raw[] bytes into evex.raw[]. Thus the common fields
(between the prefix encodings) are filled uniformly, and uses
through vex are fine also for the EVEX case. I think this is better
than littering around many ?: expressions.

As an aside - if the above didn't work, none of the testing would
have succeeded.

>> @@ -6348,6 +6521,41 @@ x86_emulate(
>>          ASSERT(!state->simd_size);
>>          break;
>>  
>> +    case X86EMUL_OPC_EVEX_66(0x0f, 0x6e): /* vmov{d,q} r/m,xmm */
>> +    case X86EMUL_OPC_EVEX_66(0x0f, 0x7e): /* vmov{d,q} xmm,r/m */
>> +        generate_exception_if((evex.lr || evex.opmsk || evex.br ||
>> +                               evex.reg != 0xf || !evex.RX),
> 
> Are the inner brackets necessary?

I'd be happy to drop them - I've put them there mostly for you,
who you want whatever tool to properly deal with indentation on
such wrapped lines. Since I don't know the exact rules that tool
follows, I may have gone too far, but then again I think the
resulting different indentation between the two lines above and
the next line (holding the other macro argument) isn't unhelpful.

>> @@ -8819,6 +9070,44 @@ x86_emulate(
>>                                    !is_aligned(ea.mem.seg, ea.mem.off, 
>> op_bytes,
>>                                                ctxt, ops),
>>                                    EXC_GP, 0);
>> +
>> +            if ( evex.br )
>> +            {
>> +                ASSERT((d & DstMask) != DstMem);
>> +                op_bytes = elem_bytes;
>> +            }
>> +            if ( evex.opmsk )
>> +            {
>> +                ASSERT(!(op_bytes % elem_bytes));
>> +                full = ~0ULL >> (64 - op_bytes / elem_bytes);
> 
> I think we want a path which checks elem_bytes != 0 which is
> release-build safe.  This feels like an XSA waiting to happen.

Nothing _ever_ sets (or should set) elem_bytes to zero, and it gets
initialized to a non-zero value right in this patch. When writing this
code I indeed did think about adding a check against zero, but I
couldn't figure what half way sensible action (other than BUG()ing)
I could take in that case. Yet BUG() is in no way better than hitting
#DE on the division.

Jan



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

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