From b20e8cac4dd15882d5e0fda1bcf04c487df1360f Mon Sep 17 00:00:00 2001 From: Paul Khuong Date: Wed, 20 Aug 2008 21:16:46 +0000 Subject: [PATCH] 1.0.19.33: Improved interrupt handling on darwin/x86[-64] * 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 | 7 +++++++ src/runtime/x86-darwin-os.c | 22 +--------------------- version.lisp-expr | 2 +- 3 files changed, 9 insertions(+), 22 deletions(-) diff --git a/src/runtime/x86-64-darwin-os.c b/src/runtime/x86-64-darwin-os.c index 5a0565611..99f812134 100644 --- a/src/runtime/x86-64-darwin-os.c +++ b/src/runtime/x86-64-darwin-os.c @@ -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 = diff --git a/src/runtime/x86-darwin-os.c b/src/runtime/x86-darwin-os.c index 248e782dc..121b63b7e 100644 --- a/src/runtime/x86-darwin-os.c +++ b/src/runtime/x86-darwin-os.c @@ -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(), - ®ion_addr, - ®ion_size, - VM_REGION_BASIC_INFO, - (vm_region_info_t)®ion_info, - &info_count, - ®ion_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; diff --git a/version.lisp-expr b/version.lisp-expr index 950c47d2b..0a72b8b9d 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -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" -- 2.11.4.GIT