[threads] Don't ignore abort requests in abort protected blocks
[mono.git] / mono / mini / tramp-s390x.c
index 00fa048d84cb5931cca2611a83f9074c251b6adb..db7e3d9ad0f2ea907ed0398dbaf9af0bcd95b086 100644 (file)
@@ -13,7 +13,7 @@
 /*              Dietmar Maurer (dietmar@ximian.com)                */
 /*                                                                 */
 /* Copyright   - 2001 Ximian, Inc.                                 */
-/*                                                                 */
+/* Licensed under the MIT license. See LICENSE file in the project root for full license information.*/
 /*------------------------------------------------------------------*/
 
 /*------------------------------------------------------------------*/
@@ -39,7 +39,7 @@
 
 #include <mono/metadata/abi-details.h>
 #include <mono/metadata/appdomain.h>
-#include <mono/metadata/gc-internal.h>
+#include <mono/metadata/gc-internals.h>
 #include <mono/metadata/marshal.h>
 #include <mono/metadata/profiler-private.h>
 #include <mono/metadata/tabledefs.h>
@@ -48,6 +48,7 @@
 #include "mini.h"
 #include "mini-s390x.h"
 #include "support-s390x.h"
+#include "jit-icalls.h"
 
 /*========================= End of Includes ========================*/
 
@@ -57,6 +58,7 @@
 
 typedef struct {
        guint8  stk[S390_MINIMAL_STACK_SIZE];   /* Standard s390x stack */
+       guint64 saveFn;                         /* Call address         */
        struct MonoLMF  LMF;                    /* LMF                  */
 } trampStack_t;
 
@@ -308,15 +310,22 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
        S390_SET  (buf, s390_r1, tramp);
        s390_basr (buf, s390_r14, s390_r1);
                
-       /* OK, code address is now on r2. Move it to r1, so that we
-          can restore r2 and use it from r1 later */
-       s390_lgr  (buf, s390_r1, s390_r2);
+       /* OK, code address is now on r2. Save it, so that we
+          can restore r2 and use it later */
+       s390_stg  (buf, s390_r2, 0, STK_BASE, G_STRUCT_OFFSET(trampStack_t, saveFn));
+
+       /* Check for thread interruption */
+       S390_SET  (buf, s390_r1, (guint8 *)mono_interruption_checkpoint_from_trampoline);
+       s390_basr (buf, s390_r14, s390_r1);
 
        /*----------------------------------------------------------
          STEP 3: Restore the LMF
          ----------------------------------------------------------*/
        restoreLMF(buf, STK_BASE, sizeof(trampStack_t));
        
+       /* Reload result */
+       s390_lg   (buf, s390_r1, 0, STK_BASE, G_STRUCT_OFFSET(trampStack_t, saveFn));
+
        /*----------------------------------------------------------
          STEP 4: call the compiled method
          ----------------------------------------------------------*/
@@ -594,7 +603,7 @@ mono_arch_get_static_rgctx_trampoline (MonoMethod *m,
 static void
 handler_block_trampoline_helper (gpointer *ptr)
 {
-       MonoJitTlsData *jit_tls = mono_native_tls_get_value (mono_jit_tls_id);
+       MonoJitTlsData *jit_tls = mono_tls_get_jit_tls ();
        *ptr = jit_tls->handler_block_return_address;
 }
 
@@ -626,25 +635,12 @@ mono_arch_create_handler_block_trampoline (MonoTrampInfo **info, gboolean aot)
         * then jumps into the code that deals with it.
         */
 
-       if (mono_get_jit_tls_offset () != -1) {
-               s390_ear  (code, s390_r1, 0);
-               s390_sllg (code, s390_r1, s390_r1, 0, 32);
-               s390_ear  (code, s390_r1, 1);
-               S390_SET  (code, s390_r14, mono_get_jit_tls_offset());
-               s390_lg   (code, s390_r14, s390_r1, 0, G_STRUCT_OFFSET(MonoJitTlsData, handler_block_return_address));
-               /* 
-                * Simulate a call 
-                */
-               S390_SET  (code, s390_r1, tramp);
-               s390_br   (code, s390_r1);
-       } else {
-               /*
-                * Slow path uses a C helper
-                */
-               S390_SET  (code, s390_r2, tramp);
-               S390_SET  (code, s390_r1, handler_block_trampoline_helper);
-               s390_br   (code, s390_r1);
-       }
+       /*
+        * Slow path uses a C helper
+        */
+       S390_SET  (code, s390_r2, tramp);
+       S390_SET  (code, s390_r1, handler_block_trampoline_helper);
+       s390_br   (code, s390_r1);
 
        mono_arch_flush_icache (buf, code - buf);
        mono_profiler_code_buffer_new (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL);