You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ib...@apache.org on 2008/06/05 09:36:10 UTC

svn commit: r663492 - in /harmony/enhanced/drlvm/trunk/vm/port/src: signals/linux/signals_common.cpp thread/include/port_thread_internal.h thread/linux/thread_os.c

Author: iberezhn
Date: Thu Jun  5 00:36:10 2008
New Revision: 663492

URL: http://svn.apache.org/viewvc?rev=663492&view=rev
Log:
Committed patch from HARMONY-5683
[drlvm][signals] H4265 reg test fails on Linux/x86


Modified:
    harmony/enhanced/drlvm/trunk/vm/port/src/signals/linux/signals_common.cpp
    harmony/enhanced/drlvm/trunk/vm/port/src/thread/include/port_thread_internal.h
    harmony/enhanced/drlvm/trunk/vm/port/src/thread/linux/thread_os.c

Modified: harmony/enhanced/drlvm/trunk/vm/port/src/signals/linux/signals_common.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/port/src/signals/linux/signals_common.cpp?rev=663492&r1=663491&r2=663492&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/port/src/signals/linux/signals_common.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/port/src/signals/linux/signals_common.cpp Thu Jun  5 00:36:10 2008
@@ -63,7 +63,11 @@
     {
     case SIGSEGV:
         if (tlsdata->restore_guard_page)
+        {
+            // Now it's safe to disable alternative stack
+            set_alt_stack(tlsdata, FALSE);
             result = port_process_signal(PORT_SIGNAL_STACK_OVERFLOW, pregs, fault_addr, FALSE);
+        }
         else
             result = port_process_signal(PORT_SIGNAL_GPF, pregs, fault_addr, FALSE);
         break;
@@ -222,6 +226,9 @@
         else
         { // To process signal on protected stack area
             port_thread_clear_guard_page();
+            // Note: the call above does not disable alternative stack
+            // It can't be made while we are on alternative stack
+            // Alt stack will be disabled explicitly in c_handler()
             tlsdata->restore_guard_page = TRUE;
         }
     }

Modified: harmony/enhanced/drlvm/trunk/vm/port/src/thread/include/port_thread_internal.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/port/src/thread/include/port_thread_internal.h?rev=663492&r1=663491&r2=663492&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/port/src/thread/include/port_thread_internal.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/port/src/thread/include/port_thread_internal.h Thu Jun  5 00:36:10 2008
@@ -159,6 +159,12 @@
 /* Detaches temporarily attached thread */
 int port_thread_detach_temporary();
 
+#ifndef WIN32
+/* To restore alternative stack out of signal handler on Linux */
+int set_alt_stack(port_tls_data_t* tlsdata, Boolean set);
+
+#endif
+
 
 #ifdef __cplusplus
 }

Modified: harmony/enhanced/drlvm/trunk/vm/port/src/thread/linux/thread_os.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/port/src/thread/linux/thread_os.c?rev=663492&r1=663491&r2=663492&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/port/src/thread/linux/thread_os.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/port/src/thread/linux/thread_os.c Thu Jun  5 00:36:10 2008
@@ -203,10 +203,24 @@
     return res;
 }
 
+int set_alt_stack(port_tls_data_t* tlsdata, Boolean set)
+{
+    stack_t sigalt;
+
+    // sets alternative stack
+    sigalt.ss_sp = tlsdata->guard_stack_addr;
+    sigalt.ss_size = tlsdata->guard_stack_size;
+//#if defined(FREEBSD)
+    sigalt.ss_flags = set ? 0 : SS_DISABLE;
+//#else
+//    sigalt.ss_flags = set ? SS_ONSTACK : SS_DISABLE;
+//#endif
+    return sigaltstack(&sigalt, NULL);
+}
+
 static int set_guard_page(port_tls_data_t* tlsdata, Boolean set)
 {
     int res;
-    stack_t sigalt;
 
     if (!tlsdata)
         tlsdata = get_private_tls_data();
@@ -218,7 +232,7 @@
         return 0;
 
     if ((set && tlsdata->guard_page_set) ||
-         !set && !tlsdata->guard_page_set)
+        (!set && !tlsdata->guard_page_set))
         return 0; // Already in needed state
 
     res = mprotect(tlsdata->guard_page_addr, tlsdata->guard_page_size,
@@ -227,18 +241,13 @@
     if (res != 0)
         return errno;
 
-    // sets alternative stack
-    sigalt.ss_sp = tlsdata->guard_stack_addr;
-    sigalt.ss_size = tlsdata->guard_stack_size;
-//#if defined(FREEBSD)
-    sigalt.ss_flags = set ? 0 : SS_DISABLE;
-//#else
-//    sigalt.ss_flags = set ? SS_ONSTACK : SS_DISABLE;
-//#endif
-    res = sigaltstack(&sigalt, NULL);
+    if (set)
+    {
+        res = set_alt_stack(tlsdata, TRUE);
 
-    if (res != 0)
-        return errno;
+        if (res != 0)
+            return errno;
+    }
 
     tlsdata->guard_page_set = set;
     return 0;