Author: zoltan
Date: 2005-04-01 11:57:17 -0500 (Fri, 01 Apr 2005)
New Revision: 42466

Modified:
   trunk/mono/mono/mini/ChangeLog
   trunk/mono/mono/mini/mini-sparc.c
   trunk/mono/mono/mini/mini-sparc.h
Log:
2005-04-01  Zoltan Varga  <[EMAIL PROTECTED]>

        * mini-sparc.c mini-sparc.h: Add asserts when running with sigaltstack.


Modified: trunk/mono/mono/mini/ChangeLog
===================================================================
--- trunk/mono/mono/mini/ChangeLog      2005-04-01 16:46:43 UTC (rev 42465)
+++ trunk/mono/mono/mini/ChangeLog      2005-04-01 16:57:17 UTC (rev 42466)
@@ -1,5 +1,7 @@
 2005-04-01  Zoltan Varga  <[EMAIL PROTECTED]>
 
+       * mini-sparc.c mini-sparc.h: Add asserts when running with sigaltstack.
+
        * exceptions-x86.c (mono_arch_monoctx_to_sigctx): Fix cygwin build.
 
 2005-03-31  Zoltan Varga  <[EMAIL PROTECTED]>

Modified: trunk/mono/mono/mini/mini-sparc.c
===================================================================
--- trunk/mono/mono/mini/mini-sparc.c   2005-04-01 16:46:43 UTC (rev 42465)
+++ trunk/mono/mono/mini/mini-sparc.c   2005-04-01 16:57:17 UTC (rev 42466)
@@ -22,6 +22,9 @@
 #include <thread.h>
 #endif
 
+#include <unistd.h>
+#include <sys/mman.h>
+
 #include <mono/metadata/appdomain.h>
 #include <mono/metadata/debug-helpers.h>
 #include <mono/metadata/tokentype.h>
@@ -3537,6 +3540,11 @@
                case OP_LOCALLOC: {
                        guint32 size_reg;
 
+#ifdef MONO_ARCH_SIGSEGV_ON_ALTSTACK
+                       /* Perform stack touching */
+                       NOT_IMPLEMENTED;
+#endif
+
                        /* Keep alignment */
                        sparc_add_imm (code, FALSE, ins->sreg1, 
MONO_ARCH_FRAME_ALIGNMENT - 1, ins->dreg);
                        sparc_set (code, ~(MONO_ARCH_FRAME_ALIGNMENT - 1), 
sparc_o7);
@@ -3586,6 +3594,12 @@
                }
                case OP_SPARC_LOCALLOC_IMM: {
                        gint32 offset = ins->inst_c0;
+
+#ifdef MONO_ARCH_SIGSEGV_ON_ALTSTACK
+                       /* Perform stack touching */
+                       NOT_IMPLEMENTED;
+#endif
+
                        offset = ALIGN_TO (offset, MONO_ARCH_FRAME_ALIGNMENT);
                        if (sparc_is_imm13 (offset))
                                sparc_sub_imm (code, FALSE, sparc_sp, offset, 
sparc_sp);
@@ -4433,6 +4447,11 @@
 
        cfg->stack_offset = offset;
 
+#ifdef MONO_ARCH_SIGSEGV_ON_ALTSTACK
+                       /* Perform stack touching */
+                       NOT_IMPLEMENTED;
+#endif
+
        if (!sparc_is_imm13 (- cfg->stack_offset)) {
                /* Can't use sparc_o7 here, since we're still in the caller's 
frame */
                sparc_set (code, (- cfg->stack_offset), GP_SCRATCH_REG);
@@ -4834,19 +4853,26 @@
 #endif
 }
 
-void
-mono_arch_setup_jit_tls_data (MonoJitTlsData *tls)
+#ifdef MONO_ARCH_SIGSEGV_ON_ALTSTACK
+
+/*
+ * There seems to be no way to determine stack boundaries under solaris,
+ * so it's not possible to determine whenever a SIGSEGV is caused by stack
+ * overflow or not.
+ */
+#error "--with-sigaltstack=yes not supported on solaris"
+
+static void
+setup_stack (MonoJitTlsData *tls)
 {
-#ifdef MONO_ARCH_SIGSEGV_ON_ALTSTACK
 #ifdef __linux__
        struct sigaltstack sa;
 #else
        stack_t         sigstk;
 #endif
  
-       printf ("SIGALT!\n");
        /* Setup an alternate signal stack */
-       tls->signal_stack = g_malloc (SIGNAL_STACK_SIZE);
+       tls->signal_stack = mmap (0, SIGNAL_STACK_SIZE, 
PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
        tls->signal_stack_size = SIGNAL_STACK_SIZE;
 
 #ifdef __linux__
@@ -4860,8 +4886,13 @@
        sigstk.ss_flags = 0;
        g_assert (sigaltstack (&sigstk, NULL) == 0);
 #endif
+}
+
 #endif
 
+void
+mono_arch_setup_jit_tls_data (MonoJitTlsData *tls)
+{
        if (!lmf_addr_key_inited) {
                int res;
 
@@ -4881,6 +4912,10 @@
 #else
        pthread_setspecific (lmf_addr_key, &tls->lmf);
 #endif
+
+#ifdef MONO_ARCH_SIGSEGV_ON_ALTSTACK
+       setup_stack (tls);
+#endif
 }
 
 void

Modified: trunk/mono/mono/mini/mini-sparc.h
===================================================================
--- trunk/mono/mono/mini/mini-sparc.h   2005-04-01 16:46:43 UTC (rev 42465)
+++ trunk/mono/mono/mini/mini-sparc.h   2005-04-01 16:57:17 UTC (rev 42466)
@@ -57,7 +57,9 @@
 
 #define MONO_ARCH_USE_SIGACTION 1
 
-//#define MONO_ARCH_SIGSEGV_ON_ALTSTACK
+#ifdef HAVE_WORKING_SIGALTSTACK
+#define MONO_ARCH_SIGSEGV_ON_ALTSTACK
+#endif
 
 #define MONO_ARCH_EMULATE_FCONV_TO_I8   1
 #define MONO_ARCH_EMULATE_LCONV_TO_R8   1

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to