mirror of
https://github.com/reactos/reactos.git
synced 2026-06-02 09:20:43 +08:00
[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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user