ReactOS 0.4.16-dev-1946-g52006dd
longjmp.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS vcruntime library
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: Implementation of longjmp for x64.
5 * COPYRIGHT: Copyright 2025 Timo Kreuzer <timo.kreuzer@reactos.org>
6 */
7
8#include <setjmp.h>
9#include <windef.h>
10
11__declspec(noreturn)
12void __longjmp_noframe(const _JUMP_BUFFER* _Buf, int _Value);
13
14__declspec(noreturn)
15void __cdecl longjmp(
16 _In_reads_(_JBLEN) jmp_buf _Buf,
17 _In_ int _Value)
18{
19 const _JUMP_BUFFER* jumpBuffer = (_JUMP_BUFFER*)_Buf;
20
21 /* Ensure _Value is non-zero */
22 _Value = (_Value == 0) ? 1 : _Value;
23
24 if (jumpBuffer->Frame != 0)
25 {
26 EXCEPTION_RECORD exceptionRecord = { 0 };
27 exceptionRecord.ExceptionCode = STATUS_LONGJUMP;
28 exceptionRecord.NumberParameters = 1;
29 exceptionRecord.ExceptionInformation[0] = (ULONG_PTR)jumpBuffer;
30
31 RtlUnwind((PVOID)jumpBuffer->Frame,
32 (PVOID)jumpBuffer->Rip,
33 &exceptionRecord,
35 }
36
37 __longjmp_noframe(jumpBuffer, _Value);
38}
#define __cdecl
Definition: accygwin.h:79
#define RtlUnwind
Definition: longjmp.c:9
_In_ _Value
#define ULONG_PTR
Definition: config.h:101
void __declspec(noinline) __cdecl _free_base(void *const block)
Definition: free_base.cpp:98
#define _In_reads_(s)
Definition: no_sal2.h:168
#define _In_
Definition: no_sal2.h:158
#define STATUS_LONGJUMP
Definition: ntstatus.h:297
DWORD ExceptionCode
Definition: compat.h:208
DWORD NumberParameters
Definition: compat.h:212
ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]
Definition: compat.h:213
uint32_t ULONG_PTR
Definition: typedefs.h:65
_JBTYPE jmp_buf[_JBLEN]
Definition: setjmp.h:188