Merge pull request #1593 from kumpera/new_suspend
[mono.git] / mono / utils / mono-context.c
index 81e2fe69b353d55e41be11e2874a025cb9006575..0db9dce4154d6304e28c357952c3c7838f918575 100644 (file)
 
 #include <mono/utils/mono-context.h>
 
+#ifdef HOST_WIN32
+#include <windows.h>
+#endif
+
 #ifdef __sun
 #define REG_EAX EAX
 #define REG_EBX EBX
@@ -53,6 +57,18 @@ mono_sigctx_to_monoctx (void *sigctx, MonoContext *mctx)
        mctx->esi = UCONTEXT_REG_ESI (ctx);
        mctx->edi = UCONTEXT_REG_EDI (ctx);
        mctx->eip = UCONTEXT_REG_EIP (ctx);
+#elif defined(HOST_WIN32)
+       CONTEXT *context = (CONTEXT*)sigctx;
+
+       mctx->eip = context->Eip;
+       mctx->edi = context->Edi;
+       mctx->esi = context->Esi;
+       mctx->ebx = context->Ebx;
+       mctx->edx = context->Edx;
+       mctx->ecx = context->Ecx;
+       mctx->eax = context->Eax;
+       mctx->ebp = context->Ebp;
+       mctx->esp = context->Esp;
 #else  
        struct sigcontext *ctx = (struct sigcontext *)sigctx;
 
@@ -85,6 +101,18 @@ mono_monoctx_to_sigctx (MonoContext *mctx, void *sigctx)
        UCONTEXT_REG_ESI (ctx) = mctx->esi;
        UCONTEXT_REG_EDI (ctx) = mctx->edi;
        UCONTEXT_REG_EIP (ctx) = mctx->eip;
+#elif defined(HOST_WIN32)
+       CONTEXT *context = (CONTEXT*)sigctx;
+
+       context->Eip = mctx->eip;
+       context->Edi = mctx->edi;
+       context->Esi = mctx->esi;
+       context->Ebx = mctx->ebx;
+       context->Edx = mctx->edx;
+       context->Ecx = mctx->ecx;
+       context->Eax = mctx->eax;
+       context->Ebp = mctx->ebp;
+       context->Esp = mctx->esp;
 #else
        struct sigcontext *ctx = (struct sigcontext *)sigctx;
 
@@ -104,6 +132,10 @@ mono_monoctx_to_sigctx (MonoContext *mctx, void *sigctx)
 
 #include <mono/utils/mono-context.h>
 
+#ifdef HOST_WIN32
+#include <windows.h>
+#endif
+
 void
 mono_sigctx_to_monoctx (void *sigctx, MonoContext *mctx)
 {
@@ -131,6 +163,26 @@ mono_sigctx_to_monoctx (void *sigctx, MonoContext *mctx)
        mctx->r14 = UCONTEXT_REG_R14 (ctx);
        mctx->r15 = UCONTEXT_REG_R15 (ctx);
        mctx->rip = UCONTEXT_REG_RIP (ctx);
+#elif defined(HOST_WIN32)
+       CONTEXT *context = (CONTEXT*)sigctx;
+
+       mctx->rip = context->Rip;
+       mctx->rax = context->Rax;
+       mctx->rcx = context->Rcx;
+       mctx->rdx = context->Rdx;
+       mctx->rbx = context->Rbx;
+       mctx->rsp = context->Rsp;
+       mctx->rbp = context->Rbp;
+       mctx->rsi = context->Rsi;
+       mctx->rdi = context->Rdi;
+       mctx->r8 = context->R8;
+       mctx->r9 = context->R9;
+       mctx->r10 = context->R10;
+       mctx->r11 = context->R11;
+       mctx->r12 = context->R12;
+       mctx->r13 = context->R13;
+       mctx->r14 = context->R14;
+       mctx->r15 = context->R15;
 #else
        MonoContext *ctx = (MonoContext *)sigctx;
 
@@ -181,6 +233,26 @@ mono_monoctx_to_sigctx (MonoContext *mctx, void *sigctx)
        UCONTEXT_REG_R14 (ctx) = mctx->r14;
        UCONTEXT_REG_R15 (ctx) = mctx->r15;
        UCONTEXT_REG_RIP (ctx) = mctx->rip;
+#elif defined(HOST_WIN32)
+       CONTEXT *context = (CONTEXT*)sigctx;
+
+       context->Rip = mctx->rip;
+       context->Rax = mctx->rax;
+       context->Rcx = mctx->rcx;
+       context->Rdx = mctx->rdx;
+       context->Rbx = mctx->rbx;
+       context->Rsp = mctx->rsp;
+       context->Rbp = mctx->rbp;
+       context->Rsi = mctx->rsi;
+       context->Rdi = mctx->rdi;
+       context->R8 = mctx->r8;
+       context->R9 = mctx->r9;
+       context->R10 = mctx->r10;
+       context->R11 = mctx->r11;
+       context->R12 = mctx->r12;
+       context->R13 = mctx->r13;
+       context->R14 = mctx->r14;
+       context->R15 = mctx->r15;
 #else
        MonoContext *ctx = (MonoContext *)sigctx;
 
@@ -252,6 +324,8 @@ mono_sigctx_to_monoctx (void *sigctx, MonoContext *mctx)
 {
 #ifdef MONO_CROSS_COMPILE
        g_assert_not_reached ();
+#elif defined(__native_client__)
+       g_assert_not_reached ();
 #else
        arm_ucontext *my_uc = sigctx;
 
@@ -270,6 +344,8 @@ mono_monoctx_to_sigctx (MonoContext *mctx, void *ctx)
 {
 #ifdef MONO_CROSS_COMPILE
        g_assert_not_reached ();
+#elif defined(__native_client__)
+       g_assert_not_reached ();
 #else
        arm_ucontext *my_uc = ctx;
 
@@ -284,6 +360,38 @@ mono_monoctx_to_sigctx (MonoContext *mctx, void *ctx)
 #endif
 }
 
+#elif (defined(__aarch64__) && !defined(MONO_CROSS_COMPILE)) || (defined(TARGET_ARM64))
+
+#include <mono/utils/mono-context.h>
+
+void
+mono_sigctx_to_monoctx (void *sigctx, MonoContext *mctx)
+{
+#ifdef MONO_CROSS_COMPILE
+       g_assert_not_reached ();
+#else
+       memcpy (mctx->regs, UCONTEXT_GREGS (sigctx), sizeof (mgreg_t) * 31);
+       mctx->pc = UCONTEXT_REG_PC (sigctx);
+       mctx->regs [ARMREG_SP] = UCONTEXT_REG_SP (sigctx);
+       /*
+        * We don't handle fp regs, this is not currrently a
+        * problem, since we don't allocate them globally.
+        */
+#endif
+}
+
+void
+mono_monoctx_to_sigctx (MonoContext *mctx, void *sigctx)
+{
+#ifdef MONO_CROSS_COMPILE
+       g_assert_not_reached ();
+#else
+       memcpy (UCONTEXT_GREGS (sigctx), mctx->regs, sizeof (mgreg_t) * 31);
+       UCONTEXT_REG_PC (sigctx) = mctx->pc;
+       UCONTEXT_REG_SP (sigctx) = mctx->regs [ARMREG_SP];
+#endif
+}
+
 #elif (defined(__mips__) && !defined(MONO_CROSS_COMPILE)) || (defined(TARGET_MIPS))
 
 #include <mono/utils/mono-context.h>
@@ -313,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__) */