Skip to content

Commit

Permalink
[release/9.0] Fix FP state restore on macOS exception forwarding (#11…
Browse files Browse the repository at this point in the history
…0163)

* Update dependencies from https://github.com/dotnet/emsdk build 20241028.2 (#109323)

Microsoft.SourceBuild.Intermediate.emsdk , Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100 , Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport
 From Version 9.0.0-rtm.24519.2 -> To Version 9.0.0-rtm.24528.2

Dependency coherency updates

runtime.linux-arm64.Microsoft.NETCore.Runtime.JIT.Tools,runtime.linux-x64.Microsoft.NETCore.Runtime.JIT.Tools,runtime.linux-musl-arm64.Microsoft.NETCore.Runtime.JIT.Tools,runtime.linux-musl-x64.Microsoft.NETCore.Runtime.JIT.Tools,runtime.win-arm64.Microsoft.NETCore.Runtime.JIT.Tools,runtime.win-x64.Microsoft.NETCore.Runtime.JIT.Tools,runtime.osx-arm64.Microsoft.NETCore.Runtime.JIT.Tools,runtime.osx-x64.Microsoft.NETCore.Runtime.JIT.Tools,runtime.linux-arm64.Microsoft.NETCore.Runtime.Mono.LLVM.Sdk,runtime.linux-arm64.Microsoft.NETCore.Runtime.Mono.LLVM.Tools,runtime.linux-musl-arm64.Microsoft.NETCore.Runtime.Mono.LLVM.Sdk,runtime.linux-musl-arm64.Microsoft.NETCore.Runtime.Mono.LLVM.Tools,runtime.linux-x64.Microsoft.NETCore.Runtime.Mono.LLVM.Sdk,runtime.linux-x64.Microsoft.NETCore.Runtime.Mono.LLVM.Tools,runtime.linux-musl-x64.Microsoft.NETCore.Runtime.Mono.LLVM.Sdk,runtime.linux-musl-x64.Microsoft.NETCore.Runtime.Mono.LLVM.Tools,runtime.win-x64.Microsoft.NETCore.Runtime.Mono.LLVM.Sdk,runtime.win-x64.Microsoft.NETCore.Runtime.Mono.LLVM.Tools,runtime.osx-arm64.Microsoft.NETCore.Runtime.Mono.LLVM.Sdk,runtime.osx-arm64.Microsoft.NETCore.Runtime.Mono.LLVM.Tools,runtime.osx-x64.Microsoft.NETCore.Runtime.Mono.LLVM.Sdk,runtime.osx-x64.Microsoft.NETCore.Runtime.Mono.LLVM.Tools
 From Version 19.1.0-alpha.1.24510.5 -> To Version 19.1.0-alpha.1.24519.2 (parent: Microsoft.NET.Workload.Emscripten.Current.Manifest-9.0.100.Transport

Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>

* Update branding to 9.0.1 (#109563)

* Fix FP state restore on macOS exception forwarding

The change that enabled AVX512 support in the past has introduced a subtle
issue in restoring context for forwarding hardware exceptions that occur
in 3rd party non-managed code. In that case, the restored floating point
state is garbled.

The problem is due to the fact that we pass a x86_avx512_state context to
the thread_set_state. That context contains a header field describing the
format of the context (it can be AVX, AVX512, 32 or 64 bit, ...). That is
then followed by the actual context structure. This style of context is
identified e.g. by x86_AVX_STATE flavor. The header field contains the
specific flavor, which would be x86_AVX_STATE64 or x86_AVX512_STATE64.
The thread_set_state uses the flavor to detect whether the context passed
to it is this combined one or just x86_AVX_STATE64 or x86_AVX512_STATE64
which doesn't have the header field.
The issue was that while we were passing in the combined context, we were
passing in the flavor extracted from its header. So the thread_set_state
used the header as part of the context. That resulted e.g. in xmm register
contents being shifted by 8 bytes, thus garbling the state.

---------

Co-authored-by: dotnet-maestro[bot] <42748379+dotnet-maestro[bot]@users.noreply.github.com>
Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>
Co-authored-by: vseanreesermsft <[email protected]>
Co-authored-by: Jan Vorlicek <[email protected]>
  • Loading branch information
5 people authored Dec 10, 2024
1 parent fd73e87 commit 83db46b
Showing 1 changed file with 1 addition and 1 deletion.
2 changes: 1 addition & 1 deletion src/coreclr/pal/src/exception/machexception.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1325,7 +1325,7 @@ void MachExceptionInfo::RestoreState(mach_port_t thread)
kern_return_t machret = thread_set_state(thread, x86_THREAD_STATE, (thread_state_t)&ThreadState, x86_THREAD_STATE_COUNT);
CHECK_MACH("thread_set_state(thread)", machret);

machret = thread_set_state(thread, FloatState.ash.flavor, (thread_state_t)&FloatState, FloatState.ash.count);
machret = thread_set_state(thread, FloatState.ash.flavor, (thread_state_t)&FloatState.ufs, FloatState.ash.count);
CHECK_MACH("thread_set_state(float)", machret);

machret = thread_set_state(thread, x86_DEBUG_STATE, (thread_state_t)&DebugState, x86_DEBUG_STATE_COUNT);
Expand Down

0 comments on commit 83db46b

Please sign in to comment.