X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Finterrupt.c;h=94b2de85dac4fd03f2148c25b0124c346a7f4bbf;hb=4fc9d21ae1d8a6a2f8ff70f589d5da103203de13;hp=616bc78269a19e71a233089763d16eb6ea83f328;hpb=5dc28680e9cb2d598da02aed512aa49ea81fdade;p=sbcl.git diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 616bc78..94b2de8 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -220,7 +220,7 @@ void interrupt_internal_error(int signal, siginfo_t *info, os_context_t *context, boolean continuable) { - lispobj context_sap; + lispobj context_sap = 0; fake_foreign_function_call(context); @@ -257,7 +257,9 @@ interrupt_internal_error(int signal, siginfo_t *info, os_context_t *context, void interrupt_handle_pending(os_context_t *context) { +#ifndef __i386__ boolean were_in_lisp = !foreign_function_call_active; +#endif SetSymbolValue(INTERRUPT_PENDING, NIL); @@ -302,12 +304,27 @@ void interrupt_handle_now(int signal, siginfo_t *info, void *void_context) { os_context_t *context = (os_context_t*)void_context; - int were_in_lisp; +#ifndef __i386__ + boolean were_in_lisp; +#endif union interrupt_handler handler; -#ifdef __linux__ - SET_FPU_CONTROL_WORD(context->__fpregs_mem.cw); -#endif + /* FIXME: The CMU CL we forked off of had this Linux-only + * operation here. Newer CMU CLs (e.g. 18c) have hairier + * Linux/i386-only logic here. SBCL seems to be more reliable + * without anything here. However, if we start supporting code + * which sets the rounding mode, then we may want to do something + * special to force the rounding mode back to some standard value + * here, so that ISRs can have a standard environment. (OTOH, if + * rounding modes are under user control, then perhaps we should + * leave this up to the user.) + * + * In the absence of a test case to show that this is really a + * problem, we just suppress this code completely (just like the + * parallel code in maybe_now_maybe_later). + * #ifdef __linux__ + * SET_FPU_CONTROL_WORD(context->__fpregs_mem.cw); + * #endif */ handler = interrupt_handlers[signal]; @@ -315,8 +332,8 @@ interrupt_handle_now(int signal, siginfo_t *info, void *void_context) return; } - were_in_lisp = !foreign_function_call_active; #ifndef __i386__ + were_in_lisp = !foreign_function_call_active; if (were_in_lisp) #endif { @@ -381,14 +398,14 @@ maybe_now_maybe_later(int signal, siginfo_t *info, void *void_context) /* FIXME: See Debian cmucl 2.4.17, and mail from DTC on the CMU CL * mailing list 23 Oct 1999, for changes in FPU handling at - * interrupt time which should be ported into SBCL. + * interrupt time which should be ported into SBCL. Also see the + * analogous logic at the head of interrupt_handle_now for + * more related FIXME stuff. * - * (Is this related to the way that it seems that if we do decide - * to handle the interrupt later, we've now screwed up the FPU - * control word?) */ -#ifdef __linux__ - SET_FPU_CONTROL_WORD(context->__fpregs_mem.cw); -#endif + * For now, we just suppress this code completely. + * #ifdef __linux__ + * SET_FPU_CONTROL_WORD(context->__fpregs_mem.cw); + * #endif */ if (SymbolValue(INTERRUPTS_ENABLED) == NIL) {