X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Futils%2Fmono-context.c;h=81f3ca84ec30ae4da29072e8b9db66d8beb0a4d4;hb=cff7efdb32771201078d0c1a0df2be714a66c6f1;hp=942ff0baf86233a99fd33ddf223dac3de2232db3;hpb=6a951cfe9eb9e5df0ea8bb79ff7e7eab01fde35e;p=mono.git diff --git a/mono/utils/mono-context.c b/mono/utils/mono-context.c index 942ff0baf86..81f3ca84ec3 100644 --- a/mono/utils/mono-context.c +++ b/mono/utils/mono-context.c @@ -11,7 +11,7 @@ #include #endif -#if defined(__i386__) +#if (defined(__i386__) && !defined(MONO_CROSS_COMPILE)) || (defined(TARGET_X86)) #include @@ -100,7 +100,7 @@ mono_monoctx_to_sigctx (MonoContext *mctx, void *sigctx) #endif /* __native_client__ */ } -#elif defined(__x86_64__) /* defined(__i386__) */ +#elif (defined(__x86_64__) && !defined(MONO_CROSS_COMPILE)) || (defined(TARGET_AMD64)) /* defined(__i386__) */ #include @@ -241,24 +241,29 @@ mono_monoctx_to_sigctx (MonoContext *mctx, void *ctx) /*========================= End of Function ========================*/ -#elif defined(__arm__) +#elif (defined(__arm__) && !defined(MONO_CROSS_COMPILE)) || (defined(TARGET_ARM)) #include #include +#include void mono_sigctx_to_monoctx (void *sigctx, MonoContext *mctx) { #ifdef MONO_CROSS_COMPILE g_assert_not_reached (); -#elif BROKEN_LINUX +#elif defined(__native_client__) g_assert_not_reached (); #else arm_ucontext *my_uc = sigctx; - mctx->eip = UCONTEXT_REG_PC (my_uc); - mctx->esp = UCONTEXT_REG_SP (my_uc); + mctx->pc = UCONTEXT_REG_PC (my_uc); + mctx->regs [ARMREG_SP] = UCONTEXT_REG_SP (my_uc); + mctx->cpsr = UCONTEXT_REG_CPSR (my_uc); memcpy (&mctx->regs, &UCONTEXT_REG_R0 (my_uc), sizeof (mgreg_t) * 16); +#ifdef UCONTEXT_REG_VFPREGS + memcpy (&mctx->fregs, UCONTEXT_REG_VFPREGS (my_uc), sizeof (double) * 16); +#endif #endif } @@ -267,14 +272,49 @@ 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; - UCONTEXT_REG_PC (my_uc) = mctx->eip; - UCONTEXT_REG_SP (my_uc) = mctx->regs [ARMREG_FP]; + UCONTEXT_REG_PC (my_uc) = mctx->pc; + UCONTEXT_REG_SP (my_uc) = mctx->regs [ARMREG_SP]; + UCONTEXT_REG_CPSR (my_uc) = mctx->cpsr; /* The upper registers are not guaranteed to be valid */ memcpy (&UCONTEXT_REG_R0 (my_uc), &mctx->regs, sizeof (mgreg_t) * 12); +#ifdef UCONTEXT_REG_VFPREGS + memcpy (UCONTEXT_REG_VFPREGS (my_uc), &mctx->fregs, sizeof (double) * 16); +#endif #endif } +#elif (defined(__mips__) && !defined(MONO_CROSS_COMPILE)) || (defined(TARGET_MIPS)) + +#include +#include + +void +mono_sigctx_to_monoctx (void *sigctx, MonoContext *mctx) +{ + int i; + + mctx->sc_pc = UCONTEXT_REG_PC (sigctx); + for (i = 0; i < 32; ++i) { + mctx->sc_regs[i] = UCONTEXT_GREGS (sigctx) [i]; + mctx->sc_fpregs[i] = UCONTEXT_FPREGS (sigctx) [i]; + } +} + +void +mono_monoctx_to_sigctx (MonoContext *mctx, void *sigctx) +{ + int i; + + UCONTEXT_REG_PC (sigctx) = mctx->sc_pc; + for (i = 0; i < 32; ++i) { + UCONTEXT_GREGS (sigctx) [i] = mctx->sc_regs[i]; + UCONTEXT_FPREGS (sigctx) [i] = mctx->sc_fpregs[i]; + } +} + #endif /* #if defined(__i386__) */