X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-64-darwin-os.c;h=35ac2f9045064fd77535cc1f55da9384d5d7297c;hb=4bf2de6a2adff75459cf218c8bff67f6cdb91211;hp=5a0565611b19e93922feaeb9407610121c0f1088;hpb=e2b2b8f2156ede16d70a0bdd0cfad29ea31b8ccc;p=sbcl.git diff --git a/src/runtime/x86-64-darwin-os.c b/src/runtime/x86-64-darwin-os.c index 5a05656..35ac2f9 100644 --- a/src/runtime/x86-64-darwin-os.c +++ b/src/runtime/x86-64-darwin-os.c @@ -1,4 +1,3 @@ - #ifdef LISP_FEATURE_SB_THREAD #include #include @@ -25,11 +24,11 @@ #include #include -#ifdef MAC_OS_X_VERSION_10_5 +#if __DARWIN_UNIX03 #include #endif -#ifdef MAC_OS_X_VERSION_10_5 +#if __DARWIN_UNIX03 typedef struct __darwin_ucontext darwin_ucontext; typedef struct __darwin_mcontext64 darwin_mcontext; @@ -65,9 +64,10 @@ pthread_mutex_t mach_exception_lock = PTHREAD_MUTEX_INITIALIZER; kern_return_t mach_thread_init(mach_port_t thread_exception_port); -void sigill_handler(int signal, siginfo_t *siginfo, void *void_context); -void sigtrap_handler(int signal, siginfo_t *siginfo, void *void_context); -void memory_fault_handler(int signal, siginfo_t *siginfo, void *void_context); +void sigill_handler(int signal, siginfo_t *siginfo, os_context_t *context); +void sigtrap_handler(int signal, siginfo_t *siginfo, os_context_t *context); +void memory_fault_handler(int signal, siginfo_t *siginfo, + os_context_t *context); /* exc_server handles mach exception messages from the kernel and * calls catch exception raise. We use the system-provided @@ -277,17 +277,15 @@ void dump_context(x86_thread_state64_t *context) #endif void -control_stack_exhausted_handler(int signal, siginfo_t *siginfo, void *void_context) { - os_context_t *context = arch_os_get_context(&void_context); - +control_stack_exhausted_handler(int signal, siginfo_t *siginfo, + os_context_t *context) { + unblock_signals_in_context_and_maybe_warn(context); arrange_return_to_lisp_function (context, StaticSymbolFunction(CONTROL_STACK_EXHAUSTED_ERROR)); } void -undefined_alien_handler(int signal, siginfo_t *siginfo, void *void_context) { - os_context_t *context = arch_os_get_context(&void_context); - +undefined_alien_handler(int signal, siginfo_t *siginfo, os_context_t *context) { arrange_return_to_lisp_function (context, StaticSymbolFunction(UNDEFINED_ALIEN_VARIABLE_ERROR)); } @@ -354,11 +352,15 @@ catch_exception_raise(mach_port_t exception_port, * protection so the error handler has some headroom, protect the * previous page so that we can catch returns from the guard page * and restore it. */ - protect_control_stack_guard_page_thread(0, th); - protect_control_stack_return_guard_page_thread(1, th); + protect_control_stack_guard_page(0, th); + protect_control_stack_return_guard_page(1, th); 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 = @@ -392,13 +394,14 @@ catch_exception_raise(mach_port_t exception_port, * unprotect this one. This works even if we somehow missed * the return-guard-page, and hit it on our way to new * exhaustion instead. */ - protect_control_stack_guard_page_thread(1, th); - protect_control_stack_return_guard_page_thread(0, th); + protect_control_stack_guard_page(1, th); + protect_control_stack_return_guard_page(0, th); } else if (addr >= undefined_alien_address && 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 +431,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 +508,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 =