1.0.19.33: Improved interrupt handling on darwin/x86[-64]
authorPaul Khuong <pvk@pvk.ca>
Wed, 20 Aug 2008 21:16:46 +0000 (21:16 +0000)
committerPaul Khuong <pvk@pvk.ca>
Wed, 20 Aug 2008 21:16:46 +0000 (21:16 +0000)
 * Remove an obsolete race condition check in SIGBUS handling
   on x86. Accesses to unmapped addresses should no longer result
   in infinite loops.

 * Now reserve a 256 byte (slightly more than that is actually safe
   to use) zone just below SP for signal handlers to safely push
   data in.

src/runtime/x86-64-darwin-os.c
src/runtime/x86-darwin-os.c
version.lisp-expr

index 5a05656..99f8121 100644 (file)
@@ -359,6 +359,10 @@ catch_exception_raise(mach_port_t exception_port,
 
             backup_thread_state = thread_state;
             open_stack_allocation(&thread_state);
+            /* Reserve a 256 byte zone for signal handlers
+             * to use on the interrupted thread stack.
+             */
+            stack_allocate(&thread_state, 256);
 
             /* Save thread state */
             target_thread_state =
@@ -399,6 +403,7 @@ catch_exception_raise(mach_port_t exception_port,
                  addr < undefined_alien_address + os_vm_page_size) {
             backup_thread_state = thread_state;
             open_stack_allocation(&thread_state);
+            stack_allocate(&thread_state, 256);
 
             /* Save thread state */
             target_thread_state =
@@ -428,6 +433,7 @@ catch_exception_raise(mach_port_t exception_port,
 
             backup_thread_state = thread_state;
             open_stack_allocation(&thread_state);
+            stack_allocate(&thread_state, 256);
 
             /* Save thread state */
             target_thread_state =
@@ -504,6 +510,7 @@ catch_exception_raise(mach_port_t exception_port,
 
             backup_thread_state = thread_state;
             open_stack_allocation(&thread_state);
+            stack_allocate(&thread_state, 256);
 
             /* Save thread state */
             target_thread_state =
index 248e782..121b63b 100644 (file)
@@ -312,6 +312,7 @@ void call_handler_on_thread(mach_port_t thread,
     /* Initialize the new state */
     new_state = *thread_state;
     open_stack_allocation(&new_state);
+    stack_allocate(&new_state, 256);
     /* Save old state */
     save_thread_state = (x86_thread_state32_t *)stack_allocate(&new_state, sizeof(*save_thread_state));
     *save_thread_state = *thread_state;
@@ -453,27 +454,6 @@ catch_exception_raise(mach_port_t exception_port,
             protect_control_stack_return_guard_page_thread(0, th);
             break;
         }
-        /* Get vm_region info */
-        region_addr = (vm_address_t)code_vector[1];
-        info_count = VM_REGION_BASIC_INFO_COUNT;
-        if ((ret = vm_region(mach_task_self(),
-                             &region_addr,
-                             &region_size,
-                             VM_REGION_BASIC_INFO,
-                             (vm_region_info_t)&region_info,
-                             &info_count,
-                             &region_name)))
-            lose("vm_region (VM_REGION_BASIC_INFO) failed failed %d\n", ret);
-        /* Check if still protected */
-        if ((region_info.protection & OS_VM_PROT_ALL) == 0) {
-          /* KLUDGE:
-           * If two threads fault on the same page, the protection
-           * is cleared as the first thread runs memory_fault_handler.
-           * Grep for "not marked as write-protected" in gencgc.c
-           */
-            ret = KERN_SUCCESS;
-            break;
-        }
         /* Regular memory fault */
         handler = memory_fault_handler;
         break;
index 950c47d..0a72b8b 100644 (file)
@@ -17,4 +17,4 @@
 ;;; checkins which aren't released. (And occasionally for internal
 ;;; versions, especially for internal versions off the main CVS
 ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
-"1.0.19.32"
+"1.0.19.33"