[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 3/4] x86/xstate: fix fault behavior on XRSTORS
>>> On 29.01.16 at 17:48, <andrew.cooper3@xxxxxxxxxx> wrote: > On 29/01/16 10:29, Jan Beulich wrote: >> --- a/xen/arch/x86/xstate.c >> +++ b/xen/arch/x86/xstate.c >> @@ -29,6 +29,8 @@ unsigned int *__read_mostly xstate_sizes >> static unsigned int __read_mostly xstate_features; >> static unsigned int __read_mostly >> xstate_comp_offsets[sizeof(xfeature_mask)*8]; >> >> +static uint32_t __read_mostly mxcsr_mask = MXCSR_DEFAULT; > > The default mxcsr_mask value is 0xFFBF, which is different to the > default mxcsr value. Oh, right, of course. Clearly I have no old enough box in regular use anymore to actually notice the difference. >> - case 4: case 2: >> - XRSTOR(""); >> - break; >> + ASM_OUTPUT2([mem] "+m" (*ptr), [faults] "+g" >> (faults)), \ >> + [lmask] "a" (lmask), [hmask] "d" (hmask), \ >> + [ptr] "D" (ptr)) >> + >> + default: >> + XRSTOR("0x48,"); > > Not relevant to this patch specifically, but this would be clearer if it > actually used the rex64 mnemonic Prefixing a .byte with rex64 is, well, odd? >> + break; >> + case 4: case 2: >> + XRSTOR(""); >> + break; >> #undef XRSTOR >> + } >> + if ( likely(faults == prev_faults) ) >> + break; >> +#ifndef NDEBUG >> + gprintk(XENLOG_WARNING, "fault#%u: mxcsr=%08x\n", >> + faults, ptr->fpu_sse.mxcsr); >> + gprintk(XENLOG_WARNING, "xs=%016lx xc=%016lx\n", >> + ptr->xsave_hdr.xstate_bv, ptr->xsave_hdr.xcomp_bv); >> + gprintk(XENLOG_WARNING, "r0=%016lx r1=%016lx\n", >> + ptr->xsave_hdr.reserved[0], ptr->xsave_hdr.reserved[1]); >> + gprintk(XENLOG_WARNING, "r2=%016lx r3=%016lx\n", >> + ptr->xsave_hdr.reserved[2], ptr->xsave_hdr.reserved[3]); >> + gprintk(XENLOG_WARNING, "r4=%016lx r5=%016lx\n", >> + ptr->xsave_hdr.reserved[4], ptr->xsave_hdr.reserved[5]); >> +#endif >> + switch ( faults ) >> + { >> + case 1: >> + /* Stage 1: Reset state to be loaded. */ >> + ptr->xsave_hdr.xstate_bv &= ~mask; >> + /* >> + * Also try to eliminate fault reasons, even if this shouldn't >> be >> + * needed here (other code should ensure the sanity of the >> data). >> + */ >> + if ( ((mask & XSTATE_SSE) || >> + ((mask & XSTATE_YMM) && >> + !(ptr->xsave_hdr.xcomp_bv & XSTATE_COMPACTION_ENABLED))) >> ) >> + ptr->fpu_sse.mxcsr &= mxcsr_mask; >> + if ( cpu_has_xsaves || cpu_has_xsavec ) >> + { >> + ptr->xsave_hdr.xcomp_bv &= this_cpu(xcr0) | this_cpu(xss); >> + ptr->xsave_hdr.xstate_bv &= ptr->xsave_hdr.xcomp_bv; >> + ptr->xsave_hdr.xcomp_bv |= XSTATE_COMPACTION_ENABLED; >> + } >> + else >> + { >> + ptr->xsave_hdr.xstate_bv &= this_cpu(xcr0); >> + ptr->xsave_hdr.xcomp_bv = 0; >> + } >> + memset(ptr->xsave_hdr.reserved, 0, >> sizeof(ptr->xsave_hdr.reserved)); >> + continue; > > Newline here please. > >> + case 2: >> + /* Stage 2: Reset all state. */ >> + ptr->fpu_sse.mxcsr = MXCSR_DEFAULT; >> + ptr->xsave_hdr.xstate_bv = 0; >> + ptr->xsave_hdr.xcomp_bv = cpu_has_xsaves >> + ? XSTATE_COMPACTION_ENABLED : 0; >> + continue; > > And here. > >> + default: >> + domain_crash(current->domain); >> + break; > > This breaks out of the switch statement, not out of the loop. It looks > like it will end in an infinite loop of calling domain_crash(). Oh, indeed, I forgot that: After all, the whole point of the "continue"s was for there to be a break after the switch()'s end. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |