summaryrefslogtreecommitdiff
path: root/src/os/windows/crashlog_win.cpp
diff options
context:
space:
mode:
authormichi_cc <michi_cc@openttd.org>2010-08-23 18:19:15 +0000
committermichi_cc <michi_cc@openttd.org>2010-08-23 18:19:15 +0000
commita7e8b67c7c96d7e76b495ce2bed9f5f423870522 (patch)
tree330f12d82f0eeea9438a47ef4bfe17a8821f758f /src/os/windows/crashlog_win.cpp
parent56e05d1e2cc3feb2b08f7f87494c6ebe1f79e775 (diff)
downloadopenttd-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.cpp19
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