Alexandre Julliard : exception.h: Preserve registers when calling RtlUnwind .
Module: wine Branch: master Commit: 69c29866c19c41e65cc1a0f3f86739cff7690736 URL: http://source.winehq.org/git/wine.git/?a=commit;h=69c29866c19c41e65cc1a0f3f8... Author: Alexandre Julliard <julliard(a)winehq.org> Date: Thu May 1 11:07:53 2008 +0200 exception.h: Preserve registers when calling RtlUnwind. --- include/wine/exception.h | 19 +++++++++++++++++++ 1 files changed, 19 insertions(+), 0 deletions(-) diff --git a/include/wine/exception.h b/include/wine/exception.h index ad21866..590479c 100644 --- a/include/wine/exception.h +++ b/include/wine/exception.h @@ -233,7 +233,26 @@ static inline void DECLSPEC_NORETURN __wine_unwind_frame( EXCEPTION_RECORD *reco wine_frame->ExceptionCode = record->ExceptionCode; wine_frame->ExceptionRecord = wine_frame; +#if defined(__GNUC__) && defined(__i386__) + { + /* RtlUnwind clobbers registers on Windows */ + int dummy1, dummy2, dummy3; + __asm__ __volatile__("pushl %%ebp\n\t" + "pushl %%ebx\n\t" + "pushl $0\n\t" + "pushl %2\n\t" + "pushl $0\n\t" + "pushl %1\n\t" + "call *%0\n\t" + "popl %%ebx\n\t" + "popl %%ebp" + : "=a" (dummy1), "=S" (dummy2), "=D" (dummy3) + : "0" (RtlUnwind), "1" (frame), "2" (record) + : "ecx", "edx", "memory" ); + } +#else RtlUnwind( frame, 0, record, 0 ); +#endif __wine_pop_frame( frame ); siglongjmp( wine_frame->jmp, 1 ); }
participants (1)
-
Alexandre Julliard