* mini-s390x.c, mini-s390x.h: Fix LMF processing when LOCALLOC
authorNeale Ferguson <neale@mono-cvs.ximian.com>
Thu, 5 Jan 2006 19:03:50 +0000 (19:03 -0000)
committerNeale Ferguson <neale@mono-cvs.ximian.com>
Thu, 5 Jan 2006 19:03:50 +0000 (19:03 -0000)
        is encountered. Addresses bug manifested running test-183 with
        gmcs (stack walking problem).

svn path=/trunk/mono/; revision=55111

mono/mini/ChangeLog
mono/mini/mini-s390x.c
mono/mini/mini-s390x.h

index 48329a39c3c7861c798dd9220e34ecdb18404e32..0c41f9c2998d1bfac7bcb0d023b8138e82976c01 100644 (file)
@@ -1,3 +1,8 @@
+2006-01-05 Neale Ferguson <neale@sinenomine.net>
+
+       * mini-s390x.c, mini-s390x.h: Fix lmf handling when localloc is encountered. 
+       Fixes crash in test-183.cs when using gmcs (stack walk problem).
+
 2006-01-04  Zoltan Varga  <vargaz@gmail.com>
 
        * aot.c (mono_aot_load_method): Fix a warning.
index c15963a615e8edffa2d4274e588eeceddc1052e4..365f57cea2dc17f9d54bce999b3b5801d572e1f8 100644 (file)
@@ -3705,6 +3705,26 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        s390_aghi (code, s390_r1, 14);
                        s390_srlg (code, s390_r1, s390_r1, 0, 3);
                        s390_sllg (code, s390_r1, s390_r1, 0, 3);
+                       if (cfg->method->save_lmf) {
+                               /*----------------------------------*/
+                               /* we have to adjust lmf ebp value  */
+                               /*----------------------------------*/
+                               int lmfOffset = cfg->stack_usage - sizeof(MonoLMF);
+
+                               s390_lgr (code, s390_r13, cfg->frame_reg);
+                               if (s390_is_uimm16(lmfOffset))
+                                       s390_aghi (code, s390_r13, lmfOffset);
+                               else {
+                                       s390_basr (code, s390_r14, 0);
+                                       s390_j    (code, 4);
+                                       s390_word (code, lmfOffset);
+                                       s390_agf  (code, s390_r13, 0, s390_r14, 4);
+                               }
+                               s390_lgr (code, s390_r14, STK_BASE);
+                               s390_sgr (code, s390_r14, s390_r1);
+                               s390_stg (code, s390_r14, 0, s390_r13,
+                                         G_STRUCT_OFFSET(MonoLMF, ebp));
+                        }
                        s390_lg   (code, s390_r13, 0, STK_BASE, 0);
                        s390_sgr  (code, STK_BASE, s390_r1);
                        s390_stg  (code, s390_r13, 0, STK_BASE, 0);
@@ -4754,8 +4774,7 @@ mono_arch_emit_prolog (MonoCompile *cfg)
                /*---------------------------------------------------------------*/     
                /* save the current IP                                           */     
                /*---------------------------------------------------------------*/     
-               s390_lgr   (code, s390_r1, cfg->frame_reg);
-               s390_stg   (code, s390_r1, 0, s390_r13, G_STRUCT_OFFSET(MonoLMF, ebp)); 
+               s390_stg   (code, STK_BASE, 0, s390_r13, G_STRUCT_OFFSET(MonoLMF, ebp));
                s390_basr  (code, s390_r1, 0);
                s390_stg   (code, s390_r1, 0, s390_r13, G_STRUCT_OFFSET(MonoLMF, eip)); 
                                                                                        
@@ -4971,14 +4990,6 @@ mono_arch_emit_exceptions (MonoCompile *cfg)
 void
 mono_arch_setup_jit_tls_data (MonoJitTlsData *tls)
 {
-#ifdef MONO_ARCH_SIGSEGV_ON_ALTSTACK
-       pthread_t       self = pthread_self();
-       pthread_attr_t  attr;
-       void            *stAddr = NULL;
-       size_t          stSize  = 0;
-       struct sigaltstack sa;
-#endif
-
        if (!tls_offset_inited) {
                tls_offset_inited = TRUE;
 
@@ -5002,35 +5013,6 @@ mono_arch_setup_jit_tls_data (MonoJitTlsData *tls)
 #endif
        }               
 
-#ifdef MONO_ARCH_SIGSEGV_ON_ALTSTACK
-
-       /*----------------------------------------------------------*/
-       /* Determine stack boundaries                               */
-       /*----------------------------------------------------------*/
-       if (!mono_running_on_valgrind ()) {
-#ifdef HAVE_PTHREAD_GETATTR_NP
-               pthread_getattr_np( self, &attr );
-#elif HAVE_PTHREAD_ATTR_GET_NP
-               pthread_attr_get_np( self, &attr );
-#endif
-               pthread_attr_getstack( &attr, &stAddr, &stSize );
-       }
-
-
-       /*----------------------------------------------------------*/
-       /* Setup an alternate signal stack                          */
-       /*----------------------------------------------------------*/
-       tls->stack_size        = stSize;
-       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;
-
-       sa.ss_sp    = tls->signal_stack;
-       sa.ss_size  = SIGNAL_STACK_SIZE;
-       sa.ss_flags = SS_ONSTACK;
-       sigaltstack (&sa, NULL);
-#endif
        if (!lmf_addr_key_inited) {
                lmf_addr_key_inited = TRUE;
                pthread_key_create (&lmf_addr_key, NULL);
@@ -5052,17 +5034,6 @@ mono_arch_setup_jit_tls_data (MonoJitTlsData *tls)
 void
 mono_arch_free_jit_tls_data (MonoJitTlsData *tls)
 {
-#ifdef MONO_ARCH_SIGSEGV_ON_ALTSTACK
-       struct sigaltstack sa;
-
-       sa.ss_sp    = tls->signal_stack;
-       sa.ss_size  = SIGNAL_STACK_SIZE;
-       sa.ss_flags = SS_DISABLE;
-       sigaltstack (&sa, NULL);
-
-       if (tls->signal_stack)
-               munmap(tls->signal_stack, SIGNAL_STACK_SIZE);
-#endif
 
 }
 
index 246ac91d19489aa2e3ceda5e6bc7cf793e29f91e..788ed5bdd8aa1751d6a8b65320a42200e01ac7c3 100644 (file)
@@ -145,15 +145,13 @@ typedef struct
        void *return_address;
 } MonoS390StackFrame;
 
-//#define MONO_ARCH_EMULATE_FCONV_TO_I8                1
-//#define MONO_ARCH_EMULATE_LCONV_TO_R8                1
-// #define MONO_ARCH_EMULATE_LCONV_TO_R4               1
+// #define MONO_ARCH_SIGSEGV_ON_ALTSTACK               1
 #define MONO_ARCH_EMULATE_LCONV_TO_R8_UN       1
 #define MONO_ARCH_NO_EMULATE_LONG_MUL_OPTS     1
 #define MONO_ARCH_NO_EMULATE_LONG_SHIFT_OPS    1
-// #define MONO_ARCH_EMULATE_MUL_DIV           1
 #define MONO_ARCH_HAVE_IS_INT_OVERFLOW         1
 #define MONO_ARCH_NEED_DIV_CHECK               1
+#define MONO_ARCH_SIGNAL_STACK_SIZE            256*1024
 // #define MONO_ARCH_HAVE_THROW_CORLIB_EXCEPTION       1
 
 #define MONO_ARCH_USE_SIGACTION        1