[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 14.11.18 at 17:26, <andrew.cooper3@xxxxxxxxxx> wrote:
> On 14/11/2018 14:35, Jan Beulich wrote:
>>>>> On 13.11.18 at 18:12, <andrew.cooper3@xxxxxxxxxx> wrote:
>>> On 25/09/2018 14:28, Jan Beulich wrote:
>>>> @@ -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[].
> 
> Oh - I was looking for that, but failed to spot it.  Where is that?

                    switch ( b )
                    {
                    case 0x62:
                        opcode = X86EMUL_OPC_EVEX_;
                        evex.raw[0] = vex.raw[0];
                        evex.raw[1] = vex.raw[1];
                        evex.raw[2] = insn_fetch_type(uint8_t);

(in the middle of ModRM processing in x86_decode())

>>>> @@ -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.
> 
> BSD style already specifies that function parameters are aligned
> vertically after the (, so this case is fine without.
> 
> The problematic case is bare block continuations (especially on return
> statements) where the BSD style is 4 spaces in from the outer block.

So considering the second aspect I've mentioned, would you
nevertheless prefer the parens here (and perhaps elsewhere)
to be dropped?

>>>> @@ -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.
> 
> An { ASSERT_UNREACHABLE(); return X86_UNHANDLEABLE; } block would be
> better than BUG(), because at least it won't crash a release
> hypervisor.  (At least being unsigned division, we don't have the -1
> case to worry about).

Will do, perhaps introducing (in a prereq patch) an IMPOSSIBLE()
construct abstracting this away, as there's already one such
instance in the code.

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®.