X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Finterrupt.c;h=23773085e3d09b03c783c2ec778e3fb78930dd24;hb=3b3086ad5ad36a66302e1e6c5b7c8246c7963462;hp=0067a1002a60419499038ed836a9a5ae09201887;hpb=5e1fcdac979db9a6aebe69531229355def8c0f90;p=sbcl.git diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 0067a10..2377308 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -124,32 +124,12 @@ struct interrupt_data * global_interrupt_data; * mask ought to be clear anyway most of the time, but may be non-zero * if we were interrupted e.g. while waiting for a queue. */ -#if 1 void reset_signal_mask () { sigset_t new; sigemptyset(&new); sigprocmask(SIG_SETMASK,&new,0); } -#else -void reset_signal_mask () -{ - sigset_t new,old; - int i; - int wrong=0; - sigemptyset(&new); - sigprocmask(SIG_SETMASK,&new,&old); - for(i=1; icode); #endif @@ -670,6 +650,32 @@ void arrange_return_to_lisp_function(os_context_t *context, lispobj function) *(sp-2)=*os_context_register_addr(context,reg_EBP); *(sp-1)=*os_context_pc_addr(context); +#elif defined(LISP_FEATURE_X86_64) + u64 *sp=(u64 *)*os_context_register_addr(context,reg_RSP); + *(sp-19) = post_signal_tramp; /* return address for call_into_lisp */ + + *(sp-18)=*os_context_register_addr(context,reg_R15); + *(sp-17)=*os_context_register_addr(context,reg_R14); + *(sp-16)=*os_context_register_addr(context,reg_R13); + *(sp-15)=*os_context_register_addr(context,reg_R12); + *(sp-14)=*os_context_register_addr(context,reg_R11); + *(sp-13)=*os_context_register_addr(context,reg_R10); + *(sp-12)=*os_context_register_addr(context,reg_R9); + *(sp-11)=*os_context_register_addr(context,reg_R8); + *(sp-10)=*os_context_register_addr(context,reg_RDI); + *(sp-9)=*os_context_register_addr(context,reg_RSI); + *(sp-8)=*os_context_register_addr(context,reg_RSP)-16; + *(sp-7)=0; + *(sp-6)=*os_context_register_addr(context,reg_RBX); + *(sp-5)=*os_context_register_addr(context,reg_RDX); + *(sp-4)=*os_context_register_addr(context,reg_RCX); + *(sp-3)=*os_context_register_addr(context,reg_RAX); + *(sp-2)=*os_context_register_addr(context,reg_RBP); + *(sp-1)=*os_context_pc_addr(context); + + *os_context_register_addr(context,reg_RDI) = function; /* function */ + *os_context_register_addr(context,reg_RSI) = 0; /* arg. array */ + *os_context_register_addr(context,reg_RDX) = 0; /* no. args */ #else struct thread *th=arch_os_get_current_thread(); build_fake_control_stack_frames(th,context); @@ -684,6 +690,11 @@ void arrange_return_to_lisp_function(os_context_t *context, lispobj function) #else *os_context_register_addr(context,reg_ESP) = sp-14; #endif +#elif defined(LISP_FEATURE_X86_64) + *os_context_pc_addr(context) = call_into_lisp; + *os_context_register_addr(context,reg_RCX) = 0; + *os_context_register_addr(context,reg_RBP) = sp-2; + *os_context_register_addr(context,reg_RSP) = sp-19; #else /* this much of the calling convention is common to all non-x86 ports */ @@ -723,6 +734,16 @@ void thread_exit_handler(int num, siginfo_t *info, void *v_context) #endif +/* KLUDGE: Theoretically the approach we use for undefined alien + * variables should work for functions as well, but on PPC/Darwin + * we get bus error at bogus addresses instead, hence this workaround, + * that has the added benefit of automatically discriminating between + * functions and variables. + */ +void undefined_alien_function() { + funcall0(SymbolFunction(UNDEFINED_ALIEN_FUNCTION_ERROR)); +} + boolean handle_guard_page_triggered(os_context_t *context,void *addr){ struct thread *th=arch_os_get_current_thread(); @@ -754,7 +775,7 @@ boolean handle_guard_page_triggered(os_context_t *context,void *addr){ else if (addr >= undefined_alien_address && addr < undefined_alien_address + os_vm_page_size) { arrange_return_to_lisp_function - (context, SymbolFunction(UNDEFINED_ALIEN_ERROR)); + (context, SymbolFunction(UNDEFINED_ALIEN_VARIABLE_ERROR)); return 1; } else return 0;