Alexandre Julliard : ntdll: Pass the error code to VIRTUAL_HandleFault, and allow it to ignore the exception.
Alexandre Julliard
julliard at winehq.org
Tue Nov 25 07:21:37 CST 2008
Module: wine
Branch: master
Commit: 81b9ca5dbd08dad57cc009935be0d7a9a339d69c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=81b9ca5dbd08dad57cc009935be0d7a9a339d69c
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Nov 25 12:02:16 2008 +0100
ntdll: Pass the error code to VIRTUAL_HandleFault, and allow it to ignore the exception.
Also rename it to virtual_handle_fault for consistency.
---
dlls/ntdll/ntdll_misc.h | 2 +-
dlls/ntdll/signal_i386.c | 4 +++-
dlls/ntdll/signal_powerpc.c | 7 ++-----
dlls/ntdll/signal_sparc.c | 5 +++--
dlls/ntdll/signal_x86_64.c | 3 +++
dlls/ntdll/virtual.c | 4 ++--
6 files changed, 14 insertions(+), 11 deletions(-)
diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h
index a42fd11..f3a60f6 100644
--- a/dlls/ntdll/ntdll_misc.h
+++ b/dlls/ntdll/ntdll_misc.h
@@ -141,7 +141,7 @@ extern SIZE_T virtual_free_system_view( PVOID *addr_ptr );
extern NTSTATUS virtual_alloc_thread_stack( void *base, SIZE_T stack_size );
extern void virtual_clear_thread_stack(void);
extern BOOL virtual_handle_stack_fault( void *addr );
-extern NTSTATUS VIRTUAL_HandleFault(LPCVOID addr);
+extern NTSTATUS virtual_handle_fault( LPCVOID addr, DWORD err );
extern void VIRTUAL_SetForceExec( BOOL enable );
extern void VIRTUAL_UseLargeAddressSpace(void);
extern struct _KUSER_SHARED_DATA *user_shared_data;
diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
index a9482e9..6a3a847 100644
--- a/dlls/ntdll/signal_i386.c
+++ b/dlls/ntdll/signal_i386.c
@@ -1209,7 +1209,9 @@ static void WINAPI raise_segv_exception( EXCEPTION_RECORD *rec, CONTEXT *context
{
if (rec->ExceptionInformation[0] == EXCEPTION_EXECUTE_FAULT && check_atl_thunk( rec, context ))
goto done;
- rec->ExceptionCode = VIRTUAL_HandleFault( (void *)rec->ExceptionInformation[1] );
+ if (!(rec->ExceptionCode = virtual_handle_fault( (void *)rec->ExceptionInformation[1],
+ rec->ExceptionInformation[0] )))
+ goto done;
}
break;
case EXCEPTION_DATATYPE_MISALIGNMENT:
diff --git a/dlls/ntdll/signal_powerpc.c b/dlls/ntdll/signal_powerpc.c
index e65591b..ecb74e1 100644
--- a/dlls/ntdll/signal_powerpc.c
+++ b/dlls/ntdll/signal_powerpc.c
@@ -321,7 +321,6 @@ static inline DWORD get_fpu_code( const CONTEXT *context )
static void do_segv( CONTEXT *context, int trap, int err, int code, void * addr )
{
EXCEPTION_RECORD rec;
- DWORD page_fault_code = EXCEPTION_ACCESS_VIOLATION;
rec.ExceptionRecord = NULL;
rec.ExceptionFlags = EXCEPTION_CONTINUABLE;
@@ -336,9 +335,8 @@ static void do_segv( CONTEXT *context, int trap, int err, int code, void * addr
rec.NumberParameters = 2;
rec.ExceptionInformation[0] = 0; /* FIXME ? */
rec.ExceptionInformation[1] = (ULONG_PTR)addr;
- if (!(page_fault_code=VIRTUAL_HandleFault(addr)))
+ if (!(rec.ExceptionCode = virtual_handle_fault(addr, rec.ExceptionInformation[0])))
return;
- rec.ExceptionCode = page_fault_code;
break;
default:FIXME("Unhandled SIGSEGV/%x\n",code);
break;
@@ -358,9 +356,8 @@ static void do_segv( CONTEXT *context, int trap, int err, int code, void * addr
rec.NumberParameters = 2;
rec.ExceptionInformation[0] = 0; /* FIXME ? */
rec.ExceptionInformation[1] = (ULONG_PTR)addr;
- if (!(page_fault_code=VIRTUAL_HandleFault(addr)))
+ if (!(rec.ExceptionCode = virtual_handle_fault(addr, rec.ExceptionInformation[0])))
return;
- rec.ExceptionCode = page_fault_code;
break;
#endif
default:FIXME("Unhandled SIGBUS/%x\n",code);
diff --git a/dlls/ntdll/signal_sparc.c b/dlls/ntdll/signal_sparc.c
index d3896f3..657d167 100644
--- a/dlls/ntdll/signal_sparc.c
+++ b/dlls/ntdll/signal_sparc.c
@@ -180,12 +180,13 @@ static void segv_handler( int signal, siginfo_t *info, ucontext_t *ucontext )
EXCEPTION_RECORD rec;
CONTEXT context;
+ rec.ExceptionCode = EXCEPTION_ACCESS_VIOLATION;
+
/* we want the page-fault case to be fast */
if ( info->si_code == SEGV_ACCERR )
- if (VIRTUAL_HandleFault( (LPVOID)info->si_addr )) return;
+ if (!(rec.ExceptionCode = virtual_handle_fault( info->si_addr, 0 ))) return;
save_context( &context, ucontext );
- rec.ExceptionCode = EXCEPTION_ACCESS_VIOLATION;
rec.ExceptionRecord = NULL;
rec.ExceptionFlags = EXCEPTION_CONTINUABLE;
rec.ExceptionAddress = (LPVOID)context.pc;
diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c
index a7a0d3b..47b2ff7 100644
--- a/dlls/ntdll/signal_x86_64.c
+++ b/dlls/ntdll/signal_x86_64.c
@@ -263,6 +263,8 @@ static HANDLER_DEF(segv_handler)
rec.NumberParameters = 2;
rec.ExceptionInformation[0] = (ERROR_sig(HANDLER_CONTEXT) & 2) != 0;
rec.ExceptionInformation[1] = (ULONG_PTR)FAULT_ADDRESS;
+ if (!(rec.ExceptionCode = virtual_handle_fault( FAULT_ADDRESS, rec.ExceptionInformation[0] )))
+ goto done;
#endif
break;
case TRAP_x86_ALIGNFLT: /* Alignment check exception */
@@ -282,6 +284,7 @@ static HANDLER_DEF(segv_handler)
}
__regs_RtlRaiseException( &rec, &context );
+done:
restore_context( &context, HANDLER_CONTEXT );
}
diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c
index 34c6369..3efd43d 100644
--- a/dlls/ntdll/virtual.c
+++ b/dlls/ntdll/virtual.c
@@ -1399,9 +1399,9 @@ void virtual_clear_thread_stack(void)
/***********************************************************************
- * VIRTUAL_HandleFault
+ * virtual_handle_fault
*/
-NTSTATUS VIRTUAL_HandleFault( LPCVOID addr )
+NTSTATUS virtual_handle_fault( LPCVOID addr, DWORD err )
{
FILE_VIEW *view;
NTSTATUS ret = STATUS_ACCESS_VIOLATION;
More information about the wine-cvs
mailing list