+/* Copyright (c) 2010-2012, 2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
/*\r
* win32-ucontext: Unix ucontext_t operations on Windows platforms\r
* Copyright(C) 2007 Panagiotis E. Hadjidoukas\r
*/ \r
\r
#include "win32_ucontext.h"\r
+\r
int getcontext(ucontext_t * ucp) \r
{\r
int ret;\r
\r
/* Retrieve the full machine context */ \r
- ucp->uc_mcontext.ContextFlags = CONTEXT_FULL;\r
+ ucp->uc_mcontext.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS;\r
ret = GetThreadContext(GetCurrentThread(), &ucp->uc_mcontext);\r
return (ret == 0) ? -1 : 0;\r
}\r
int i;\r
va_list ap;\r
char *sp;\r
- \r
- /* Stack grows down */ \r
+\r
+ /* Stack grows down */\r
sp = (char *) (size_t) ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size;\r
\r
/* Reserve stack space for the arguments (maximum possible: argc*(8 bytes per argument)) */ \r
- sp -= argc * 8;\r
+ sp -= argc * sizeof(void*);\r
if (sp < (char *) ucp->uc_stack.ss_sp) {\r
\r
/* errno = ENOMEM; */ \r
}\r
\r
/* Set the instruction and the stack pointer */\r
- #ifdef I_X86_\r
- ucp->uc_mcontext.Eip = (unsigned long) func;\r
- ucp->uc_mcontext.Esp = (unsigned long) sp - 4;\r
+ #ifdef _I_X86_\r
+ ucp->uc_mcontext.Eip = (DWORD) func;\r
+ ucp->uc_mcontext.Esp = (DWORD) sp - sizeof(void*);\r
#endif\r
#ifdef _IA64_\r
# error "_IA64_"\r
#endif\r
#ifdef _AMD64_\r
- ucp->uc_mcontext.Rip = (unsigned long long) func;\r
- ucp->uc_mcontext.Rsp = (unsigned long long) sp - 8;\r
+ ucp->uc_mcontext.Rip = (DWORD64) func;\r
+ ucp->uc_mcontext.Rsp = (DWORD64) sp - sizeof(void*);\r
#endif\r
\r
/* Save/Restore the full machine context */ \r
- ucp->uc_mcontext.ContextFlags = CONTEXT_FULL;\r
+ ucp->uc_mcontext.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS;\r
\r
/* Copy the arguments */ \r
va_start(ap, argc);\r
for (i = 0; i < argc; i++) {\r
- memcpy(sp, ap, 8);\r
- ap += 8;\r
- sp += 8;\r
+ memcpy(sp, ap, sizeof(void*));\r
+ ap += sizeof(void*);\r
+ sp += sizeof(void*);\r
}\r
va_end(ap);\r
return 0;\r