mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2024-09-13 09:17:20 -07:00
Added patch to improve handling of builtin frames for x86_64 when switching stacks.
This commit is contained in:
parent
b8b8585286
commit
402b8c4972
@ -0,0 +1,64 @@
|
||||
From 5e65a77ff8c907d5560164c30a24d1bf171b3b8f Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Tue, 12 Apr 2016 19:03:57 +0200
|
||||
Subject: ntdll: Improve handling of builtin frames for x86_64 when switching
|
||||
stacks.
|
||||
|
||||
---
|
||||
dlls/ntdll/signal_x86_64.c | 24 +++++++++++++++---------
|
||||
1 file changed, 15 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c
|
||||
index b56c1ea..93475d54 100644
|
||||
--- a/dlls/ntdll/signal_x86_64.c
|
||||
+++ b/dlls/ntdll/signal_x86_64.c
|
||||
@@ -2420,16 +2420,20 @@ static NTSTATUS call_stack_handlers( EXCEPTION_RECORD *rec, CONTEXT *orig_contex
|
||||
if (status != STATUS_UNHANDLED_EXCEPTION) return status;
|
||||
}
|
||||
/* hack: call wine handlers registered in the tib list */
|
||||
- else while ((ULONG64)teb_frame < new_context.Rsp)
|
||||
+ else if ((ULONG64)teb_frame >= context.Rsp)
|
||||
{
|
||||
- TRACE( "found wine frame %p rsp %lx handler %p\n",
|
||||
- teb_frame, new_context.Rsp, teb_frame->Handler );
|
||||
- dispatch.EstablisherFrame = (ULONG64)teb_frame;
|
||||
- context = *orig_context;
|
||||
- status = call_teb_handler( rec, &dispatch, teb_frame, orig_context );
|
||||
- if (status != STATUS_UNHANDLED_EXCEPTION) return status;
|
||||
- teb_frame = teb_frame->Prev;
|
||||
+ while ((ULONG64)teb_frame < new_context.Rsp)
|
||||
+ {
|
||||
+ TRACE( "found wine frame %p rsp %lx handler %p\n",
|
||||
+ teb_frame, new_context.Rsp, teb_frame->Handler );
|
||||
+ dispatch.EstablisherFrame = (ULONG64)teb_frame;
|
||||
+ context = *orig_context;
|
||||
+ status = call_teb_handler( rec, &dispatch, teb_frame, orig_context );
|
||||
+ if (status != STATUS_UNHANDLED_EXCEPTION) return status;
|
||||
+ teb_frame = teb_frame->Prev;
|
||||
+ }
|
||||
}
|
||||
+ else WARN( "skipping wine frame %p (on other stack?)\n", teb_frame );
|
||||
|
||||
if (new_context.Rsp == (ULONG64)NtCurrentTeb()->Tib.StackBase) break;
|
||||
context = new_context;
|
||||
@@ -3592,7 +3596,8 @@ void WINAPI RtlUnwindEx( PVOID end_frame, PVOID target_ip, EXCEPTION_RECORD *rec
|
||||
if (dispatch.EstablisherFrame == (ULONG64)end_frame) rec->ExceptionFlags |= EH_TARGET_UNWIND;
|
||||
call_unwind_handler( rec, &dispatch );
|
||||
}
|
||||
- else /* hack: call builtin handlers registered in the tib list */
|
||||
+ /* hack: call builtin handlers registered in the tib list */
|
||||
+ else if ((ULONG64)teb_frame >= context->Rsp)
|
||||
{
|
||||
DWORD64 backup_frame = dispatch.EstablisherFrame;
|
||||
while ((ULONG64)teb_frame < new_context.Rsp && (ULONG64)teb_frame < (ULONG64)end_frame)
|
||||
@@ -3605,6 +3610,7 @@ void WINAPI RtlUnwindEx( PVOID end_frame, PVOID target_ip, EXCEPTION_RECORD *rec
|
||||
if ((ULONG64)teb_frame == (ULONG64)end_frame && (ULONG64)end_frame < new_context.Rsp) break;
|
||||
dispatch.EstablisherFrame = backup_frame;
|
||||
}
|
||||
+ else WARN( "skipping wine frame %p (on other stack?)\n", teb_frame );
|
||||
|
||||
if (dispatch.EstablisherFrame == (ULONG64)end_frame) break;
|
||||
*context = new_context;
|
||||
--
|
||||
2.7.1
|
||||
|
1
patches/ntdll-x86_64_Builtin_Frames/definition
Normal file
1
patches/ntdll-x86_64_Builtin_Frames/definition
Normal file
@ -0,0 +1 @@
|
||||
Fixes: Improve handling of builtin frames for x86_64 when switching stacks
|
@ -240,6 +240,7 @@ patch_enable_all ()
|
||||
enable_ntdll_WriteWatches="$1"
|
||||
enable_ntdll_Zero_mod_name="$1"
|
||||
enable_ntdll_call_thread_func_wrapper="$1"
|
||||
enable_ntdll_x86_64_Builtin_Frames="$1"
|
||||
enable_ntoskrnl_DriverTest="$1"
|
||||
enable_ntoskrnl_Stubs="$1"
|
||||
enable_nvapi_Stub_DLL="$1"
|
||||
@ -892,6 +893,9 @@ patch_enable ()
|
||||
ntdll-call_thread_func_wrapper)
|
||||
enable_ntdll_call_thread_func_wrapper="$2"
|
||||
;;
|
||||
ntdll-x86_64_Builtin_Frames)
|
||||
enable_ntdll_x86_64_Builtin_Frames="$2"
|
||||
;;
|
||||
ntoskrnl-DriverTest)
|
||||
enable_ntoskrnl_DriverTest="$2"
|
||||
;;
|
||||
@ -5256,6 +5260,18 @@ if test "$enable_ntdll_call_thread_func_wrapper" -eq 1; then
|
||||
) >> "$patchlist"
|
||||
fi
|
||||
|
||||
# Patchset ntdll-x86_64_Builtin_Frames
|
||||
# |
|
||||
# | Modified files:
|
||||
# | * dlls/ntdll/signal_x86_64.c
|
||||
# |
|
||||
if test "$enable_ntdll_x86_64_Builtin_Frames" -eq 1; then
|
||||
patch_apply ntdll-x86_64_Builtin_Frames/0001-ntdll-Improve-handling-of-builtin-frames-for-x86_64-.patch
|
||||
(
|
||||
echo '+ { "Sebastian Lackner", "ntdll: Improve handling of builtin frames for x86_64 when switching stacks.", 1 },';
|
||||
) >> "$patchlist"
|
||||
fi
|
||||
|
||||
# Patchset ntoskrnl-DriverTest
|
||||
# |
|
||||
# | Modified files:
|
||||
|
Loading…
Reference in New Issue
Block a user