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/04 15:07:10 UTC

svn commit: r663088 - in /harmony/enhanced/drlvm/trunk/vm: port/src/signals/win/signals_common.cpp port/src/thread/win/thread_os.c vmcore/src/exception/exceptions_jit.cpp

Author: iberezhn
Date: Wed Jun  4 06:07:09 2008
New Revision: 663088

URL: http://svn.apache.org/viewvc?rev=663088&view=rev
Log:
Applied patch from HARMONY-5859
[drlvm][signals] Regression test H4265 fails after r660062 commit


Modified:
    harmony/enhanced/drlvm/trunk/vm/port/src/signals/win/signals_common.cpp
    harmony/enhanced/drlvm/trunk/vm/port/src/thread/win/thread_os.c
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/exception/exceptions_jit.cpp

Modified: harmony/enhanced/drlvm/trunk/vm/port/src/signals/win/signals_common.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/port/src/signals/win/signals_common.cpp?rev=663088&r1=663087&r2=663088&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/port/src/signals/win/signals_common.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/port/src/signals/win/signals_common.cpp Wed Jun  4 06:07:09 2008
@@ -111,10 +111,10 @@
         {
             port_thread_restore_guard_page();
             tlsdata->restore_guard_page = FALSE;
-
-            if (port_thread_detach_temporary() == 0)
-                STD_FREE(tlsdata);
         }
+
+        if (port_thread_detach_temporary() == 0)
+            STD_FREE(tlsdata);
         return;
     }
 
@@ -250,6 +250,8 @@
 
     if (code == STATUS_STACK_OVERFLOW)
     {
+        tlsdata->guard_page_set = FALSE; // GUARD_PAGE was cleared by OS
+
         if (!tlsdata->restore_guard_page)
             tlsdata->restore_guard_page = TRUE;
     }

Modified: harmony/enhanced/drlvm/trunk/vm/port/src/thread/win/thread_os.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/port/src/thread/win/thread_os.c?rev=663088&r1=663087&r2=663088&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/port/src/thread/win/thread_os.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/port/src/thread/win/thread_os.c Wed Jun  4 06:07:09 2008
@@ -109,7 +109,8 @@
     startstr->arg = data;
     startstr->stack_size = stacksize;
 
-    handle = _beginthreadex(NULL, stacksize, thread_start_func, startstr, STACK_SIZE_PARAM_IS_A_RESERVATION, NULL);
+    handle = _beginthreadex(NULL, (int)stacksize, thread_start_func,
+                            startstr, STACK_SIZE_PARAM_IS_A_RESERVATION, NULL);
 
     if (handle != (uintptr_t)-1L)
     {
@@ -127,6 +128,10 @@
 
 static int set_guard_page(port_tls_data_t* tlsdata, Boolean set)
 {
+    DWORD oldProtect;
+    void* guard_addr;
+    size_t guard_size;
+
     if (!tlsdata)
         tlsdata = get_private_tls_data();
 
@@ -137,28 +142,36 @@
         return 0;
 
     if ((set && tlsdata->guard_page_set) ||
-         !set && !tlsdata->guard_page_set)
+        (!set && !tlsdata->guard_page_set))
         return 0; // Already in needed state
 
+#ifdef _EM64T_
+    /* Windows x86_64 protects both guard page and guard stack area
+       specified by SetThreadStackGuarantee() with PAGE_GUARD flag */
+    guard_addr = tlsdata->guard_stack_addr;
+    guard_size = tlsdata->guard_stack_size + tlsdata->guard_page_size;
+#else
+    guard_addr = tlsdata->guard_page_addr;
+    guard_size = tlsdata->guard_page_size;
+#endif
+
     if (set)
     {
         if ((size_t)&set - PSD->mem_protect_size
                 < (size_t)tlsdata->guard_page_addr + tlsdata->guard_page_size)
             return -1;
 
-        if (!VirtualAlloc(tlsdata->guard_page_addr, tlsdata->guard_page_size,
-                            MEM_COMMIT, PAGE_GUARD | PAGE_READWRITE))
+        if (!VirtualProtect(guard_addr, guard_size,
+                            PAGE_GUARD | PAGE_READWRITE, &oldProtect))
             // should be successful always
             return -1;
     }
     else
     {
-        DWORD oldProtect;
-
         if ((size_t)&set < (size_t)tlsdata->guard_page_addr + tlsdata->guard_page_size)
             return -1;
 
-        if (!VirtualProtect(tlsdata->guard_page_addr, tlsdata->guard_page_size,
+        if (!VirtualProtect(guard_addr, guard_size,
                             PAGE_READWRITE, &oldProtect))
             // should be successful always
             return -1;
@@ -237,11 +250,7 @@
             < (size_t)tlsdata->guard_page_addr + tlsdata->guard_page_size)
         return -1;
 
-    if (!VirtualFree(tlsdata->guard_stack_addr,
-                        tlsdata->guard_stack_size, MEM_DECOMMIT))
-        // should be successful always
-        return -1;
-
+    tlsdata->guard_page_set = TRUE; // GUARD_PAGE is set by default
     return 0;
 }
 
@@ -297,12 +306,7 @@
     res = init_stack(tlsdata, stack_size, temp);
     if (res != 0) return res;
 
-    res = set_private_tls_data(tlsdata);
-
-    if (res != 0)
-        set_guard_page(tlsdata, FALSE);
-
-    return res;
+    return set_private_tls_data(tlsdata);
 }
 
 int port_thread_attach()

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/exception/exceptions_jit.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/exception/exceptions_jit.cpp?rev=663088&r1=663087&r2=663088&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/exception/exceptions_jit.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/exception/exceptions_jit.cpp Wed Jun  4 06:07:09 2008
@@ -590,21 +590,19 @@
     }
 
     if (ti->get_global_capability(DebugUtilsTI::TI_GC_ENABLE_EXCEPTION_EVENT)) {
-        Registers regs = {0};
         VM_thread *thread = p_TLS_vmthread;
         NativeCodePtr callback = (NativeCodePtr)
                 jvmti_exception_catch_callback;
 
-        si_copy_to_registers(si, &regs);
-        vm_set_exception_registers(thread, regs);
+        si_copy_to_registers(si, regs);
+        vm_set_exception_registers(thread, *regs);
         si_set_callback(si, &callback);
     } else if (p_TLS_vmthread->restore_guard_page) {
-        Registers regs = {0};
         VM_thread *thread = p_TLS_vmthread;
         NativeCodePtr callback = (NativeCodePtr)
                 exception_catch_callback;
-        si_copy_to_registers(si, &regs);
-        vm_set_exception_registers(thread, regs);
+        si_copy_to_registers(si, regs);
+        vm_set_exception_registers(thread, *regs);
         si_set_callback(si, &callback);
     }