Skip to content

Commit bcb0c09

Browse files
Fix hardware exception context extraction on Rosetta (#107199)
The recently added AVX support in hardware exception handling path on macOS x64 has introduced a problem when running under Rosetta. When we extract the floating point part of the context of the failing thread, the thread can have AVX or AVX512 active, or none of these. The code accidentally leaves CONTEXT_XSTATE set on the context even when no AVX was enabled on the thread. Rosetta doesn't support AVX, so having CONTEXT_XSTATE set in the context flags can lead to later call to RtlRestoreContext attempting to set ymm registers using instructions that Rosetta cannot emulate and the app crashes due to that. This doesn't happen in .NET 9, since we always clear the CONTEXT_XSTATE before exception handling stack unwinding. But in .NET 8, this causes stack overflow under Rosetta, since the attemt to execute the ymm instruction triggers the hardware exception handling again and again. Co-authored-by: Jan Vorlicek <[email protected]>
1 parent 88d07e4 commit bcb0c09

File tree

1 file changed

+6
-0
lines changed

1 file changed

+6
-0
lines changed

src/coreclr/pal/src/thread/context.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1496,6 +1496,12 @@ CONTEXT_GetThreadContextFromThreadState(
14961496

14971497
// AMD64's FLOATING_POINT includes the xmm registers.
14981498
memcpy(&lpContext->Xmm0, &pState->__fpu_xmm0, 16 * 16);
1499+
1500+
if (threadStateFlavor == x86_FLOAT_STATE64)
1501+
{
1502+
// There was just a floating point state, so make sure the CONTEXT_XSTATE is not set
1503+
lpContext->ContextFlags &= ~(CONTEXT_XSTATE & CONTEXT_AREA_MASK);
1504+
}
14991505
}
15001506
break;
15011507
}

0 commit comments

Comments
 (0)