Fix hardware exception context extraction on Rosetta #107188
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
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 toRtlRestoreContext
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 attempt to execute the ymm instruction triggers the hardware exception handling again and again.