Merge pull request #1593 from kumpera/new_suspend
[mono.git] / mono / utils / mono-context.c
index 02fa8c8701c34f1eac0eb9eb2905f3fc9e733f59..0db9dce4154d6304e28c357952c3c7838f918575 100644 (file)
@@ -60,6 +60,7 @@ mono_sigctx_to_monoctx (void *sigctx, MonoContext *mctx)
 #elif defined(HOST_WIN32)
        CONTEXT *context = (CONTEXT*)sigctx;
 
+       mctx->eip = context->Eip;
        mctx->edi = context->Edi;
        mctx->esi = context->Esi;
        mctx->ebx = context->Ebx;
@@ -420,4 +421,31 @@ mono_monoctx_to_sigctx (MonoContext *mctx, void *sigctx)
        }
 }
 
+#elif (((defined(__ppc__) || defined(__powerpc__) || defined(__ppc64__)) && !defined(MONO_CROSS_COMPILE))) || (defined(TARGET_POWERPC))
+
+#include <mono/utils/mono-context.h>
+#include <mono/mini/mini-ppc.h>
+
+void
+mono_sigctx_to_monoctx (void *sigctx, MonoContext *mctx)
+{
+       os_ucontext *uc = sigctx;
+
+       mctx->sc_ir = UCONTEXT_REG_NIP(uc);
+       mctx->sc_sp = UCONTEXT_REG_Rn(uc, 1);
+       memcpy (&mctx->regs, &UCONTEXT_REG_Rn(uc, 13), sizeof (mgreg_t) * MONO_SAVED_GREGS);
+       memcpy (&mctx->fregs, &UCONTEXT_REG_FPRn(uc, 14), sizeof (double) * MONO_SAVED_FREGS);
+}
+
+void
+mono_monoctx_to_sigctx (MonoContext *mctx, void *sigctx)
+{
+       os_ucontext *uc = sigctx;
+
+       UCONTEXT_REG_NIP(uc) = mctx->sc_ir;
+       UCONTEXT_REG_Rn(uc, 1) = mctx->sc_sp;
+       memcpy (&UCONTEXT_REG_Rn(uc, 13), &mctx->regs, sizeof (mgreg_t) * MONO_SAVED_GREGS);
+       memcpy (&UCONTEXT_REG_FPRn(uc, 14), &mctx->fregs, sizeof (double) * MONO_SAVED_FREGS);
+}
+
 #endif /* #if defined(__i386__) */