... to improve the legibility of the following fix. No functional change.
Signed-off-by: Andrew Cooper <[email protected]> --- CC: Jan Beulich <[email protected]> CC: Roger Pau Monné <[email protected]> Best reviewed with `git show --ignore-all-space` --- xen/arch/x86/xstate.c | 131 ++++++++++++++++++++++-------------------- 1 file changed, 68 insertions(+), 63 deletions(-) diff --git a/xen/arch/x86/xstate.c b/xen/arch/x86/xstate.c index e990abc9d18c..384f78bd5281 100644 --- a/xen/arch/x86/xstate.c +++ b/xen/arch/x86/xstate.c @@ -407,19 +407,19 @@ void xrstor(struct vcpu *v, uint64_t mask) */ for ( prev_faults = faults = 0; ; prev_faults = faults ) { - switch ( __builtin_expect(ptr->fpu_sse.x[FPU_WORD_SIZE_OFFSET], 8) ) - { - BUILD_BUG_ON(sizeof(faults) != 4); /* Clang doesn't support %z in asm. */ -#define _xrstor(insn) \ - asm volatile ( "1: .byte " insn "\n" \ - "3:\n" \ - " .section .fixup,\"ax\"\n" \ - "2: incl %[faults]\n" \ - " jmp 3b\n" \ - " .previous\n" \ - _ASM_EXTABLE(1b, 2b) \ - : [mem] "+m" (*ptr), [faults] "+g" (faults) \ - : [lmask] "a" (lmask), [hmask] "d" (hmask), \ + switch ( __builtin_expect(ptr->fpu_sse.x[FPU_WORD_SIZE_OFFSET], 8) ) + { + BUILD_BUG_ON(sizeof(faults) != 4); /* Clang doesn't support %z in asm. */ +#define _xrstor(insn) \ + asm volatile ( "1: .byte " insn "\n" \ + "3:\n" \ + " .section .fixup,\"ax\"\n" \ + "2: incl %[faults]\n" \ + " jmp 3b\n" \ + " .previous\n" \ + _ASM_EXTABLE(1b, 2b) \ + : [mem] "+m" (*ptr), [faults] "+g" (faults) \ + : [lmask] "a" (lmask), [hmask] "d" (hmask), \ [ptr] "D" (ptr) ) #define XRSTOR(pfx) \ @@ -437,62 +437,67 @@ void xrstor(struct vcpu *v, uint64_t mask) else \ _xrstor(pfx "0x0f,0xae,0x2f") /* xrstor */ - default: - XRSTOR("0x48,"); - break; - case 4: case 2: - XRSTOR(""); - break; + default: + XRSTOR("0x48,"); + break; + + case 4: case 2: + XRSTOR(""); + break; + #undef XRSTOR #undef _xrstor - } - if ( likely(faults == prev_faults) ) - break; + } + + 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]); + 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 ) + + 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 & X86_XCR0_SSE) || + ((mask & X86_XCR0_YMM) && + !(ptr->xsave_hdr.xcomp_bv & XSTATE_COMPACTION_ENABLED))) ) + ptr->fpu_sse.mxcsr &= mxcsr_mask; + if ( v->arch.xcr0_accum & XSTATE_XSAVES_ONLY ) { - 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 & X86_XCR0_SSE) || - ((mask & X86_XCR0_YMM) && - !(ptr->xsave_hdr.xcomp_bv & XSTATE_COMPACTION_ENABLED))) ) - ptr->fpu_sse.mxcsr &= mxcsr_mask; - if ( v->arch.xcr0_accum & XSTATE_XSAVES_ONLY ) - { - 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; - - case 2: /* Stage 2: Reset all state. */ - ptr->fpu_sse.mxcsr = MXCSR_DEFAULT; - ptr->xsave_hdr.xstate_bv = 0; - ptr->xsave_hdr.xcomp_bv = v->arch.xcr0_accum & XSTATE_XSAVES_ONLY - ? XSTATE_COMPACTION_ENABLED : 0; - continue; + 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; + + case 2: /* Stage 2: Reset all state. */ + ptr->fpu_sse.mxcsr = MXCSR_DEFAULT; + ptr->xsave_hdr.xstate_bv = 0; + ptr->xsave_hdr.xcomp_bv = v->arch.xcr0_accum & XSTATE_XSAVES_ONLY + ? XSTATE_COMPACTION_ENABLED : 0; + continue; + } domain_crash(current->domain); return; -- 2.39.5
