X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Futils%2Fmono-context.c;h=59ef74b215c1b642bc2967402a7f42d941be5ae5;hb=f86145e5589879e84a0982598d37ad0b8d6953ee;hp=632513d874f7c8069bd6a1ee0d57c23b1c06bdd3;hpb=3e81958f1dd4cecb97167c5b3cb5541bda31c444;p=mono.git diff --git a/mono/utils/mono-context.c b/mono/utils/mono-context.c index 632513d874f..59ef74b215c 100644 --- a/mono/utils/mono-context.c +++ b/mono/utils/mono-context.c @@ -1,5 +1,6 @@ -/* - * mono-context.c: plat independent machine state definitions +/** + * \file + * plat independent machine state definitions * * * Copyright (c) 2011 Novell, Inc (http://www.novell.com) @@ -35,7 +36,7 @@ void mono_sigctx_to_monoctx (void *sigctx, MonoContext *mctx) { -#if defined (__native_client__) || defined (HOST_WATCHOS) +#if defined (HOST_WATCHOS) printf("WARNING: mono_arch_sigctx_to_monoctx() called!\n"); mctx->eax = 0xDEADBEEF; mctx->ebx = 0xDEADBEEF; @@ -60,6 +61,16 @@ 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); +#ifdef UCONTEXT_REG_XMM + mctx->fregs [0] = UCONTEXT_REG_XMM0 (ctx); + mctx->fregs [1] = UCONTEXT_REG_XMM1 (ctx); + mctx->fregs [2] = UCONTEXT_REG_XMM2 (ctx); + mctx->fregs [3] = UCONTEXT_REG_XMM3 (ctx); + mctx->fregs [4] = UCONTEXT_REG_XMM4 (ctx); + mctx->fregs [5] = UCONTEXT_REG_XMM5 (ctx); + mctx->fregs [6] = UCONTEXT_REG_XMM6 (ctx); + mctx->fregs [7] = UCONTEXT_REG_XMM7 (ctx); +#endif #elif defined(HOST_WIN32) CONTEXT *context = (CONTEXT*)sigctx; @@ -84,13 +95,13 @@ mono_sigctx_to_monoctx (void *sigctx, MonoContext *mctx) mctx->esi = ctx->SC_ESI; mctx->edi = ctx->SC_EDI; mctx->eip = ctx->SC_EIP; -#endif /* if defined(__native_client__) */ +#endif } void mono_monoctx_to_sigctx (MonoContext *mctx, void *sigctx) { -#if defined(__native_client__) || defined(HOST_WATCHOS) +#if defined(HOST_WATCHOS) printf("WARNING: mono_arch_monoctx_to_sigctx() called!\n"); #elif MONO_CROSS_COMPILE g_assert_not_reached (); @@ -106,6 +117,16 @@ 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; +#ifdef UCONTEXT_REG_XMM + UCONTEXT_REG_XMM0 (ctx) = mctx->fregs [0]; + UCONTEXT_REG_XMM1 (ctx) = mctx->fregs [1]; + UCONTEXT_REG_XMM2 (ctx) = mctx->fregs [2]; + UCONTEXT_REG_XMM3 (ctx) = mctx->fregs [3]; + UCONTEXT_REG_XMM4 (ctx) = mctx->fregs [4]; + UCONTEXT_REG_XMM5 (ctx) = mctx->fregs [5]; + UCONTEXT_REG_XMM6 (ctx) = mctx->fregs [6]; + UCONTEXT_REG_XMM7 (ctx) = mctx->fregs [7]; +#endif #elif defined(HOST_WIN32) CONTEXT *context = (CONTEXT*)sigctx; @@ -130,7 +151,7 @@ mono_monoctx_to_sigctx (MonoContext *mctx, void *sigctx) ctx->SC_ESI = mctx->esi; ctx->SC_EDI = mctx->edi; ctx->SC_EIP = mctx->eip; -#endif /* __native_client__ */ +#endif } #elif (defined(__x86_64__) && !defined(MONO_CROSS_COMPILE)) || (defined(TARGET_AMD64)) /* defined(__i386__) */ @@ -144,10 +165,6 @@ mono_monoctx_to_sigctx (MonoContext *mctx, void *sigctx) void mono_sigctx_to_monoctx (void *sigctx, MonoContext *mctx) { -#if defined(__native_client_codegen__) || defined(__native_client__) - printf("WARNING: mono_arch_sigctx_to_monoctx() called!\n"); -#endif - #ifdef MONO_CROSS_COMPILE g_assert_not_reached (); #elif defined(MONO_SIGNAL_USE_UCONTEXT_T) @@ -170,6 +187,26 @@ mono_sigctx_to_monoctx (void *sigctx, MonoContext *mctx) mctx->gregs [AMD64_R14] = UCONTEXT_REG_R14 (ctx); mctx->gregs [AMD64_R15] = UCONTEXT_REG_R15 (ctx); mctx->gregs [AMD64_RIP] = UCONTEXT_REG_RIP (ctx); + +#ifdef UCONTEXT_REG_XMM + mctx->fregs [0] = UCONTEXT_REG_XMM0 (ctx); + mctx->fregs [1] = UCONTEXT_REG_XMM1 (ctx); + mctx->fregs [2] = UCONTEXT_REG_XMM2 (ctx); + mctx->fregs [3] = UCONTEXT_REG_XMM3 (ctx); + mctx->fregs [4] = UCONTEXT_REG_XMM4 (ctx); + mctx->fregs [5] = UCONTEXT_REG_XMM5 (ctx); + mctx->fregs [6] = UCONTEXT_REG_XMM6 (ctx); + mctx->fregs [7] = UCONTEXT_REG_XMM7 (ctx); + mctx->fregs [8] = UCONTEXT_REG_XMM8 (ctx); + mctx->fregs [9] = UCONTEXT_REG_XMM9 (ctx); + mctx->fregs [10] = UCONTEXT_REG_XMM10 (ctx); + mctx->fregs [11] = UCONTEXT_REG_XMM11 (ctx); + mctx->fregs [12] = UCONTEXT_REG_XMM12 (ctx); + mctx->fregs [13] = UCONTEXT_REG_XMM13 (ctx); + mctx->fregs [14] = UCONTEXT_REG_XMM14 (ctx); + mctx->fregs [15] = UCONTEXT_REG_XMM15 (ctx); +#endif + #elif defined(HOST_WIN32) CONTEXT *context = (CONTEXT*)sigctx; @@ -198,10 +235,6 @@ mono_sigctx_to_monoctx (void *sigctx, MonoContext *mctx) void mono_monoctx_to_sigctx (MonoContext *mctx, void *sigctx) { -#if defined(__native_client__) || defined(__native_client_codegen__) - printf("WARNING: mono_arch_monoctx_to_sigctx() called!\n"); -#endif - #ifdef MONO_CROSS_COMPILE g_assert_not_reached (); #elif defined(MONO_SIGNAL_USE_UCONTEXT_T) @@ -224,6 +257,26 @@ mono_monoctx_to_sigctx (MonoContext *mctx, void *sigctx) UCONTEXT_REG_R14 (ctx) = mctx->gregs [AMD64_R14]; UCONTEXT_REG_R15 (ctx) = mctx->gregs [AMD64_R15]; UCONTEXT_REG_RIP (ctx) = mctx->gregs [AMD64_RIP]; + +#ifdef UCONTEXT_REG_XMM + UCONTEXT_REG_XMM0 (ctx) = mctx->fregs [0]; + UCONTEXT_REG_XMM1 (ctx) = mctx->fregs [1]; + UCONTEXT_REG_XMM2 (ctx) = mctx->fregs [2]; + UCONTEXT_REG_XMM3 (ctx) = mctx->fregs [3]; + UCONTEXT_REG_XMM4 (ctx) = mctx->fregs [4]; + UCONTEXT_REG_XMM5 (ctx) = mctx->fregs [5]; + UCONTEXT_REG_XMM6 (ctx) = mctx->fregs [6]; + UCONTEXT_REG_XMM7 (ctx) = mctx->fregs [7]; + UCONTEXT_REG_XMM8 (ctx) = mctx->fregs [8]; + UCONTEXT_REG_XMM9 (ctx) = mctx->fregs [9]; + UCONTEXT_REG_XMM10 (ctx) = mctx->fregs [10]; + UCONTEXT_REG_XMM11 (ctx) = mctx->fregs [11]; + UCONTEXT_REG_XMM12 (ctx) = mctx->fregs [12]; + UCONTEXT_REG_XMM13 (ctx) = mctx->fregs [13]; + UCONTEXT_REG_XMM14 (ctx) = mctx->fregs [14]; + UCONTEXT_REG_XMM15 (ctx) = mctx->fregs [15]; +#endif + #elif defined(HOST_WIN32) CONTEXT *context = (CONTEXT*)sigctx; @@ -297,8 +350,6 @@ 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; @@ -317,8 +368,6 @@ 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; @@ -346,10 +395,15 @@ mono_sigctx_to_monoctx (void *sigctx, MonoContext *mctx) 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. - */ +#ifdef __linux__ + struct fpsimd_context *fpctx = (struct fpsimd_context*)&((ucontext_t*)sigctx)->uc_mcontext.__reserved; + int i; + + g_assert (fpctx->head.magic == FPSIMD_MAGIC); + for (i = 0; i < 32; ++i) + mctx->fregs [i] = fpctx->vregs [i]; +#endif + /* FIXME: apple */ #endif } @@ -406,8 +460,9 @@ mono_sigctx_to_monoctx (void *sigctx, MonoContext *mctx) 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); + + memcpy (&mctx->regs, &UCONTEXT_REG_Rn(uc, 0), sizeof (mgreg_t) * MONO_MAX_IREGS); + memcpy (&mctx->fregs, &UCONTEXT_REG_FPRn(uc, 0), sizeof (double) * MONO_MAX_FREGS); } void @@ -415,10 +470,12 @@ mono_monoctx_to_sigctx (MonoContext *mctx, void *sigctx) { os_ucontext *uc = sigctx; + memcpy (&UCONTEXT_REG_Rn(uc, 0), &mctx->regs, sizeof (mgreg_t) * MONO_MAX_IREGS); + memcpy (&UCONTEXT_REG_FPRn(uc, 0), &mctx->fregs, sizeof (double) * MONO_MAX_FREGS); + + /* The valid values for pc and sp are stored here and not in regs array */ 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__) */