diff --git a/sdk/lib/rtl/amd64/unwind.c b/sdk/lib/rtl/amd64/unwind.c index c914c333c9d..18564be0214 100644 --- a/sdk/lib/rtl/amd64/unwind.c +++ b/sdk/lib/rtl/amd64/unwind.c @@ -1,8 +1,8 @@ /* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS system libraries - * PURPOSE: Unwinding related functions - * PROGRAMMER: Timo Kreuzer (timo.kreuzer@reactos.org) + * PROJECT: ReactOS runtime library + * LICENSE: MIT (https://spdx.org/licenses/MIT) + * PURPOSE: Unwinding related functions + * COPYRIGHT: Copyright 2010-2025 Timo Kreuzer */ /* INCLUDES *****************************************************************/ @@ -1294,6 +1294,34 @@ RtlRestoreContext( // FIXME: This should be called through an asm wrapper to allow handling recursive unwinding ContextRecord->Rip = (ULONG64)Consolidate(ExceptionRecord); } + else if ((ExceptionRecord->ExceptionCode == STATUS_LONGJUMP) && + (ExceptionRecord->NumberParameters >= 1)) + { + _JUMP_BUFFER* JumpBuffer = (_JUMP_BUFFER*)ExceptionRecord->ExceptionInformation[0]; + ContextRecord->Rbx = JumpBuffer->Rbx; + ContextRecord->Rsp = JumpBuffer->Rsp; + ContextRecord->Rbp = JumpBuffer->Rbp; + ContextRecord->Rsi = JumpBuffer->Rsi; + ContextRecord->Rdi = JumpBuffer->Rdi; + ContextRecord->R12 = JumpBuffer->R12; + ContextRecord->R13 = JumpBuffer->R13; + ContextRecord->R14 = JumpBuffer->R14; + ContextRecord->R15 = JumpBuffer->R15; + ContextRecord->Rip = JumpBuffer->Rip; + ContextRecord->MxCsr = JumpBuffer->MxCsr; + ContextRecord->FltSave.MxCsr = JumpBuffer->MxCsr; + ContextRecord->FltSave.ControlWord = JumpBuffer->FpCsr; + ContextRecord->Xmm6 = *(M128A*)&JumpBuffer->Xmm6; + ContextRecord->Xmm7 = *(M128A*)&JumpBuffer->Xmm7; + ContextRecord->Xmm8 = *(M128A*)&JumpBuffer->Xmm8; + ContextRecord->Xmm9 = *(M128A*)&JumpBuffer->Xmm9; + ContextRecord->Xmm10 = *(M128A*)&JumpBuffer->Xmm10; + ContextRecord->Xmm11 = *(M128A*)&JumpBuffer->Xmm11; + ContextRecord->Xmm12 = *(M128A*)&JumpBuffer->Xmm12; + ContextRecord->Xmm13 = *(M128A*)&JumpBuffer->Xmm13; + ContextRecord->Xmm14 = *(M128A*)&JumpBuffer->Xmm14; + ContextRecord->Xmm15 = *(M128A*)&JumpBuffer->Xmm15; + } } RtlpRestoreContextInternal(ContextRecord);