X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/2f93912677c9c5df63406a714b031993a7455d6c..d90a41491cfb04188c4469729fa60d01ec0ff693:/src/xbt/win32_ucontext.c diff --git a/src/xbt/win32_ucontext.c b/src/xbt/win32_ucontext.c index 757eb43a70..b6d5caf9fb 100644 --- a/src/xbt/win32_ucontext.c +++ b/src/xbt/win32_ucontext.c @@ -21,12 +21,13 @@ */ #include "win32_ucontext.h" + int getcontext(ucontext_t * ucp) { int ret; /* Retrieve the full machine context */ - ucp->uc_mcontext.ContextFlags = CONTEXT_FULL; + ucp->uc_mcontext.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS; ret = GetThreadContext(GetCurrentThread(), &ucp->uc_mcontext); return (ret == 0) ? -1 : 0; } @@ -45,12 +46,12 @@ int makecontext(ucontext_t * ucp, void (*func) (), int argc, ...) int i; va_list ap; char *sp; - - /* Stack grows down */ + + /* Stack grows down */ sp = (char *) (size_t) ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size; /* Reserve stack space for the arguments (maximum possible: argc*(8 bytes per argument)) */ - sp -= argc * 8; + sp -= argc * sizeof(void*); if (sp < (char *) ucp->uc_stack.ss_sp) { /* errno = ENOMEM; */ @@ -58,27 +59,27 @@ int makecontext(ucontext_t * ucp, void (*func) (), int argc, ...) } /* Set the instruction and the stack pointer */ - #ifdef I_X86_ - ucp->uc_mcontext.Eip = (unsigned long) func; - ucp->uc_mcontext.Esp = (unsigned long) sp - 4; + #ifdef _I_X86_ + ucp->uc_mcontext.Eip = (DWORD) func; + ucp->uc_mcontext.Esp = (DWORD) sp - sizeof(void*); #endif #ifdef _IA64_ # error "_IA64_" #endif #ifdef _AMD64_ - ucp->uc_mcontext.Rip = (unsigned long long) func; - ucp->uc_mcontext.Rsp = (unsigned long long) sp - 8; + ucp->uc_mcontext.Rip = (DWORD64) func; + ucp->uc_mcontext.Rsp = (DWORD64) sp - sizeof(void*); #endif /* Save/Restore the full machine context */ - ucp->uc_mcontext.ContextFlags = CONTEXT_FULL; + ucp->uc_mcontext.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS; /* Copy the arguments */ va_start(ap, argc); for (i = 0; i < argc; i++) { - memcpy(sp, ap, 8); - ap += 8; - sp += 8; + memcpy(sp, ap, sizeof(void*)); + ap += sizeof(void*); + sp += sizeof(void*); } va_end(ap); return 0;