X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-64-darwin-os.c;h=00da75f45026237483c4e10488e3e30626774480;hb=922fe0d6da0e4bdcd366f5101395670aabd14e62;hp=046a12500623b82c383384ff771119f00ec8f6c5;hpb=a96167c44596bf4e549b514dd3fd8880081510da;p=sbcl.git diff --git a/src/runtime/x86-64-darwin-os.c b/src/runtime/x86-64-darwin-os.c index 046a125..00da75f 100644 --- a/src/runtime/x86-64-darwin-os.c +++ b/src/runtime/x86-64-darwin-os.c @@ -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); @@ -352,8 +362,7 @@ 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(0, th); - protect_control_stack_return_guard_page(1, th); + lower_thread_control_stack_guard_page(th); backup_thread_state = thread_state; open_stack_allocation(&thread_state); @@ -394,8 +403,7 @@ 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(1, th); - protect_control_stack_return_guard_page(0, th); + reset_thread_control_stack_guard_page(th); } else if (addr >= undefined_alien_address && addr < undefined_alien_address + os_vm_page_size) {