void mono_arch_monoctx_to_sigctx (MonoContext *mctx, void *sigctx) { #if defined(__native_client__) printf("WARNING: mono_arch_monoctx_to_sigctx() called!\n"); #else #ifdef MONO_ARCH_USE_SIGACTION ucontext_t *ctx = (ucontext_t*)sigctx; UCONTEXT_REG_EAX (ctx) = mctx->eax; UCONTEXT_REG_EBX (ctx) = mctx->ebx; UCONTEXT_REG_ECX (ctx) = mctx->ecx; UCONTEXT_REG_EDX (ctx) = mctx->edx; UCONTEXT_REG_EBP (ctx) = mctx->ebp; UCONTEXT_REG_ESP (ctx) = mctx->esp; UCONTEXT_REG_ESI (ctx) = mctx->esi; UCONTEXT_REG_EDI (ctx) = mctx->edi; UCONTEXT_REG_EIP (ctx) = mctx->eip; #else struct sigcontext *ctx = (struct sigcontext *)sigctx; ctx->SC_EAX = mctx->eax; ctx->SC_EBX = mctx->ebx; ctx->SC_ECX = mctx->ecx; ctx->SC_EDX = mctx->edx; ctx->SC_EBP = mctx->ebp; ctx->SC_ESP = mctx->esp; ctx->SC_ESI = mctx->esi; ctx->SC_EDI = mctx->edi; ctx->SC_EIP = mctx->eip; #endif #endif /* __native_client__ */ }
void mono_arch_monoctx_to_sigctx (MonoContext *mctx, void *sigctx) { #ifdef MONO_ARCH_USE_SIGACTION ucontext_t *ctx = (ucontext_t*)sigctx; UCONTEXT_REG_EAX (ctx) = mctx->eax; UCONTEXT_REG_EBX (ctx) = mctx->ebx; UCONTEXT_REG_ECX (ctx) = mctx->ecx; UCONTEXT_REG_EDX (ctx) = mctx->edx; UCONTEXT_REG_EBP (ctx) = mctx->ebp; UCONTEXT_REG_ESP (ctx) = mctx->esp; UCONTEXT_REG_ESI (ctx) = mctx->esi; UCONTEXT_REG_EDI (ctx) = mctx->edi; UCONTEXT_REG_EIP (ctx) = mctx->eip; #else struct sigcontext *ctx = (struct sigcontext *)sigctx; ctx->SC_EAX = mctx->eax; ctx->SC_EBX = mctx->ebx; ctx->SC_ECX = mctx->ecx; ctx->SC_EDX = mctx->edx; ctx->SC_EBP = mctx->ebp; ctx->SC_ESP = mctx->esp; ctx->SC_ESI = mctx->esi; ctx->SC_EDI = mctx->edi; ctx->SC_EIP = mctx->eip; #endif }
void mono_arch_sigctx_to_monoctx (void *sigctx, MonoContext *mctx) { #ifdef MONO_ARCH_USE_SIGACTION ucontext_t *ctx = (ucontext_t*)sigctx; mctx->eax = UCONTEXT_REG_EAX (ctx); mctx->ebx = UCONTEXT_REG_EBX (ctx); mctx->ecx = UCONTEXT_REG_ECX (ctx); mctx->edx = UCONTEXT_REG_EDX (ctx); mctx->ebp = UCONTEXT_REG_EBP (ctx); mctx->esp = UCONTEXT_REG_ESP (ctx); mctx->esi = UCONTEXT_REG_ESI (ctx); mctx->edi = UCONTEXT_REG_EDI (ctx); mctx->eip = UCONTEXT_REG_EIP (ctx); #else struct sigcontext *ctx = (struct sigcontext *)sigctx; mctx->eax = ctx->SC_EAX; mctx->ebx = ctx->SC_EBX; mctx->ecx = ctx->SC_ECX; mctx->edx = ctx->SC_EDX; mctx->ebp = ctx->SC_EBP; mctx->esp = ctx->SC_ESP; mctx->esi = ctx->SC_ESI; mctx->edi = ctx->SC_EDI; mctx->eip = ctx->SC_EIP; #endif }
void mono_monoctx_to_sigctx (MonoContext *mctx, void *sigctx) { #if defined(__native_client__) || defined(HOST_WATCHOS) printf("WARNING: mono_arch_monoctx_to_sigctx() called!\n"); #elif MONO_CROSS_COMPILE g_assert_not_reached (); #elif defined(MONO_SIGNAL_USE_UCONTEXT_T) ucontext_t *ctx = (ucontext_t*)sigctx; UCONTEXT_REG_EAX (ctx) = mctx->eax; UCONTEXT_REG_EBX (ctx) = mctx->ebx; UCONTEXT_REG_ECX (ctx) = mctx->ecx; UCONTEXT_REG_EDX (ctx) = mctx->edx; UCONTEXT_REG_EBP (ctx) = mctx->ebp; UCONTEXT_REG_ESP (ctx) = mctx->esp; 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; 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; ctx->SC_EAX = mctx->eax; ctx->SC_EBX = mctx->ebx; ctx->SC_ECX = mctx->ecx; ctx->SC_EDX = mctx->edx; ctx->SC_EBP = mctx->ebp; ctx->SC_ESP = mctx->esp; ctx->SC_ESI = mctx->esi; ctx->SC_EDI = mctx->edi; ctx->SC_EIP = mctx->eip; #endif /* __native_client__ */ }
void mono_sigctx_to_monoctx (void *sigctx, MonoContext *mctx) { #if defined (__native_client__) || defined (HOST_WATCHOS) printf("WARNING: mono_arch_sigctx_to_monoctx() called!\n"); mctx->eax = 0xDEADBEEF; mctx->ebx = 0xDEADBEEF; mctx->ecx = 0xDEADBEEF; mctx->edx = 0xDEADBEEF; mctx->ebp = 0xDEADBEEF; mctx->esp = 0xDEADBEEF; mctx->esi = 0xDEADBEEF; mctx->edi = 0xDEADBEEF; mctx->eip = 0xDEADBEEF; #elif MONO_CROSS_COMPILE g_assert_not_reached (); #elif defined(MONO_SIGNAL_USE_UCONTEXT_T) ucontext_t *ctx = (ucontext_t*)sigctx; mctx->eax = UCONTEXT_REG_EAX (ctx); mctx->ebx = UCONTEXT_REG_EBX (ctx); mctx->ecx = UCONTEXT_REG_ECX (ctx); mctx->edx = UCONTEXT_REG_EDX (ctx); mctx->ebp = UCONTEXT_REG_EBP (ctx); mctx->esp = UCONTEXT_REG_ESP (ctx); 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; mctx->eax = ctx->SC_EAX; mctx->ebx = ctx->SC_EBX; mctx->ecx = ctx->SC_ECX; mctx->edx = ctx->SC_EDX; mctx->ebp = ctx->SC_EBP; mctx->esp = ctx->SC_ESP; mctx->esi = ctx->SC_ESI; mctx->edi = ctx->SC_EDI; mctx->eip = ctx->SC_EIP; #endif /* if defined(__native_client__) */ }
void mono_monoctx_to_sigctx (MonoContext *mctx, void *sigctx) { #if defined(__native_client__) printf("WARNING: mono_arch_monoctx_to_sigctx() called!\n"); #elif defined(MONO_SIGNAL_USE_SIGACTION) ucontext_t *ctx = (ucontext_t*)sigctx; UCONTEXT_REG_EAX (ctx) = mctx->eax; UCONTEXT_REG_EBX (ctx) = mctx->ebx; UCONTEXT_REG_ECX (ctx) = mctx->ecx; UCONTEXT_REG_EDX (ctx) = mctx->edx; UCONTEXT_REG_EBP (ctx) = mctx->ebp; UCONTEXT_REG_ESP (ctx) = mctx->esp; 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; ctx->SC_EAX = mctx->eax; ctx->SC_EBX = mctx->ebx; ctx->SC_ECX = mctx->ecx; ctx->SC_EDX = mctx->edx; ctx->SC_EBP = mctx->ebp; ctx->SC_ESP = mctx->esp; ctx->SC_ESI = mctx->esi; ctx->SC_EDI = mctx->edi; ctx->SC_EIP = mctx->eip; #endif /* __native_client__ */ }
void mono_arch_sigctx_to_monoctx (void *sigctx, MonoContext *mctx) { #if defined (__native_client__) printf("WARNING: mono_arch_sigctx_to_monoctx() called!\n"); mctx->eax = 0xDEADBEEF; mctx->ebx = 0xDEADBEEF; mctx->ecx = 0xDEADBEEF; mctx->edx = 0xDEADBEEF; mctx->ebp = 0xDEADBEEF; mctx->esp = 0xDEADBEEF; mctx->esi = 0xDEADBEEF; mctx->edi = 0xDEADBEEF; mctx->eip = 0xDEADBEEF; #else #ifdef MONO_ARCH_USE_SIGACTION ucontext_t *ctx = (ucontext_t*)sigctx; mctx->eax = UCONTEXT_REG_EAX (ctx); mctx->ebx = UCONTEXT_REG_EBX (ctx); mctx->ecx = UCONTEXT_REG_ECX (ctx); mctx->edx = UCONTEXT_REG_EDX (ctx); mctx->ebp = UCONTEXT_REG_EBP (ctx); mctx->esp = UCONTEXT_REG_ESP (ctx); mctx->esi = UCONTEXT_REG_ESI (ctx); mctx->edi = UCONTEXT_REG_EDI (ctx); mctx->eip = UCONTEXT_REG_EIP (ctx); #else struct sigcontext *ctx = (struct sigcontext *)sigctx; mctx->eax = ctx->SC_EAX; mctx->ebx = ctx->SC_EBX; mctx->ecx = ctx->SC_ECX; mctx->edx = ctx->SC_EDX; mctx->ebp = ctx->SC_EBP; mctx->esp = ctx->SC_ESP; mctx->esi = ctx->SC_ESI; mctx->edi = ctx->SC_EDI; mctx->eip = ctx->SC_EIP; #endif #endif /* if defined(__native_client__) */ }
gboolean mono_arch_handle_exception (void *sigctx, gpointer obj, gboolean test_only) { #if defined(MONO_ARCH_USE_SIGACTION) ucontext_t *ctx = (ucontext_t*)sigctx; /* * Handling the exception in the signal handler is problematic, since the original * signal is disabled, and we could run arbitrary code though the debugger. So * resume into the normal stack and do most work there if possible. */ MonoJitTlsData *jit_tls = TlsGetValue (mono_jit_tls_id); guint64 sp = UCONTEXT_REG_ESP (ctx); /* Pass the ctx parameter in TLS */ mono_arch_sigctx_to_monoctx (ctx, &jit_tls->ex_ctx); /* * Can't pass the obj on the stack, since we are executing on the * same stack. Can't save it into MonoJitTlsData, since it needs GC tracking. * So put it into a register, and branch to a trampoline which * pushes it. */ g_assert (!test_only); UCONTEXT_REG_EAX (ctx) = (gsize)obj; UCONTEXT_REG_ECX (ctx) = UCONTEXT_REG_EIP (ctx); UCONTEXT_REG_EDX (ctx) = (gsize)handle_signal_exception; /* Allocate a stack frame, align it to 16 bytes which is needed on apple */ sp -= 16; sp &= ~15; UCONTEXT_REG_ESP (ctx) = sp; UCONTEXT_REG_EIP (ctx) = (gsize)signal_exception_trampoline; return TRUE; #elif defined (TARGET_WIN32) MonoJitTlsData *jit_tls = TlsGetValue (mono_jit_tls_id); struct sigcontext *ctx = (struct sigcontext *)sigctx; guint64 sp = ctx->SC_ESP; mono_arch_sigctx_to_monoctx (sigctx, &jit_tls->ex_ctx); /* * Can't pass the obj on the stack, since we are executing on the * same stack. Can't save it into MonoJitTlsData, since it needs GC tracking. * So put it into a register, and branch to a trampoline which * pushes it. */ g_assert (!test_only); ctx->SC_EAX = (gsize)obj; ctx->SC_ECX = ctx->SC_EIP; ctx->SC_EDX = (gsize)handle_signal_exception; /* Allocate a stack frame, align it to 16 bytes which is needed on apple */ sp -= 16; sp &= ~15; ctx->SC_ESP = sp; ctx->SC_EIP = (gsize)signal_exception_trampoline; return TRUE; #else MonoContext mctx; mono_arch_sigctx_to_monoctx (sigctx, &mctx); if (mono_debugger_handle_exception (&mctx, (MonoObject *)obj)) return TRUE; mono_handle_exception (&mctx, obj, (gpointer)mctx.eip, test_only); mono_arch_monoctx_to_sigctx (&mctx, sigctx); return TRUE; #endif }