diff options
author | michi_cc <michi_cc@openttd.org> | 2010-08-23 18:19:15 +0000 |
---|---|---|
committer | michi_cc <michi_cc@openttd.org> | 2010-08-23 18:19:15 +0000 |
commit | a7e8b67c7c96d7e76b495ce2bed9f5f423870522 (patch) | |
tree | 330f12d82f0eeea9438a47ef4bfe17a8821f758f /src/os/windows/crashlog_win.cpp | |
parent | 56e05d1e2cc3feb2b08f7f87494c6ebe1f79e775 (diff) | |
download | openttd-a7e8b67c7c96d7e76b495ce2bed9f5f423870522.tar.xz |
(svn r20598) -Codechange: [Win32] Replace the external x64 asm with a built-in Windows function.
Diffstat (limited to 'src/os/windows/crashlog_win.cpp')
-rw-r--r-- | src/os/windows/crashlog_win.cpp | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/src/os/windows/crashlog_win.cpp b/src/os/windows/crashlog_win.cpp index 4bdb984f8..11791528b 100644 --- a/src/os/windows/crashlog_win.cpp +++ b/src/os/windows/crashlog_win.cpp @@ -10,6 +10,12 @@ /** @file crashlog_win.cpp Implementation of a crashlogger for Windows */ #include "../../stdafx.h" +#if defined(_MSC_VER) && defined(_M_AMD64) +/* Redefine WinNT version to get RtlCaptureContext prototype. */ +#undef _WIN32_WINNT +#undef NTDDI_VERSION +#define _WIN32_WINNT _WIN32_WINNT_WINXP +#endif /* defined(_MSC_VER) && defined(_M_AMD64) */ #include "../../crashlog.h" #include "win32.h" #include "../../core/alloc_func.hpp" @@ -408,10 +414,6 @@ static LONG WINAPI ExceptionHandler(EXCEPTION_POINTERS *ep) return EXCEPTION_EXECUTE_HANDLER; } -#ifdef _M_AMD64 -extern "C" void *_get_safe_esp(); -#endif - static void CDECL CustomAbort(int signal) { RaiseException(0xE1212012, 0, 0, NULL); @@ -421,7 +423,14 @@ static void CDECL CustomAbort(int signal) { #if defined(_MSC_VER) #ifdef _M_AMD64 - _safe_esp = _get_safe_esp(); + CONTEXT ctx; + RtlCaptureContext(&ctx); + + /* The stack pointer for AMD64 must always be 16-byte aligned inside a + * function. As we are simulating a function call with the safe ESP value, + * we need to subtract 8 for the imaginary return address otherwise stack + * alignment would be wrong in the called function. */ + _safe_esp = (void *)(ctx.Rsp - 8); #else _asm { mov _safe_esp, esp |