Enable sigaction support on amd64 too, by using struct sigcontext.

This commit is contained in:
robert 2010-03-23 08:25:26 +00:00
parent 5fe07771b3
commit b6c3802c67
4 changed files with 159 additions and 5 deletions

View File

@ -1,4 +1,4 @@
# $OpenBSD: Makefile,v 1.22 2010/03/22 16:56:13 robert Exp $
# $OpenBSD: Makefile,v 1.23 2010/03/23 08:25:26 robert Exp $
# sync with net/avahi,-mono
ONLY_FOR_ARCHS= amd64 i386 powerpc # arm
@ -6,7 +6,7 @@ ONLY_FOR_ARCHS= amd64 i386 powerpc # arm
COMMENT= cross platform, open source .NET developement framework
DISTNAME= mono-2.6.3
PKGNAME= ${DISTNAME}p3
PKGNAME= ${DISTNAME}p4
CATEGORIES= lang devel

View File

@ -0,0 +1,105 @@
$OpenBSD: patch-mono_mini_exceptions-amd64_c,v 1.3 2010/03/23 08:25:26 robert Exp $
--- mono/mini/exceptions-amd64.c.orig Tue Mar 23 08:56:35 2010
+++ mono/mini/exceptions-amd64.c Tue Mar 23 08:59:41 2010
@@ -711,7 +711,7 @@ mono_arch_handle_exception (void *sigctx, gpointer obj
return TRUE;
}
-#ifdef MONO_ARCH_USE_SIGACTION
+#if defined(MONO_ARCH_USE_SIGACTION) && defined(UCONTEXT_GREGS)
static inline guint64*
gregs_from_ucontext (ucontext_t *ctx)
{
@@ -721,7 +721,7 @@ gregs_from_ucontext (ucontext_t *ctx)
void
mono_arch_sigctx_to_monoctx (void *sigctx, MonoContext *mctx)
{
-#ifdef MONO_ARCH_USE_SIGACTION
+#if defined(MONO_ARCH_USE_SIGACTION) && defined(UCONTEXT_GREGS)
ucontext_t *ctx = (ucontext_t*)sigctx;
guint64 *gregs = gregs_from_ucontext (ctx);
@@ -739,6 +739,22 @@ mono_arch_sigctx_to_monoctx (void *sigctx, MonoContext
mctx->r13 = gregs [REG_R13];
mctx->r14 = gregs [REG_R14];
mctx->r15 = gregs [REG_R15];
+#elif defined(MONO_ARCH_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->rip = UCONTEXT_REG_RIP (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);
#else
MonoContext *ctx = (MonoContext *)sigctx;
@@ -761,7 +777,7 @@ mono_arch_sigctx_to_monoctx (void *sigctx, MonoContext
void
mono_arch_monoctx_to_sigctx (MonoContext *mctx, void *sigctx)
{
-#ifdef MONO_ARCH_USE_SIGACTION
+#if defined(MONO_ARCH_USE_SIGACTION) && defined(UCONTEXT_GREGS)
ucontext_t *ctx = (ucontext_t*)sigctx;
guint64 *gregs = gregs_from_ucontext (ctx);
@@ -779,6 +795,22 @@ mono_arch_monoctx_to_sigctx (MonoContext *mctx, void *
gregs [REG_R13] = mctx->r13;
gregs [REG_R14] = mctx->r14;
gregs [REG_R15] = mctx->r15;
+#elif defined(MONO_ARCH_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_RIP (ctx) = mctx->rip;
+ UCONTEXT_REG_R12 (ctx) = mctx->r12;
+ UCONTEXT_REG_R13 (ctx) = mctx->r13;
+ UCONTEXT_REG_R14 (ctx) = mctx->r14;
+ UCONTEXT_REG_R15 (ctx) = mctx->r15;
#else
MonoContext *ctx = (MonoContext *)sigctx;
@@ -801,14 +833,16 @@ mono_arch_monoctx_to_sigctx (MonoContext *mctx, void *
gpointer
mono_arch_ip_from_context (void *sigctx)
{
-
-#ifdef MONO_ARCH_USE_SIGACTION
-
+#if defined(MONO_ARCH_USE_SIGACTION) && defined(UCONTEXT_GREGS)
ucontext_t *ctx = (ucontext_t*)sigctx;
guint64 *gregs = gregs_from_ucontext (ctx);
return (gpointer)gregs [REG_RIP];
+#elif defined(MONO_ARCH_USE_SIGACTION)
+ ucontext_t *ctx = (ucontext_t*)sigctx;
+
+ return (gpointer)UCONTEXT_REG_RIP (ctx);
#else
MonoContext *ctx = sigctx;
return (gpointer)ctx->rip;
@@ -865,7 +899,7 @@ altstack_handle_and_restore (void *sigctx, gpointer ob
void
mono_arch_handle_altstack_exception (void *sigctx, gpointer fault_addr, gboolean stack_ovf)
{
-#ifdef MONO_ARCH_USE_SIGACTION
+#if defined(MONO_ARCH_USE_SIGACTION) && defined(UCONTEXT_GREGS)
MonoException *exc = NULL;
ucontext_t *ctx = (ucontext_t*)sigctx;
guint64 *gregs = gregs_from_ucontext (ctx);

View File

@ -0,0 +1,27 @@
$OpenBSD: patch-mono_mini_mini-amd64_h,v 1.4 2010/03/23 08:25:26 robert Exp $
--- mono/mini/mini-amd64.h.orig Tue Mar 23 08:59:52 2010
+++ mono/mini/mini-amd64.h Tue Mar 23 09:00:38 2010
@@ -254,10 +254,6 @@ typedef struct {
#endif
-#ifdef __OpenBSD__
-#undef MONO_ARCH_USE_SIGACTION
-#endif
-
#endif /* PLATFORM_WIN32 */
#if defined (__NetBSD__)
@@ -282,7 +278,11 @@ typedef struct {
#define MONO_ARCH_NOMAP32BIT
-#elif defined (__FreeBSD__) || defined (__OpenBSD__)
+#elif defined (__OpenBSD__)
+
+#define MONO_ARCH_NOMAP32BIT
+
+#elif defined (__FreeBSD__)
#define REG_RAX 7
#define REG_RCX 4

View File

@ -1,6 +1,6 @@
$OpenBSD: patch-mono_utils_mono-sigcontext_h,v 1.1 2010/03/22 16:56:13 robert Exp $
--- mono/utils/mono-sigcontext.h.orig Mon Mar 22 17:35:25 2010
+++ mono/utils/mono-sigcontext.h Mon Mar 22 17:38:49 2010
$OpenBSD: patch-mono_utils_mono-sigcontext_h,v 1.2 2010/03/23 08:25:26 robert Exp $
--- mono/utils/mono-sigcontext.h.orig Fri Sep 25 16:58:11 2009
+++ mono/utils/mono-sigcontext.h Tue Mar 23 08:56:28 2010
@@ -54,6 +54,16 @@
#define UCONTEXT_REG_ESI(ctx) (((ucontext_t*)(ctx))->uc_mcontext.__gregs [_REG_ESI])
#define UCONTEXT_REG_EDI(ctx) (((ucontext_t*)(ctx))->uc_mcontext.__gregs [_REG_EDI])
@ -18,3 +18,25 @@ $OpenBSD: patch-mono_utils_mono-sigcontext_h,v 1.1 2010/03/22 16:56:13 robert Ex
#else
#define UCONTEXT_REG_EAX(ctx) (((ucontext_t*)(ctx))->uc_mcontext.gregs [REG_EAX])
#define UCONTEXT_REG_EBX(ctx) (((ucontext_t*)(ctx))->uc_mcontext.gregs [REG_EBX])
@@ -70,6 +80,21 @@
#ifdef __FreeBSD__
#define UCONTEXT_GREGS(ctx) &(((ucontext_t*)(ctx))->uc_mcontext)
+#elif defined(__OpenBSD__)
+ /* OpenBSD/amd64 has no gregs array, ucontext_t == sigcontext */
+ #define UCONTEXT_REG_RAX(ctx) ((ctx)->sc_rax)
+ #define UCONTEXT_REG_RBX(ctx) ((ctx)->sc_rbx)
+ #define UCONTEXT_REG_RCX(ctx) ((ctx)->sc_rcx)
+ #define UCONTEXT_REG_RDX(ctx) ((ctx)->sc_rdx)
+ #define UCONTEXT_REG_RBP(ctx) ((ctx)->sc_rbp)
+ #define UCONTEXT_REG_RSP(ctx) ((ctx)->sc_rsp)
+ #define UCONTEXT_REG_RSI(ctx) ((ctx)->sc_rsi)
+ #define UCONTEXT_REG_RDI(ctx) ((ctx)->sc_rdi)
+ #define UCONTEXT_REG_RIP(ctx) ((ctx)->sc_rip)
+ #define UCONTEXT_REG_R12(ctx) ((ctx)->sc_r12)
+ #define UCONTEXT_REG_R13(ctx) ((ctx)->sc_r13)
+ #define UCONTEXT_REG_R14(ctx) ((ctx)->sc_r14)
+ #define UCONTEXT_REG_R15(ctx) ((ctx)->sc_r15)
#else
#define UCONTEXT_GREGS(ctx) &(((ucontext_t*)(ctx))->uc_mcontext.gregs)
#endif