[release/6.0] Fix exception propagation over HW exception frame on macOS arm64 (...
authorgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Mon, 7 Feb 2022 19:14:58 +0000 (11:14 -0800)
committerGitHub <noreply@github.com>
Mon, 7 Feb 2022 19:14:58 +0000 (11:14 -0800)
commit2caf6fb6e7ed437829ce1f48dd5e070ff5df7d39
tree4d22f95818cd398be75a1025e117c483c6598680
parent3b0b34c53863e80fc9b80f1d3e84a461dc28c2c1
[release/6.0] Fix exception propagation over HW exception frame on macOS arm64 (#64262)

* Fix exception propagation over HW exception frame on macOS arm64

There is a problem unwinding over the PAL_DispatchExceptionWrapper
to the actual hardware exception location. The unwinder is unable
to get distinct LR and PC in that frame and sets both of them to
the same value. This is caused by the fact that the
PAL_DispatchExceptionWrapper is just an injected fake frame and
there was no real call. Calls always return with LR and PC set
to the same value.

The fix unifies the hardware exception frame unwinding with Linux
where we had problems unwinding over signal handler trampoline, so
PAL_VirtualUnwind skips the trampoline and now also the
PAL_DispatchExceptionWrapper frame by copying the context of
the exception as the unwound context.

* Fix GC stress C - wrong context being restored

The context that is restored in the PAL_DispatchException needs to be
the one from the exception, not the original saved one. That ensures
that the registers updated by the GC in GC stress C in the context
are properly restored after the execution is resumed.

* Fix exception context leak in GC stress C

The PAL_SEHException had the records allocated on stack, so the
direct context restoration after the EH for GC stress C completed
leaked those.

Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
src/coreclr/pal/src/exception/machexception.cpp
src/coreclr/pal/src/exception/seh-unwind.cpp
src/coreclr/pal/src/exception/signal.cpp
src/coreclr/pal/src/include/pal/seh.hpp
src/tests/Regressions/coreclr/GitHub_62058/test62058.cs [new file with mode: 0644]
src/tests/Regressions/coreclr/GitHub_62058/test62058.csproj [new file with mode: 0644]