X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Futils%2Fmono-context.c;h=a05c7bab76d9e0d1701bd879e4abf7f2311f1a55;hb=00af1bc3675ef335672a3413a2a8fa3c3ca45bb0;hp=81f3ca84ec30ae4da29072e8b9db66d8beb0a4d4;hpb=c9afd924fdbe70a69ab9960c379f280ecbb3a778;p=mono.git diff --git a/mono/utils/mono-context.c b/mono/utils/mono-context.c index 81f3ca84ec3..a05c7bab76d 100644 --- a/mono/utils/mono-context.c +++ b/mono/utils/mono-context.c @@ -15,6 +15,10 @@ #include +#ifdef HOST_WIN32 +#include +#endif + #ifdef __sun #define REG_EAX EAX #define REG_EBX EBX @@ -53,6 +57,18 @@ 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); +#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; @@ -85,6 +101,18 @@ 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; +#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; @@ -104,6 +132,10 @@ mono_monoctx_to_sigctx (MonoContext *mctx, void *sigctx) #include +#ifdef HOST_WIN32 +#include +#endif + void mono_sigctx_to_monoctx (void *sigctx, MonoContext *mctx) { @@ -114,43 +146,63 @@ 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 } @@ -164,43 +216,63 @@ mono_monoctx_to_sigctx (MonoContext *mctx, void *sigctx) #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 } @@ -288,6 +360,38 @@ mono_monoctx_to_sigctx (MonoContext *mctx, void *ctx) #endif } +#elif (defined(__aarch64__) && !defined(MONO_CROSS_COMPILE)) || (defined(TARGET_ARM64)) + +#include + +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 @@ -317,4 +421,31 @@ mono_monoctx_to_sigctx (MonoContext *mctx, void *sigctx) } } +#elif (((defined(__ppc__) || defined(__powerpc__) || defined(__ppc64__)) && !defined(MONO_CROSS_COMPILE))) || (defined(TARGET_POWERPC)) + +#include +#include + +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__) */