#include <mono/utils/mono-context.h>
+#ifdef HOST_WIN32
+#include <windows.h>
+#endif
+
#ifdef __sun
#define REG_EAX EAX
#define REG_EBX EBX
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;
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;
#include <mono/utils/mono-context.h>
+#ifdef HOST_WIN32
+#include <windows.h>
+#endif
+
void
mono_sigctx_to_monoctx (void *sigctx, MonoContext *mctx)
{
#if defined(MONO_SIGNAL_USE_SIGACTION)
ucontext_t *ctx = (ucontext_t*)sigctx;
- mctx->rax = UCONTEXT_REG_RAX (ctx);
- mctx->rbx = UCONTEXT_REG_RBX (ctx);
- mctx->rcx = UCONTEXT_REG_RCX (ctx);
- mctx->rdx = UCONTEXT_REG_RDX (ctx);
- mctx->rbp = UCONTEXT_REG_RBP (ctx);
- mctx->rsp = UCONTEXT_REG_RSP (ctx);
- mctx->rsi = UCONTEXT_REG_RSI (ctx);
- mctx->rdi = UCONTEXT_REG_RDI (ctx);
- mctx->r8 = UCONTEXT_REG_R8 (ctx);
- mctx->r9 = UCONTEXT_REG_R9 (ctx);
- mctx->r10 = UCONTEXT_REG_R10 (ctx);
- mctx->r11 = UCONTEXT_REG_R11 (ctx);
- mctx->r12 = UCONTEXT_REG_R12 (ctx);
- mctx->r13 = UCONTEXT_REG_R13 (ctx);
- mctx->r14 = UCONTEXT_REG_R14 (ctx);
- mctx->r15 = UCONTEXT_REG_R15 (ctx);
- mctx->rip = UCONTEXT_REG_RIP (ctx);
+ mctx->gregs [AMD64_RAX] = UCONTEXT_REG_RAX (ctx);
+ mctx->gregs [AMD64_RBX] = UCONTEXT_REG_RBX (ctx);
+ mctx->gregs [AMD64_RCX] = UCONTEXT_REG_RCX (ctx);
+ mctx->gregs [AMD64_RDX] = UCONTEXT_REG_RDX (ctx);
+ mctx->gregs [AMD64_RBP] = UCONTEXT_REG_RBP (ctx);
+ mctx->gregs [AMD64_RSP] = UCONTEXT_REG_RSP (ctx);
+ mctx->gregs [AMD64_RSI] = UCONTEXT_REG_RSI (ctx);
+ mctx->gregs [AMD64_RDI] = UCONTEXT_REG_RDI (ctx);
+ mctx->gregs [AMD64_R8] = UCONTEXT_REG_R8 (ctx);
+ mctx->gregs [AMD64_R9] = UCONTEXT_REG_R9 (ctx);
+ mctx->gregs [AMD64_R10] = UCONTEXT_REG_R10 (ctx);
+ mctx->gregs [AMD64_R11] = UCONTEXT_REG_R11 (ctx);
+ mctx->gregs [AMD64_R12] = UCONTEXT_REG_R12 (ctx);
+ mctx->gregs [AMD64_R13] = UCONTEXT_REG_R13 (ctx);
+ mctx->gregs [AMD64_R14] = UCONTEXT_REG_R14 (ctx);
+ mctx->gregs [AMD64_R15] = UCONTEXT_REG_R15 (ctx);
+ mctx->gregs [AMD64_RIP] = UCONTEXT_REG_RIP (ctx);
+#elif defined(HOST_WIN32)
+ CONTEXT *context = (CONTEXT*)sigctx;
+
+ mctx->gregs [AMD64_RIP] = context->Rip;
+ mctx->gregs [AMD64_RAX] = context->Rax;
+ mctx->gregs [AMD64_RCX] = context->Rcx;
+ mctx->gregs [AMD64_RDX] = context->Rdx;
+ mctx->gregs [AMD64_RBX] = context->Rbx;
+ mctx->gregs [AMD64_RSP] = context->Rsp;
+ mctx->gregs [AMD64_RBP] = context->Rbp;
+ mctx->gregs [AMD64_RSI] = context->Rsi;
+ mctx->gregs [AMD64_RDI] = context->Rdi;
+ mctx->gregs [AMD64_R8] = context->R8;
+ mctx->gregs [AMD64_R9] = context->R9;
+ mctx->gregs [AMD64_R10] = context->R10;
+ mctx->gregs [AMD64_R11] = context->R11;
+ mctx->gregs [AMD64_R12] = context->R12;
+ mctx->gregs [AMD64_R13] = context->R13;
+ mctx->gregs [AMD64_R14] = context->R14;
+ mctx->gregs [AMD64_R15] = context->R15;
#else
MonoContext *ctx = (MonoContext *)sigctx;
- mctx->rax = ctx->rax;
- mctx->rbx = ctx->rbx;
- mctx->rcx = ctx->rcx;
- mctx->rdx = ctx->rdx;
- mctx->rbp = ctx->rbp;
- mctx->rsp = ctx->rsp;
- mctx->rsi = ctx->rsi;
- mctx->rdi = ctx->rdi;
- mctx->r8 = ctx->r8;
- mctx->r9 = ctx->r9;
- mctx->r10 = ctx->r10;
- mctx->r11 = ctx->r11;
- mctx->r12 = ctx->r12;
- mctx->r13 = ctx->r13;
- mctx->r14 = ctx->r14;
- mctx->r15 = ctx->r15;
- mctx->rip = ctx->rip;
+ mctx->gregs [AMD64_RAX] = ctx->gregs [AMD64_RAX];
+ mctx->gregs [AMD64_RBX] = ctx->gregs [AMD64_RBX];
+ mctx->gregs [AMD64_RCX] = ctx->gregs [AMD64_RCX];
+ mctx->gregs [AMD64_RDX] = ctx->gregs [AMD64_RDX];
+ mctx->gregs [AMD64_RBP] = ctx->gregs [AMD64_RBP];
+ mctx->gregs [AMD64_RSP] = ctx->gregs [AMD64_RSP];
+ mctx->gregs [AMD64_RSI] = ctx->gregs [AMD64_RSI];
+ mctx->gregs [AMD64_RDI] = ctx->gregs [AMD64_RDI];
+ mctx->gregs [AMD64_R8] = ctx->gregs [AMD64_R8];
+ mctx->gregs [AMD64_R9] = ctx->gregs [AMD64_R9];
+ mctx->gregs [AMD64_R10] = ctx->gregs [AMD64_R10];
+ mctx->gregs [AMD64_R11] = ctx->gregs [AMD64_R11];
+ mctx->gregs [AMD64_R12] = ctx->gregs [AMD64_R12];
+ mctx->gregs [AMD64_R13] = ctx->gregs [AMD64_R13];
+ mctx->gregs [AMD64_R14] = ctx->gregs [AMD64_R14];
+ mctx->gregs [AMD64_R15] = ctx->gregs [AMD64_R15];
+ mctx->gregs [AMD64_RIP] = ctx->gregs [AMD64_RIP];
#endif
}
#if defined(MONO_SIGNAL_USE_SIGACTION)
ucontext_t *ctx = (ucontext_t*)sigctx;
- UCONTEXT_REG_RAX (ctx) = mctx->rax;
- UCONTEXT_REG_RBX (ctx) = mctx->rbx;
- UCONTEXT_REG_RCX (ctx) = mctx->rcx;
- UCONTEXT_REG_RDX (ctx) = mctx->rdx;
- UCONTEXT_REG_RBP (ctx) = mctx->rbp;
- UCONTEXT_REG_RSP (ctx) = mctx->rsp;
- UCONTEXT_REG_RSI (ctx) = mctx->rsi;
- UCONTEXT_REG_RDI (ctx) = mctx->rdi;
- UCONTEXT_REG_R8 (ctx) = mctx->r8;
- UCONTEXT_REG_R9 (ctx) = mctx->r9;
- UCONTEXT_REG_R10 (ctx) = mctx->r10;
- UCONTEXT_REG_R11 (ctx) = mctx->r11;
- UCONTEXT_REG_R12 (ctx) = mctx->r12;
- UCONTEXT_REG_R13 (ctx) = mctx->r13;
- UCONTEXT_REG_R14 (ctx) = mctx->r14;
- UCONTEXT_REG_R15 (ctx) = mctx->r15;
- UCONTEXT_REG_RIP (ctx) = mctx->rip;
+ UCONTEXT_REG_RAX (ctx) = mctx->gregs [AMD64_RAX];
+ UCONTEXT_REG_RBX (ctx) = mctx->gregs [AMD64_RBX];
+ UCONTEXT_REG_RCX (ctx) = mctx->gregs [AMD64_RCX];
+ UCONTEXT_REG_RDX (ctx) = mctx->gregs [AMD64_RDX];
+ UCONTEXT_REG_RBP (ctx) = mctx->gregs [AMD64_RBP];
+ UCONTEXT_REG_RSP (ctx) = mctx->gregs [AMD64_RSP];
+ UCONTEXT_REG_RSI (ctx) = mctx->gregs [AMD64_RSI];
+ UCONTEXT_REG_RDI (ctx) = mctx->gregs [AMD64_RDI];
+ UCONTEXT_REG_R8 (ctx) = mctx->gregs [AMD64_R8];
+ UCONTEXT_REG_R9 (ctx) = mctx->gregs [AMD64_R9];
+ UCONTEXT_REG_R10 (ctx) = mctx->gregs [AMD64_R10];
+ UCONTEXT_REG_R11 (ctx) = mctx->gregs [AMD64_R11];
+ UCONTEXT_REG_R12 (ctx) = mctx->gregs [AMD64_R12];
+ UCONTEXT_REG_R13 (ctx) = mctx->gregs [AMD64_R13];
+ UCONTEXT_REG_R14 (ctx) = mctx->gregs [AMD64_R14];
+ UCONTEXT_REG_R15 (ctx) = mctx->gregs [AMD64_R15];
+ UCONTEXT_REG_RIP (ctx) = mctx->gregs [AMD64_RIP];
+#elif defined(HOST_WIN32)
+ CONTEXT *context = (CONTEXT*)sigctx;
+
+ context->Rip = mctx->gregs [AMD64_RIP];
+ context->Rax = mctx->gregs [AMD64_RAX];
+ context->Rcx = mctx->gregs [AMD64_RCX];
+ context->Rdx = mctx->gregs [AMD64_RDX];
+ context->Rbx = mctx->gregs [AMD64_RBX];
+ context->Rsp = mctx->gregs [AMD64_RSP];
+ context->Rbp = mctx->gregs [AMD64_RBP];
+ context->Rsi = mctx->gregs [AMD64_RSI];
+ context->Rdi = mctx->gregs [AMD64_RDI];
+ context->R8 = mctx->gregs [AMD64_R8];
+ context->R9 = mctx->gregs [AMD64_R9];
+ context->R10 = mctx->gregs [AMD64_R10];
+ context->R11 = mctx->gregs [AMD64_R11];
+ context->R12 = mctx->gregs [AMD64_R12];
+ context->R13 = mctx->gregs [AMD64_R13];
+ context->R14 = mctx->gregs [AMD64_R14];
+ context->R15 = mctx->gregs [AMD64_R15];
#else
MonoContext *ctx = (MonoContext *)sigctx;
- ctx->rax = mctx->rax;
- ctx->rbx = mctx->rbx;
- ctx->rcx = mctx->rcx;
- ctx->rdx = mctx->rdx;
- ctx->rbp = mctx->rbp;
- ctx->rsp = mctx->rsp;
- ctx->rsi = mctx->rsi;
- ctx->rdi = mctx->rdi;
- ctx->r8 = mctx->r8;
- ctx->r9 = mctx->r9;
- ctx->r10 = mctx->r10;
- ctx->r11 = mctx->r11;
- ctx->r12 = mctx->r12;
- ctx->r13 = mctx->r13;
- ctx->r14 = mctx->r14;
- ctx->r15 = mctx->r15;
- ctx->rip = mctx->rip;
+ ctx->gregs [AMD64_RAX] = mctx->gregs [AMD64_RAX];
+ ctx->gregs [AMD64_RBX] = mctx->gregs [AMD64_RBX];
+ ctx->gregs [AMD64_RCX] = mctx->gregs [AMD64_RCX];
+ ctx->gregs [AMD64_RDX] = mctx->gregs [AMD64_RDX];
+ ctx->gregs [AMD64_RBP] = mctx->gregs [AMD64_RBP];
+ ctx->gregs [AMD64_RSP] = mctx->gregs [AMD64_RSP];
+ ctx->gregs [AMD64_RSI] = mctx->gregs [AMD64_RSI];
+ ctx->gregs [AMD64_RDI] = mctx->gregs [AMD64_RDI];
+ ctx->gregs [AMD64_R8] = mctx->gregs [AMD64_R8];
+ ctx->gregs [AMD64_R9] = mctx->gregs [AMD64_R9];
+ ctx->gregs [AMD64_R10] = mctx->gregs [AMD64_R10];
+ ctx->gregs [AMD64_R11] = mctx->gregs [AMD64_R11];
+ ctx->gregs [AMD64_R12] = mctx->gregs [AMD64_R12];
+ ctx->gregs [AMD64_R13] = mctx->gregs [AMD64_R13];
+ ctx->gregs [AMD64_R14] = mctx->gregs [AMD64_R14];
+ ctx->gregs [AMD64_R15] = mctx->gregs [AMD64_R15];
+ ctx->gregs [AMD64_RIP] = mctx->gregs [AMD64_RIP];
#endif
}
#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>
}
}
+#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__) */