X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-64-darwin-os.c;h=00da75f45026237483c4e10488e3e30626774480;hb=922fe0d6da0e4bdcd366f5101395670aabd14e62;hp=83a1f1e1a596e894daeb667d71c995a4d7337a9a;hpb=c395677d01755a46ccb82397a3481f065976773b;p=sbcl.git diff --git a/src/runtime/x86-64-darwin-os.c b/src/runtime/x86-64-darwin-os.c index 83a1f1e..00da75f 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 @@ -119,8 +119,18 @@ void align_context_stack(x86_thread_state64_t *context) * the old ESP value and other register state when activated. The * first part of this is the recovery trampoline, which loads ESP from * EBP, pops EBP, and returns. */ -asm(".globl _stack_allocation_recover; .align 4; _stack_allocation_recover: mov %rbp, %rsp; pop %rsi; pop %rdi; pop \ -%rdx; pop %rcx; pop %r8; pop %r9; pop %rbp; ret;"); +asm(".globl _stack_allocation_recover; \ + .align 4; \ + _stack_allocation_recover: \ + lea -48(%rbp), %rsp; \ + pop %rsi; \ + pop %rdi; \ + pop %rdx; \ + pop %rcx; \ + pop %r8; \ + pop %r9; \ + pop %rbp; \ + ret;"); void open_stack_allocation(x86_thread_state64_t *context) { @@ -128,6 +138,7 @@ void open_stack_allocation(x86_thread_state64_t *context) push_context(context->rip, context); push_context(context->rbp, context); + context->rbp = context->rsp; push_context(context->r9, context); push_context(context->r8, context); @@ -136,7 +147,6 @@ void open_stack_allocation(x86_thread_state64_t *context) push_context(context->rsi, context); push_context(context->rdi, context); - context->rbp = context->rsp; context->rip = (u64) stack_allocation_recover; align_context_stack(context); @@ -233,7 +243,7 @@ void signal_emulation_wrapper(x86_thread_state64_t *thread_state, build_fake_signal_context(context, thread_state, float_state); - block_blockable_signals(); + block_blockable_signals(0, 0); handler(signal, siginfo, context); @@ -277,19 +287,17 @@ 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, SymbolFunction(CONTROL_STACK_EXHAUSTED_ERROR)); + (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, SymbolFunction(UNDEFINED_ALIEN_VARIABLE_ERROR)); + (context, StaticSymbolFunction(UNDEFINED_ALIEN_VARIABLE_ERROR)); } kern_return_t @@ -354,11 +362,14 @@ 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); + lower_thread_control_stack_guard_page(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 +403,13 @@ 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); + reset_thread_control_stack_guard_page(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 +439,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 +516,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 = @@ -574,7 +587,7 @@ mach_exception_handler(void *port) /* mach_msg_server should never return, but it should dispatch mach * exceptions to our catch_exception_raise function */ - abort(); + lose("mach_msg_server returned"); } /* Sets up the thread that will listen for mach exceptions. note that