[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |