[RTL/x64] Implement support for STATUS_LONGJUMP in RtlRestoreContext

Also change license to MIT (this is all my own code)
This commit is contained in:
Timo Kreuzer
2025-05-26 14:29:01 +03:00
parent f709f6f22f
commit 3dc1c5039d

View File

@@ -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 <timo.kreuzer@reactos.org>
*/
/* 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);