1
0
Fork 0
mirror of synced 2025-03-07 03:53:26 +01:00

ntdll: Use jump buffer definitions from setjmp.h.

This commit is contained in:
Alexandre Julliard 2024-03-07 10:23:15 +01:00
parent 542e11fcd9
commit 7a156cbd7f
3 changed files with 9 additions and 92 deletions

View file

@ -23,6 +23,7 @@
#include <stdlib.h>
#include <stdarg.h>
#include <setjmp.h>
#include "ntstatus.h"
#define WIN32_NO_STATUS
@ -37,25 +38,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(seh);
WINE_DECLARE_DEBUG_CHANNEL(relay);
/* layering violation: the setjmp buffer is defined in msvcrt, but used by RtlUnwindEx */
struct MSVCRT_JUMP_BUFFER
{
unsigned long Frame;
unsigned long R4;
unsigned long R5;
unsigned long R6;
unsigned long R7;
unsigned long R8;
unsigned long R9;
unsigned long R10;
unsigned long R11;
unsigned long Sp;
unsigned long Pc;
unsigned long Fpscr;
unsigned long long D[8];
};
static void dump_scope_table( ULONG base, const SCOPE_TABLE *table )
{
unsigned int i;
@ -424,17 +406,13 @@ void CDECL RtlRestoreContext( CONTEXT *context, EXCEPTION_RECORD *rec )
if (rec && rec->ExceptionCode == STATUS_LONGJUMP && rec->NumberParameters >= 1)
{
struct MSVCRT_JUMP_BUFFER *jmp = (struct MSVCRT_JUMP_BUFFER *)rec->ExceptionInformation[0];
int i;
struct _JUMP_BUFFER *jmp = (struct _JUMP_BUFFER *)rec->ExceptionInformation[0];
for (i = 4; i <= 11; i++)
(&context->R4)[i-4] = (&jmp->R4)[i-4];
memcpy( &context->R4, &jmp->R4, 8 * sizeof(DWORD) );
memcpy( &context->D[8], &jmp->D[0], 8 * sizeof(ULONGLONG) );
context->Lr = jmp->Pc;
context->Sp = jmp->Sp;
context->Fpscr = jmp->Fpscr;
for (i = 0; i < 8; i++)
context->D[8+i] = jmp->D[i];
}
else if (rec && rec->ExceptionCode == STATUS_UNWIND_CONSOLIDATE && rec->NumberParameters >= 1)
{

View file

@ -25,6 +25,7 @@
#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
#include <setjmp.h>
#include "ntstatus.h"
#define WIN32_NO_STATUS
@ -39,30 +40,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(seh);
WINE_DECLARE_DEBUG_CHANNEL(relay);
/* layering violation: the setjmp buffer is defined in msvcrt, but used by RtlUnwindEx */
struct MSVCRT_JUMP_BUFFER
{
unsigned __int64 Frame;
unsigned __int64 Reserved;
unsigned __int64 X19;
unsigned __int64 X20;
unsigned __int64 X21;
unsigned __int64 X22;
unsigned __int64 X23;
unsigned __int64 X24;
unsigned __int64 X25;
unsigned __int64 X26;
unsigned __int64 X27;
unsigned __int64 X28;
unsigned __int64 Fp;
unsigned __int64 Lr;
unsigned __int64 Sp;
ULONG Fpcr;
ULONG Fpsr;
double D[8];
};
static void dump_scope_table( ULONG64 base, const SCOPE_TABLE *table )
{
unsigned int i;
@ -486,7 +463,7 @@ void CDECL RtlRestoreContext( CONTEXT *context, EXCEPTION_RECORD *rec )
if (rec && rec->ExceptionCode == STATUS_LONGJUMP && rec->NumberParameters >= 1)
{
struct MSVCRT_JUMP_BUFFER *jmp = (struct MSVCRT_JUMP_BUFFER *)rec->ExceptionInformation[0];
struct _JUMP_BUFFER *jmp = (struct _JUMP_BUFFER *)rec->ExceptionInformation[0];
int i;
context->X19 = jmp->X19;

View file

@ -22,6 +22,7 @@
#include <stdlib.h>
#include <stdarg.h>
#include <setjmp.h>
#include "ntstatus.h"
#define WIN32_NO_STATUS
@ -37,36 +38,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(seh);
WINE_DECLARE_DEBUG_CHANNEL(relay);
/* layering violation: the setjmp buffer is defined in msvcrt, but used by RtlUnwindEx */
struct MSVCRT_JUMP_BUFFER
{
ULONG64 Frame;
ULONG64 Rbx;
ULONG64 Rsp;
ULONG64 Rbp;
ULONG64 Rsi;
ULONG64 Rdi;
ULONG64 R12;
ULONG64 R13;
ULONG64 R14;
ULONG64 R15;
ULONG64 Rip;
ULONG MxCsr;
USHORT FpCsr;
USHORT Spare;
M128A Xmm6;
M128A Xmm7;
M128A Xmm8;
M128A Xmm9;
M128A Xmm10;
M128A Xmm11;
M128A Xmm12;
M128A Xmm13;
M128A Xmm14;
M128A Xmm15;
};
/*******************************************************************
* syscalls
*/
@ -726,7 +697,7 @@ void CDECL RtlRestoreContext( CONTEXT *context, EXCEPTION_RECORD *rec )
if (rec && rec->ExceptionCode == STATUS_LONGJUMP && rec->NumberParameters >= 1)
{
struct MSVCRT_JUMP_BUFFER *jmp = (struct MSVCRT_JUMP_BUFFER *)rec->ExceptionInformation[0];
struct _JUMP_BUFFER *jmp = (struct _JUMP_BUFFER *)rec->ExceptionInformation[0];
context->Rbx = jmp->Rbx;
context->Rsp = jmp->Rsp;
context->Rbp = jmp->Rbp;
@ -737,19 +708,10 @@ void CDECL RtlRestoreContext( CONTEXT *context, EXCEPTION_RECORD *rec )
context->R14 = jmp->R14;
context->R15 = jmp->R15;
context->Rip = jmp->Rip;
context->Xmm6 = jmp->Xmm6;
context->Xmm7 = jmp->Xmm7;
context->Xmm8 = jmp->Xmm8;
context->Xmm9 = jmp->Xmm9;
context->Xmm10 = jmp->Xmm10;
context->Xmm11 = jmp->Xmm11;
context->Xmm12 = jmp->Xmm12;
context->Xmm13 = jmp->Xmm13;
context->Xmm14 = jmp->Xmm14;
context->Xmm15 = jmp->Xmm15;
context->MxCsr = jmp->MxCsr;
context->FltSave.MxCsr = jmp->MxCsr;
context->FltSave.ControlWord = jmp->FpCsr;
memcpy( &context->Xmm6, &jmp->Xmm6, 10 * sizeof(M128A) );
}
else if (rec && rec->ExceptionCode == STATUS_UNWIND_CONSOLIDATE && rec->NumberParameters >= 1)
{