X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Futils%2Fmono-context.c;h=81f3ca84ec30ae4da29072e8b9db66d8beb0a4d4;hb=c71c7fd1965b16a86d2b5ef2bd2b11cfdfff2294;hp=6d524a67878c6c9ffd876d618f0e8896cfbbe63b;hpb=868184c1f4ca7b95c58aba36775f3c17ab903202;p=mono.git diff --git a/mono/utils/mono-context.c b/mono/utils/mono-context.c index 6d524a67878..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 @@ -204,4 +204,117 @@ mono_monoctx_to_sigctx (MonoContext *mctx, void *sigctx) #endif } +#elif defined(__s390x__) + +#include + +/*------------------------------------------------------------------*/ +/* */ +/* Name - mono_arch_sigctx_to_monoctx. */ +/* */ +/* Function - Called from the signal handler to convert signal */ +/* context to MonoContext. */ +/* */ +/*------------------------------------------------------------------*/ + +void +mono_sigctx_to_monoctx (void *ctx, MonoContext *mctx) +{ + memcpy (mctx, ctx, sizeof(MonoContext)); +} + +/*========================= End of Function ========================*/ + +/*------------------------------------------------------------------*/ +/* */ +/* Name - mono_arch_monoctx_to_sigctx. */ +/* */ +/* Function - Convert MonoContext structure to signal context. */ +/* */ +/*------------------------------------------------------------------*/ + +void +mono_monoctx_to_sigctx (MonoContext *mctx, void *ctx) +{ + memcpy (ctx, mctx, sizeof(MonoContext)); +} + +/*========================= End of Function ========================*/ + +#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 defined(__native_client__) + g_assert_not_reached (); +#else + arm_ucontext *my_uc = sigctx; + + 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 +} + +void +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->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__) */