[Pkg-mono-svn-commits] [SCM] mono branch, master, updated. debian/2.6.7-3-34-gb2ddb4c

Mirco Bauer meebey at meebey.net
Tue Dec 14 00:14:36 UTC 2010


The following commit has been merged in the master branch:
commit f17ab0443403459432d441c41612c844ca673b4c
Author: Zoltan Varga <vargaz at gmail.com>
Date:   Thu Nov 25 23:36:57 2010 +0100

    Fix stack alignment when resuming from a signal handler in the soft debugger. Fixes #647464.

diff --git a/mono/mini/debugger-agent.c b/mono/mini/debugger-agent.c
index 60ff010..9dd1f5d 100644
--- a/mono/mini/debugger-agent.c
+++ b/mono/mini/debugger-agent.c
@@ -3523,8 +3523,11 @@ resume_from_signal_handler (void *sigctx, void *func)
 
 	mono_arch_sigctx_to_monoctx (sigctx, &ctx);
 	memcpy (&tls->handler_ctx, &ctx, sizeof (MonoContext));
+#ifdef MONO_ARCH_HAVE_SETUP_RESUME_FROM_SIGNAL_HANDLER_CTX
+	mono_arch_setup_resume_sighandler_ctx (&ctx, func);
+#else
 	MONO_CONTEXT_SET_IP (&ctx, func);
-
+#endif
 	mono_arch_monoctx_to_sigctx (&ctx, sigctx);
 }
 
diff --git a/mono/mini/exceptions-amd64.c b/mono/mini/exceptions-amd64.c
index 54ed883..8dcb3a9 100644
--- a/mono/mini/exceptions-amd64.c
+++ b/mono/mini/exceptions-amd64.c
@@ -1456,3 +1456,19 @@ mono_tasklets_arch_restore (void)
 }
 #endif
 
+/*
+ * mono_arch_setup_resume_sighandler_ctx:
+ *
+ *   Setup CTX so execution continues at FUNC.
+ */
+void
+mono_arch_setup_resume_sighandler_ctx (MonoContext *ctx, gpointer func)
+{
+	/* 
+	 * When resuming from a signal handler, the stack should be misaligned, just like right after
+	 * a call.
+	 */
+	if ((((guint64)MONO_CONTEXT_GET_SP (ctx)) % 16) == 0)
+		MONO_CONTEXT_SET_SP (ctx, (guint64)MONO_CONTEXT_GET_SP (ctx) - 8);
+	MONO_CONTEXT_SET_IP (ctx, func);
+}
diff --git a/mono/mini/mini-amd64.h b/mono/mini/mini-amd64.h
index a16f957..8cf61a7 100644
--- a/mono/mini/mini-amd64.h
+++ b/mono/mini/mini-amd64.h
@@ -376,8 +376,7 @@ typedef struct {
 #define MONO_ARCH_DYN_CALL_PARAM_AREA 0
 
 #define MONO_ARCH_HAVE_LLVM_IMT_TRAMPOLINE 1
-
-#define MONO_ARCH_USE_OP_TAIL_CALL(caller_sig, callee_sig) mono_metadata_signature_equal ((caller_sig), (callee_sig))
+#define MONO_ARCH_HAVE_SETUP_RESUME_FROM_SIGNAL_HANDLER_CTX 1
 
 /* Used for optimization, not complete */
 #define MONO_ARCH_IS_OP_MEMBASE(opcode) ((opcode) == OP_X86_PUSH_MEMBASE)
diff --git a/mono/mini/mini.h b/mono/mini/mini.h
index ad81fdd..64bc66b 100644
--- a/mono/mini/mini.h
+++ b/mono/mini/mini.h
@@ -1705,6 +1705,7 @@ guint8*   mono_arch_get_ip_for_breakpoint       (MonoJitInfo *ji, MonoContext *c
 void     mono_arch_skip_breakpoint              (MonoContext *ctx) MONO_INTERNAL;
 void     mono_arch_skip_single_step             (MonoContext *ctx) MONO_INTERNAL;
 gpointer mono_arch_get_seq_point_info           (MonoDomain *domain, guint8 *code) MONO_INTERNAL;
+void     mono_arch_setup_resume_sighandler_ctx  (MonoContext *ctx, gpointer func) MONO_INTERNAL;
 #endif
 
 MonoJitInfo *mono_arch_find_jit_info            (MonoDomain *domain, 

-- 
mono



More information about the Pkg-mono-svn-commits mailing list