9a02e7f22d0bc55a23b5da3ab3c8b4da141b83f0
[sbcl.git] / src / runtime / interrupt.c
1 /*
2  * interrupt-handling magic
3  */
4
5 /*
6  * This software is part of the SBCL system. See the README file for
7  * more information.
8  *
9  * This software is derived from the CMU CL system, which was
10  * written at Carnegie Mellon University and released into the
11  * public domain. The software is in the public domain and is
12  * provided with absolutely no warranty. See the COPYING and CREDITS
13  * files for more information.
14  */
15
16
17 /* As far as I can tell, what's going on here is:
18  *
19  * In the case of most signals, when Lisp asks us to handle the
20  * signal, the outermost handler (the one actually passed to UNIX) is
21  * either interrupt_handle_now(..) or maybe_now_maybe_later(..).
22  * In that case, the Lisp-level handler is stored in interrupt_handlers[..]
23  * and interrupt_low_level_handlers[..] is cleared.
24  *
25  * However, some signals need special handling, e.g.
26  *
27  * o the SIGSEGV (for e.g. Linux) or SIGBUS (for e.g. FreeBSD) used by the
28  *   garbage collector to detect violations of write protection,
29  *   because some cases of such signals (e.g. GC-related violations of
30  *   write protection) are handled at C level and never passed on to
31  *   Lisp. For such signals, we still store any Lisp-level handler
32  *   in interrupt_handlers[..], but for the outermost handle we use
33  *   the value from interrupt_low_level_handlers[..], instead of the
34  *   ordinary interrupt_handle_now(..) or interrupt_handle_later(..).
35  *
36  * o the SIGTRAP (Linux/Alpha) which Lisp code uses to handle breakpoints,
37  *   pseudo-atomic sections, and some classes of error (e.g. "function
38  *   not defined").  This never goes anywhere near the Lisp handlers at all.
39  *   See runtime/alpha-arch.c and code/signal.lisp
40  *
41  * - WHN 20000728, dan 20010128 */
42
43 #include "sbcl.h"
44
45 #include <stdio.h>
46 #include <stdlib.h>
47 #include <string.h>
48 #include <signal.h>
49 #include <sys/types.h>
50 #ifndef LISP_FEATURE_WIN32
51 #include <sys/wait.h>
52 #endif
53 #include <errno.h>
54
55 #include "runtime.h"
56 #include "arch.h"
57 #include "os.h"
58 #include "interrupt.h"
59 #include "globals.h"
60 #include "lispregs.h"
61 #include "validate.h"
62 #include "interr.h"
63 #include "gc.h"
64 #include "alloc.h"
65 #include "dynbind.h"
66 #include "pseudo-atomic.h"
67 #include "genesis/fdefn.h"
68 #include "genesis/simple-fun.h"
69 #include "genesis/cons.h"
70
71 /* When we catch an internal error, should we pass it back to Lisp to
72  * be handled in a high-level way? (Early in cold init, the answer is
73  * 'no', because Lisp is still too brain-dead to handle anything.
74  * After sufficient initialization has been completed, the answer
75  * becomes 'yes'.) */
76 boolean internal_errors_enabled = 0;
77
78 #ifndef LISP_FEATURE_WIN32
79 static
80 void (*interrupt_low_level_handlers[NSIG]) (int, siginfo_t*, os_context_t*);
81 #endif
82 union interrupt_handler interrupt_handlers[NSIG];
83
84 /* Under Linux on some architectures, we appear to have to restore the
85  * FPU control word from the context, as after the signal is delivered
86  * we appear to have a null FPU control word. */
87 #if defined(RESTORE_FP_CONTROL_FROM_CONTEXT)
88 #define RESTORE_FP_CONTROL_WORD(context,void_context)           \
89     os_context_t *context = arch_os_get_context(&void_context); \
90     os_restore_fp_control(context);
91 #else
92 #define RESTORE_FP_CONTROL_WORD(context,void_context)           \
93     os_context_t *context = arch_os_get_context(&void_context);
94 #endif
95
96 /* Foreign code may want to start some threads on its own.
97  * Non-targetted, truly asynchronous signals can be delivered to
98  * basically any thread, but invoking Lisp handlers in such foregign
99  * threads is really bad, so let's resignal it.
100  *
101  * This should at least bring attention to the problem, but it cannot
102  * work for SIGSEGV and similar. It is good enough for timers, and
103  * maybe all deferrables. */
104
105 #ifdef LISP_FEATURE_SB_THREAD
106 static void
107 add_handled_signals(sigset_t *sigset)
108 {
109     int i;
110     for(i = 1; i < NSIG; i++) {
111         if (!(ARE_SAME_HANDLER(interrupt_low_level_handlers[i], SIG_DFL)) ||
112             !(ARE_SAME_HANDLER(interrupt_handlers[i].c, SIG_DFL))) {
113             sigaddset(sigset, i);
114         }
115     }
116 }
117
118 void block_signals(sigset_t *what, sigset_t *where, sigset_t *old);
119 #endif
120
121 static boolean
122 maybe_resignal_to_lisp_thread(int signal, os_context_t *context)
123 {
124 #ifdef LISP_FEATURE_SB_THREAD
125     if (!pthread_getspecific(lisp_thread)) {
126         if (!(sigismember(&deferrable_sigset,signal))) {
127             corruption_warning_and_maybe_lose
128                 ("Received signal %d in non-lisp thread %lu, resignalling to a lisp thread.",
129                  signal,
130                  pthread_self());
131         }
132         {
133             sigset_t sigset;
134             sigemptyset(&sigset);
135             add_handled_signals(&sigset);
136             block_signals(&sigset, 0, 0);
137             block_signals(&sigset, os_context_sigmask_addr(context), 0);
138             kill(getpid(), signal);
139         }
140         return 1;
141     } else
142 #endif
143         return 0;
144 }
145
146 /* These are to be used in signal handlers. Currently all handlers are
147  * called from one of:
148  *
149  * interrupt_handle_now_handler
150  * maybe_now_maybe_later
151  * unblock_me_trampoline
152  * low_level_handle_now_handler
153  * low_level_maybe_now_maybe_later
154  * low_level_unblock_me_trampoline
155  *
156  * This gives us a single point of control (or six) over errno, fp
157  * control word, and fixing up signal context on sparc.
158  *
159  * The SPARC/Linux platform doesn't quite do signals the way we want
160  * them done. The third argument in the handler isn't filled in by the
161  * kernel properly, so we fix it up ourselves in the
162  * arch_os_get_context(..) function. -- CSR, 2002-07-23
163  */
164 #define SAVE_ERRNO(signal,context,void_context)                 \
165     {                                                           \
166         int _saved_errno = errno;                               \
167         RESTORE_FP_CONTROL_WORD(context,void_context);          \
168         if (!maybe_resignal_to_lisp_thread(signal, context))    \
169         {
170
171 #define RESTORE_ERRNO                                           \
172         }                                                       \
173         errno = _saved_errno;                                   \
174     }
175
176 static void run_deferred_handler(struct interrupt_data *data,
177                                  os_context_t *context);
178 #ifndef LISP_FEATURE_WIN32
179 static void store_signal_data_for_later (struct interrupt_data *data,
180                                          void *handler, int signal,
181                                          siginfo_t *info,
182                                          os_context_t *context);
183 \f
184
185 /* Generic signal related utilities. */
186
187 void
188 get_current_sigmask(sigset_t *sigset)
189 {
190     /* Get the current sigmask, by blocking the empty set. */
191     thread_sigmask(SIG_BLOCK, 0, sigset);
192 }
193
194 void
195 block_signals(sigset_t *what, sigset_t *where, sigset_t *old)
196 {
197     if (where) {
198         int i;
199         if (old)
200             sigcopyset(old, where);
201         for(i = 1; i < NSIG; i++) {
202             if (sigismember(what, i))
203                 sigaddset(where, i);
204         }
205     } else {
206         thread_sigmask(SIG_BLOCK, what, old);
207     }
208 }
209
210 void
211 unblock_signals(sigset_t *what, sigset_t *where, sigset_t *old)
212 {
213     if (where) {
214         int i;
215         if (old)
216             sigcopyset(old, where);
217         for(i = 1; i < NSIG; i++) {
218             if (sigismember(what, i))
219                 sigdelset(where, i);
220         }
221     } else {
222         thread_sigmask(SIG_UNBLOCK, what, old);
223     }
224 }
225
226 static void
227 print_sigset(sigset_t *sigset)
228 {
229   int i;
230   for(i = 1; i < NSIG; i++) {
231     if (sigismember(sigset, i))
232       fprintf(stderr, "Signal %d masked\n", i);
233   }
234 }
235
236 /* Return 1 is all signals is sigset2 are masked in sigset, return 0
237  * if all re unmasked else die. Passing NULL for sigset is a shorthand
238  * for the current sigmask. */
239 boolean
240 all_signals_blocked_p(sigset_t *sigset, sigset_t *sigset2,
241                                 const char *name)
242 {
243 #if !defined(LISP_FEATURE_WIN32)
244     int i;
245     boolean has_blocked = 0, has_unblocked = 0;
246     sigset_t current;
247     if (sigset == 0) {
248         get_current_sigmask(&current);
249         sigset = &current;
250     }
251     for(i = 1; i < NSIG; i++) {
252         if (sigismember(sigset2, i)) {
253             if (sigismember(sigset, i))
254                 has_blocked = 1;
255             else
256                 has_unblocked = 1;
257         }
258     }
259     if (has_blocked && has_unblocked) {
260         print_sigset(sigset);
261         lose("some %s signals blocked, some unblocked\n", name);
262     }
263     if (has_blocked)
264         return 1;
265     else
266         return 0;
267 #endif
268 }
269 \f
270
271 /* Deferrables, blockables, gc signals. */
272
273 void
274 sigaddset_deferrable(sigset_t *s)
275 {
276     sigaddset(s, SIGHUP);
277     sigaddset(s, SIGINT);
278     sigaddset(s, SIGTERM);
279     sigaddset(s, SIGQUIT);
280     sigaddset(s, SIGPIPE);
281     sigaddset(s, SIGALRM);
282     sigaddset(s, SIGURG);
283     sigaddset(s, SIGTSTP);
284     sigaddset(s, SIGCHLD);
285     sigaddset(s, SIGIO);
286 #ifndef LISP_FEATURE_HPUX
287     sigaddset(s, SIGXCPU);
288     sigaddset(s, SIGXFSZ);
289 #endif
290     sigaddset(s, SIGVTALRM);
291     sigaddset(s, SIGPROF);
292     sigaddset(s, SIGWINCH);
293 }
294
295 void
296 sigaddset_blockable(sigset_t *sigset)
297 {
298     sigaddset_deferrable(sigset);
299     sigaddset_gc(sigset);
300 }
301
302 void
303 sigaddset_gc(sigset_t *sigset)
304 {
305 #ifdef LISP_FEATURE_SB_THREAD
306     sigaddset(sigset,SIG_STOP_FOR_GC);
307 #endif
308 }
309
310 /* initialized in interrupt_init */
311 sigset_t deferrable_sigset;
312 sigset_t blockable_sigset;
313 sigset_t gc_sigset;
314
315 #endif
316
317 #if !defined(LISP_FEATURE_WIN32)
318 boolean
319 deferrables_blocked_p(sigset_t *sigset)
320 {
321     return all_signals_blocked_p(sigset, &deferrable_sigset, "deferrable");
322 }
323 #endif
324
325 void
326 check_deferrables_unblocked_or_lose(sigset_t *sigset)
327 {
328 #if !defined(LISP_FEATURE_WIN32)
329     if (deferrables_blocked_p(sigset))
330         lose("deferrables blocked\n");
331 #endif
332 }
333
334 void
335 check_deferrables_blocked_or_lose(sigset_t *sigset)
336 {
337 #if !defined(LISP_FEATURE_WIN32)
338     if (!deferrables_blocked_p(sigset))
339         lose("deferrables unblocked\n");
340 #endif
341 }
342
343 #if !defined(LISP_FEATURE_WIN32)
344 boolean
345 blockables_blocked_p(sigset_t *sigset)
346 {
347     return all_signals_blocked_p(sigset, &blockable_sigset, "blockable");
348 }
349 #endif
350
351 void
352 check_blockables_unblocked_or_lose(sigset_t *sigset)
353 {
354 #if !defined(LISP_FEATURE_WIN32)
355     if (blockables_blocked_p(sigset))
356         lose("blockables blocked\n");
357 #endif
358 }
359
360 void
361 check_blockables_blocked_or_lose(sigset_t *sigset)
362 {
363 #if !defined(LISP_FEATURE_WIN32)
364     if (!blockables_blocked_p(sigset))
365         lose("blockables unblocked\n");
366 #endif
367 }
368
369 #if !defined(LISP_FEATURE_WIN32)
370 boolean
371 gc_signals_blocked_p(sigset_t *sigset)
372 {
373     return all_signals_blocked_p(sigset, &gc_sigset, "gc");
374 }
375 #endif
376
377 void
378 check_gc_signals_unblocked_or_lose(sigset_t *sigset)
379 {
380 #if !defined(LISP_FEATURE_WIN32)
381     if (gc_signals_blocked_p(sigset))
382         lose("gc signals blocked\n");
383 #endif
384 }
385
386 void
387 check_gc_signals_blocked_or_lose(sigset_t *sigset)
388 {
389 #if !defined(LISP_FEATURE_WIN32)
390     if (!gc_signals_blocked_p(sigset))
391         lose("gc signals unblocked\n");
392 #endif
393 }
394
395 void
396 block_deferrable_signals(sigset_t *where, sigset_t *old)
397 {
398 #ifndef LISP_FEATURE_WIN32
399     block_signals(&deferrable_sigset, where, old);
400 #endif
401 }
402
403 void
404 block_blockable_signals(sigset_t *where, sigset_t *old)
405 {
406 #ifndef LISP_FEATURE_WIN32
407     block_signals(&blockable_sigset, where, old);
408 #endif
409 }
410
411 void
412 block_gc_signals(sigset_t *where, sigset_t *old)
413 {
414 #ifndef LISP_FEATURE_WIN32
415     block_signals(&gc_sigset, where, old);
416 #endif
417 }
418
419 void
420 unblock_deferrable_signals(sigset_t *where, sigset_t *old)
421 {
422 #ifndef LISP_FEATURE_WIN32
423     if (interrupt_handler_pending_p())
424         lose("unblock_deferrable_signals: losing proposition\n");
425     check_gc_signals_unblocked_or_lose(where);
426     unblock_signals(&deferrable_sigset, where, old);
427 #endif
428 }
429
430 void
431 unblock_blockable_signals(sigset_t *where, sigset_t *old)
432 {
433 #ifndef LISP_FEATURE_WIN32
434     unblock_signals(&blockable_sigset, where, old);
435 #endif
436 }
437
438 void
439 unblock_gc_signals(sigset_t *where, sigset_t *old)
440 {
441 #ifndef LISP_FEATURE_WIN32
442     unblock_signals(&gc_sigset, where, old);
443 #endif
444 }
445
446 void
447 unblock_signals_in_context_and_maybe_warn(os_context_t *context)
448 {
449 #ifndef LISP_FEATURE_WIN32
450     sigset_t *sigset = os_context_sigmask_addr(context);
451     if (all_signals_blocked_p(sigset, &gc_sigset, "gc")) {
452         corruption_warning_and_maybe_lose(
453 "Enabling blocked gc signals to allow returning to Lisp without risking\n\
454 gc deadlocks. Since GC signals are only blocked in signal handlers when \n\
455 they are not safe to interrupt at all, this is a pretty severe occurrence.\n");
456         unblock_gc_signals(sigset, 0);
457     }
458     if (!interrupt_handler_pending_p()) {
459         unblock_deferrable_signals(sigset, 0);
460     }
461 #endif
462 }
463 \f
464
465 inline static void
466 check_interrupts_enabled_or_lose(os_context_t *context)
467 {
468     struct thread *thread=arch_os_get_current_thread();
469     if (SymbolValue(INTERRUPTS_ENABLED,thread) == NIL)
470         lose("interrupts not enabled\n");
471     if (arch_pseudo_atomic_atomic(context))
472         lose ("in pseudo atomic section\n");
473 }
474
475 /* Save sigset (or the current sigmask if 0) if there is no pending
476  * handler, because that means that deferabbles are already blocked.
477  * The purpose is to avoid losing the pending gc signal if a
478  * deferrable interrupt async unwinds between clearing the pseudo
479  * atomic and trapping to GC.*/
480 void
481 maybe_save_gc_mask_and_block_deferrables(sigset_t *sigset)
482 {
483 #ifndef LISP_FEATURE_WIN32
484     struct thread *thread = arch_os_get_current_thread();
485     struct interrupt_data *data = thread->interrupt_data;
486     sigset_t oldset;
487     /* Obviously, this function is called when signals may not be
488      * blocked. Let's make sure we are not interrupted. */
489     block_blockable_signals(0, &oldset);
490 #ifndef LISP_FEATURE_SB_THREAD
491     /* With threads a SIG_STOP_FOR_GC and a normal GC may also want to
492      * block. */
493     if (data->gc_blocked_deferrables)
494         lose("gc_blocked_deferrables already true\n");
495 #endif
496     if ((!data->pending_handler) &&
497         (!data->gc_blocked_deferrables)) {
498         FSHOW_SIGNAL((stderr,"/setting gc_blocked_deferrables\n"));
499         data->gc_blocked_deferrables = 1;
500         if (sigset) {
501             /* This is the sigmask of some context. */
502             sigcopyset(&data->pending_mask, sigset);
503             sigaddset_deferrable(sigset);
504             thread_sigmask(SIG_SETMASK,&oldset,0);
505             return;
506         } else {
507             /* Operating on the current sigmask. Save oldset and
508              * unblock gc signals. In the end, this is equivalent to
509              * blocking the deferrables. */
510             sigcopyset(&data->pending_mask, &oldset);
511             thread_sigmask(SIG_UNBLOCK, &gc_sigset, 0);
512             return;
513         }
514     }
515     thread_sigmask(SIG_SETMASK,&oldset,0);
516 #endif
517 }
518
519 /* Are we leaving WITH-GCING and already running with interrupts
520  * enabled, without the protection of *GC-INHIBIT* T and there is gc
521  * (or stop for gc) pending, but we haven't trapped yet? */
522 int
523 in_leaving_without_gcing_race_p(struct thread *thread)
524 {
525     return ((SymbolValue(IN_WITHOUT_GCING,thread) != NIL) &&
526             (SymbolValue(INTERRUPTS_ENABLED,thread) != NIL) &&
527             (SymbolValue(GC_INHIBIT,thread) == NIL) &&
528             ((SymbolValue(GC_PENDING,thread) != NIL)
529 #if defined(LISP_FEATURE_SB_THREAD)
530              || (SymbolValue(STOP_FOR_GC_PENDING,thread) != NIL)
531 #endif
532              ));
533 }
534
535 /* Check our baroque invariants. */
536 void
537 check_interrupt_context_or_lose(os_context_t *context)
538 {
539 #ifndef LISP_FEATURE_WIN32
540     struct thread *thread = arch_os_get_current_thread();
541     struct interrupt_data *data = thread->interrupt_data;
542     int interrupt_deferred_p = (data->pending_handler != 0);
543     int interrupt_pending = (SymbolValue(INTERRUPT_PENDING,thread) != NIL);
544     sigset_t *sigset = os_context_sigmask_addr(context);
545     /* On PPC pseudo_atomic_interrupted is cleared when coming out of
546      * handle_allocation_trap. */
547 #if defined(LISP_FEATURE_GENCGC) && !defined(LISP_FEATURE_PPC)
548     int interrupts_enabled = (SymbolValue(INTERRUPTS_ENABLED,thread) != NIL);
549     int gc_inhibit = (SymbolValue(GC_INHIBIT,thread) != NIL);
550     int gc_pending = (SymbolValue(GC_PENDING,thread) == T);
551     int pseudo_atomic_interrupted = get_pseudo_atomic_interrupted(thread);
552     int in_race_p = in_leaving_without_gcing_race_p(thread);
553     /* In the time window between leaving the *INTERRUPTS-ENABLED* NIL
554      * section and trapping, a SIG_STOP_FOR_GC would see the next
555      * check fail, for this reason sig_stop_for_gc handler does not
556      * call this function. */
557     if (interrupt_deferred_p) {
558         if (!(!interrupts_enabled || pseudo_atomic_interrupted || in_race_p))
559             lose("Stray deferred interrupt.\n");
560     }
561     if (gc_pending)
562         if (!(pseudo_atomic_interrupted || gc_inhibit || in_race_p))
563             lose("GC_PENDING, but why?\n");
564 #if defined(LISP_FEATURE_SB_THREAD)
565     {
566         int stop_for_gc_pending =
567             (SymbolValue(STOP_FOR_GC_PENDING,thread) != NIL);
568         if (stop_for_gc_pending)
569             if (!(pseudo_atomic_interrupted || gc_inhibit || in_race_p))
570                 lose("STOP_FOR_GC_PENDING, but why?\n");
571         if (pseudo_atomic_interrupted)
572             if (!(gc_pending || stop_for_gc_pending || interrupt_deferred_p))
573                 lose("pseudo_atomic_interrupted, but why?\n");
574     }
575 #else
576     if (pseudo_atomic_interrupted)
577         if (!(gc_pending || interrupt_deferred_p))
578             lose("pseudo_atomic_interrupted, but why?\n");
579 #endif
580 #endif
581     if (interrupt_pending && !interrupt_deferred_p)
582         lose("INTERRUPT_PENDING but not pending handler.\n");
583     if ((data->gc_blocked_deferrables) && interrupt_pending)
584         lose("gc_blocked_deferrables and interrupt pending\n.");
585     if (data->gc_blocked_deferrables)
586         check_deferrables_blocked_or_lose(sigset);
587     if (interrupt_pending || interrupt_deferred_p ||
588         data->gc_blocked_deferrables)
589         check_deferrables_blocked_or_lose(sigset);
590     else {
591         check_deferrables_unblocked_or_lose(sigset);
592         /* If deferrables are unblocked then we are open to signals
593          * that run lisp code. */
594         check_gc_signals_unblocked_or_lose(sigset);
595     }
596 #endif
597 }
598 \f
599 /*
600  * utility routines used by various signal handlers
601  */
602
603 static void
604 build_fake_control_stack_frames(struct thread *th,os_context_t *context)
605 {
606 #ifndef LISP_FEATURE_C_STACK_IS_CONTROL_STACK
607
608     lispobj oldcont;
609
610     /* Build a fake stack frame or frames */
611
612     current_control_frame_pointer =
613         (lispobj *)(unsigned long)
614             (*os_context_register_addr(context, reg_CSP));
615     if ((lispobj *)(unsigned long)
616             (*os_context_register_addr(context, reg_CFP))
617         == current_control_frame_pointer) {
618         /* There is a small window during call where the callee's
619          * frame isn't built yet. */
620         if (lowtag_of(*os_context_register_addr(context, reg_CODE))
621             == FUN_POINTER_LOWTAG) {
622             /* We have called, but not built the new frame, so
623              * build it for them. */
624             current_control_frame_pointer[0] =
625                 *os_context_register_addr(context, reg_OCFP);
626             current_control_frame_pointer[1] =
627                 *os_context_register_addr(context, reg_LRA);
628             current_control_frame_pointer += 8;
629             /* Build our frame on top of it. */
630             oldcont = (lispobj)(*os_context_register_addr(context, reg_CFP));
631         }
632         else {
633             /* We haven't yet called, build our frame as if the
634              * partial frame wasn't there. */
635             oldcont = (lispobj)(*os_context_register_addr(context, reg_OCFP));
636         }
637     }
638     /* We can't tell whether we are still in the caller if it had to
639      * allocate a stack frame due to stack arguments. */
640     /* This observation provoked some past CMUCL maintainer to ask
641      * "Can anything strange happen during return?" */
642     else {
643         /* normal case */
644         oldcont = (lispobj)(*os_context_register_addr(context, reg_CFP));
645     }
646
647     current_control_stack_pointer = current_control_frame_pointer + 8;
648
649     current_control_frame_pointer[0] = oldcont;
650     current_control_frame_pointer[1] = NIL;
651     current_control_frame_pointer[2] =
652         (lispobj)(*os_context_register_addr(context, reg_CODE));
653 #endif
654 }
655
656 /* Stores the context for gc to scavange and builds fake stack
657  * frames. */
658 void
659 fake_foreign_function_call(os_context_t *context)
660 {
661     int context_index;
662     struct thread *thread=arch_os_get_current_thread();
663
664     /* context_index incrementing must not be interrupted */
665     check_blockables_blocked_or_lose(0);
666
667     /* Get current Lisp state from context. */
668 #ifdef reg_ALLOC
669     dynamic_space_free_pointer =
670         (lispobj *)(unsigned long)
671             (*os_context_register_addr(context, reg_ALLOC));
672 /*     fprintf(stderr,"dynamic_space_free_pointer: %p\n", */
673 /*             dynamic_space_free_pointer); */
674 #if defined(LISP_FEATURE_ALPHA) || defined(LISP_FEATURE_MIPS)
675     if ((long)dynamic_space_free_pointer & 1) {
676         lose("dead in fake_foreign_function_call, context = %x\n", context);
677     }
678 #endif
679 /* why doesnt PPC and SPARC do something like this: */
680 #if defined(LISP_FEATURE_HPPA)
681     if ((long)dynamic_space_free_pointer & 4) {
682         lose("dead in fake_foreign_function_call, context = %x, d_s_f_p = %x\n", context, dynamic_space_free_pointer);
683     }
684 #endif
685 #endif
686 #ifdef reg_BSP
687     current_binding_stack_pointer =
688         (lispobj *)(unsigned long)
689             (*os_context_register_addr(context, reg_BSP));
690 #endif
691
692     build_fake_control_stack_frames(thread,context);
693
694     /* Do dynamic binding of the active interrupt context index
695      * and save the context in the context array. */
696     context_index =
697         fixnum_value(SymbolValue(FREE_INTERRUPT_CONTEXT_INDEX,thread));
698
699     if (context_index >= MAX_INTERRUPTS) {
700         lose("maximum interrupt nesting depth (%d) exceeded\n", MAX_INTERRUPTS);
701     }
702
703     bind_variable(FREE_INTERRUPT_CONTEXT_INDEX,
704                   make_fixnum(context_index + 1),thread);
705
706     thread->interrupt_contexts[context_index] = context;
707
708 #if !defined(LISP_FEATURE_X86) && !defined(LISP_FEATURE_X86_64)
709     /* x86oid targets don't maintain the foreign function call flag at
710      * all, so leave them to believe that they are never in foreign
711      * code. */
712     foreign_function_call_active_p(thread) = 1;
713 #endif
714 }
715
716 /* blocks all blockable signals.  If you are calling from a signal handler,
717  * the usual signal mask will be restored from the context when the handler
718  * finishes.  Otherwise, be careful */
719 void
720 undo_fake_foreign_function_call(os_context_t *context)
721 {
722     struct thread *thread=arch_os_get_current_thread();
723     /* Block all blockable signals. */
724     block_blockable_signals(0, 0);
725
726     foreign_function_call_active_p(thread) = 0;
727
728     /* Undo dynamic binding of FREE_INTERRUPT_CONTEXT_INDEX */
729     unbind(thread);
730
731 #ifdef reg_ALLOC
732     /* Put the dynamic space free pointer back into the context. */
733     *os_context_register_addr(context, reg_ALLOC) =
734         (unsigned long) dynamic_space_free_pointer
735         | (*os_context_register_addr(context, reg_ALLOC)
736            & LOWTAG_MASK);
737     /*
738       ((unsigned long)(*os_context_register_addr(context, reg_ALLOC))
739       & ~LOWTAG_MASK)
740       | ((unsigned long) dynamic_space_free_pointer & LOWTAG_MASK);
741     */
742 #endif
743 }
744
745 /* a handler for the signal caused by execution of a trap opcode
746  * signalling an internal error */
747 void
748 interrupt_internal_error(os_context_t *context, boolean continuable)
749 {
750     lispobj context_sap;
751
752     fake_foreign_function_call(context);
753
754     if (!internal_errors_enabled) {
755         describe_internal_error(context);
756         /* There's no good way to recover from an internal error
757          * before the Lisp error handling mechanism is set up. */
758         lose("internal error too early in init, can't recover\n");
759     }
760
761     /* Allocate the SAP object while the interrupts are still
762      * disabled. */
763     unblock_gc_signals(0, 0);
764     context_sap = alloc_sap(context);
765
766 #ifndef LISP_FEATURE_WIN32
767     thread_sigmask(SIG_SETMASK, os_context_sigmask_addr(context), 0);
768 #endif
769
770 #if defined(LISP_FEATURE_LINUX) && defined(LISP_FEATURE_MIPS)
771     /* Workaround for blocked SIGTRAP. */
772     {
773         sigset_t newset;
774         sigemptyset(&newset);
775         sigaddset(&newset, SIGTRAP);
776         thread_sigmask(SIG_UNBLOCK, &newset, 0);
777     }
778 #endif
779
780     SHOW("in interrupt_internal_error");
781 #if QSHOW
782     /* Display some rudimentary debugging information about the
783      * error, so that even if the Lisp error handler gets badly
784      * confused, we have a chance to determine what's going on. */
785     describe_internal_error(context);
786 #endif
787     funcall2(StaticSymbolFunction(INTERNAL_ERROR), context_sap,
788              continuable ? T : NIL);
789
790     undo_fake_foreign_function_call(context); /* blocks signals again */
791     if (continuable)
792         arch_skip_instruction(context);
793 }
794
795 boolean
796 interrupt_handler_pending_p(void)
797 {
798     struct thread *thread = arch_os_get_current_thread();
799     struct interrupt_data *data = thread->interrupt_data;
800     return (data->pending_handler != 0);
801 }
802
803 void
804 interrupt_handle_pending(os_context_t *context)
805 {
806     /* There are three ways we can get here. First, if an interrupt
807      * occurs within pseudo-atomic, it will be deferred, and we'll
808      * trap to here at the end of the pseudo-atomic block. Second, if
809      * the GC (in alloc()) decides that a GC is required, it will set
810      * *GC-PENDING* and pseudo-atomic-interrupted if not *GC-INHIBIT*,
811      * and alloc() is always called from within pseudo-atomic, and
812      * thus we end up here again. Third, when calling GC-ON or at the
813      * end of a WITHOUT-GCING, MAYBE-HANDLE-PENDING-GC will trap to
814      * here if there is a pending GC. Fourth, ahem, at the end of
815      * WITHOUT-INTERRUPTS (bar complications with nesting). */
816
817     /* Win32 only needs to handle the GC cases (for now?) */
818
819     struct thread *thread = arch_os_get_current_thread();
820     struct interrupt_data *data = thread->interrupt_data;
821
822     if (arch_pseudo_atomic_atomic(context)) {
823         lose("Handling pending interrupt in pseudo atomic.");
824     }
825
826     FSHOW_SIGNAL((stderr, "/entering interrupt_handle_pending\n"));
827
828     check_blockables_blocked_or_lose(0);
829
830     /* If GC/SIG_STOP_FOR_GC struck during PA and there was no pending
831      * handler, then the pending mask was saved and
832      * gc_blocked_deferrables set. Hence, there can be no pending
833      * handler and it's safe to restore the pending mask.
834      *
835      * Note, that if gc_blocked_deferrables is false we may still have
836      * to GC. In this case, we are coming out of a WITHOUT-GCING or a
837      * pseudo atomic was interrupt be a deferrable first. */
838     if (data->gc_blocked_deferrables) {
839         if (data->pending_handler)
840             lose("GC blocked deferrables but still got a pending handler.");
841         if (SymbolValue(GC_INHIBIT,thread)!=NIL)
842             lose("GC blocked deferrables while GC is inhibited.");
843         /* Restore the saved signal mask from the original signal (the
844          * one that interrupted us during the critical section) into
845          * the os_context for the signal we're currently in the
846          * handler for. This should ensure that when we return from
847          * the handler the blocked signals are unblocked. */
848 #ifndef LISP_FEATURE_WIN32
849         sigcopyset(os_context_sigmask_addr(context), &data->pending_mask);
850 #endif
851         data->gc_blocked_deferrables = 0;
852     }
853
854     if (SymbolValue(GC_INHIBIT,thread)==NIL) {
855         void *original_pending_handler = data->pending_handler;
856
857 #ifdef LISP_FEATURE_SB_THREAD
858         if (SymbolValue(STOP_FOR_GC_PENDING,thread) != NIL) {
859             /* STOP_FOR_GC_PENDING and GC_PENDING are cleared by
860              * the signal handler if it actually stops us. */
861             arch_clear_pseudo_atomic_interrupted(context);
862             sig_stop_for_gc_handler(SIG_STOP_FOR_GC,NULL,context);
863         } else
864 #endif
865          /* Test for T and not for != NIL since the value :IN-PROGRESS
866           * is used in SUB-GC as part of the mechanism to supress
867           * recursive gcs.*/
868         if (SymbolValue(GC_PENDING,thread) == T) {
869
870             /* Two reasons for doing this. First, if there is a
871              * pending handler we don't want to run. Second, we are
872              * going to clear pseudo atomic interrupted to avoid
873              * spurious trapping on every allocation in SUB_GC and
874              * having a pending handler with interrupts enabled and
875              * without pseudo atomic interrupted breaks an
876              * invariant. */
877             if (data->pending_handler) {
878                 bind_variable(ALLOW_WITH_INTERRUPTS, NIL, thread);
879                 bind_variable(INTERRUPTS_ENABLED, NIL, thread);
880             }
881
882             arch_clear_pseudo_atomic_interrupted(context);
883
884             /* GC_PENDING is cleared in SUB-GC, or if another thread
885              * is doing a gc already we will get a SIG_STOP_FOR_GC and
886              * that will clear it.
887              *
888              * If there is a pending handler or gc was triggerred in a
889              * signal handler then maybe_gc won't run POST_GC and will
890              * return normally. */
891             if (!maybe_gc(context))
892                 lose("GC not inhibited but maybe_gc did not GC.");
893
894             if (data->pending_handler) {
895                 unbind(thread);
896                 unbind(thread);
897             }
898         } else if (SymbolValue(GC_PENDING,thread) != NIL) {
899             /* It's not NIL or T so GC_PENDING is :IN-PROGRESS. If
900              * GC-PENDING is not NIL then we cannot trap on pseudo
901              * atomic due to GC (see if(GC_PENDING) logic in
902              * cheneygc.c an gengcgc.c), plus there is a outer
903              * WITHOUT-INTERRUPTS SUB_GC, so how did we end up
904              * here? */
905             lose("Trapping to run pending handler while GC in progress.");
906         }
907
908         check_blockables_blocked_or_lose(0);
909
910         /* No GC shall be lost. If SUB_GC triggers another GC then
911          * that should be handled on the spot. */
912         if (SymbolValue(GC_PENDING,thread) != NIL)
913             lose("GC_PENDING after doing gc.");
914 #ifdef LISP_FEATURE_SB_THREAD
915         if (SymbolValue(STOP_FOR_GC_PENDING,thread) != NIL)
916             lose("STOP_FOR_GC_PENDING after doing gc.");
917 #endif
918         /* Check two things. First, that gc does not clobber a handler
919          * that's already pending. Second, that there is no interrupt
920          * lossage: if original_pending_handler was NULL then even if
921          * an interrupt arrived during GC (POST-GC, really) it was
922          * handled. */
923         if (original_pending_handler != data->pending_handler)
924             lose("pending handler changed in gc: %x -> %d.",
925                  original_pending_handler, data->pending_handler);
926     }
927
928 #ifndef LISP_FEATURE_WIN32
929     /* There may be no pending handler, because it was only a gc that
930      * had to be executed or because Lisp is a bit too eager to call
931      * DO-PENDING-INTERRUPT. */
932     if ((SymbolValue(INTERRUPTS_ENABLED,thread) != NIL) &&
933         (data->pending_handler))  {
934         /* No matter how we ended up here, clear both
935          * INTERRUPT_PENDING and pseudo atomic interrupted. It's safe
936          * because we checked above that there is no GC pending. */
937         SetSymbolValue(INTERRUPT_PENDING, NIL, thread);
938         arch_clear_pseudo_atomic_interrupted(context);
939         /* Restore the sigmask in the context. */
940         sigcopyset(os_context_sigmask_addr(context), &data->pending_mask);
941         run_deferred_handler(data, context);
942     }
943 #endif
944 #ifdef LISP_FEATURE_GENCGC
945     if (get_pseudo_atomic_interrupted(thread))
946         lose("pseudo_atomic_interrupted after interrupt_handle_pending\n");
947 #endif
948     /* It is possible that the end of this function was reached
949      * without never actually doing anything, the tests in Lisp for
950      * when to call receive-pending-interrupt are not exact. */
951     FSHOW_SIGNAL((stderr, "/exiting interrupt_handle_pending\n"));
952 }
953 \f
954
955 void
956 interrupt_handle_now(int signal, siginfo_t *info, os_context_t *context)
957 {
958     boolean were_in_lisp;
959     union interrupt_handler handler;
960
961     check_blockables_blocked_or_lose(0);
962
963 #ifndef LISP_FEATURE_WIN32
964     if (sigismember(&deferrable_sigset,signal))
965         check_interrupts_enabled_or_lose(context);
966 #endif
967
968     handler = interrupt_handlers[signal];
969
970     if (ARE_SAME_HANDLER(handler.c, SIG_IGN)) {
971         return;
972     }
973
974     were_in_lisp = !foreign_function_call_active_p(arch_os_get_current_thread());
975     if (were_in_lisp)
976     {
977         fake_foreign_function_call(context);
978     }
979
980     FSHOW_SIGNAL((stderr,
981                   "/entering interrupt_handle_now(%d, info, context)\n",
982                   signal));
983
984     if (ARE_SAME_HANDLER(handler.c, SIG_DFL)) {
985
986         /* This can happen if someone tries to ignore or default one
987          * of the signals we need for runtime support, and the runtime
988          * support decides to pass on it. */
989         lose("no handler for signal %d in interrupt_handle_now(..)\n", signal);
990
991     } else if (lowtag_of(handler.lisp) == FUN_POINTER_LOWTAG) {
992         /* Once we've decided what to do about contexts in a
993          * return-elsewhere world (the original context will no longer
994          * be available; should we copy it or was nobody using it anyway?)
995          * then we should convert this to return-elsewhere */
996
997         /* CMUCL comment said "Allocate the SAPs while the interrupts
998          * are still disabled.".  I (dan, 2003.08.21) assume this is
999          * because we're not in pseudoatomic and allocation shouldn't
1000          * be interrupted.  In which case it's no longer an issue as
1001          * all our allocation from C now goes through a PA wrapper,
1002          * but still, doesn't hurt.
1003          *
1004          * Yeah, but non-gencgc platforms don't really wrap allocation
1005          * in PA. MG - 2005-08-29  */
1006
1007         lispobj info_sap, context_sap;
1008         /* Leave deferrable signals blocked, the handler itself will
1009          * allow signals again when it sees fit. */
1010         unblock_gc_signals(0, 0);
1011         context_sap = alloc_sap(context);
1012         info_sap = alloc_sap(info);
1013
1014         FSHOW_SIGNAL((stderr,"/calling Lisp-level handler\n"));
1015
1016         funcall3(handler.lisp,
1017                  make_fixnum(signal),
1018                  info_sap,
1019                  context_sap);
1020     } else {
1021         /* This cannot happen in sane circumstances. */
1022
1023         FSHOW_SIGNAL((stderr,"/calling C-level handler\n"));
1024
1025 #ifndef LISP_FEATURE_WIN32
1026         /* Allow signals again. */
1027         thread_sigmask(SIG_SETMASK, os_context_sigmask_addr(context), 0);
1028 #endif
1029         (*handler.c)(signal, info, context);
1030     }
1031
1032     if (were_in_lisp)
1033     {
1034         undo_fake_foreign_function_call(context); /* block signals again */
1035     }
1036
1037     FSHOW_SIGNAL((stderr,
1038                   "/returning from interrupt_handle_now(%d, info, context)\n",
1039                   signal));
1040 }
1041
1042 /* This is called at the end of a critical section if the indications
1043  * are that some signal was deferred during the section.  Note that as
1044  * far as C or the kernel is concerned we dealt with the signal
1045  * already; we're just doing the Lisp-level processing now that we
1046  * put off then */
1047 static void
1048 run_deferred_handler(struct interrupt_data *data, os_context_t *context)
1049 {
1050     /* The pending_handler may enable interrupts and then another
1051      * interrupt may hit, overwrite interrupt_data, so reset the
1052      * pending handler before calling it. Trust the handler to finish
1053      * with the siginfo before enabling interrupts. */
1054     void (*pending_handler) (int, siginfo_t*, os_context_t*) =
1055         data->pending_handler;
1056
1057     data->pending_handler=0;
1058     FSHOW_SIGNAL((stderr, "/running deferred handler %p\n", pending_handler));
1059     (*pending_handler)(data->pending_signal,&(data->pending_info), context);
1060 }
1061
1062 #ifndef LISP_FEATURE_WIN32
1063 boolean
1064 maybe_defer_handler(void *handler, struct interrupt_data *data,
1065                     int signal, siginfo_t *info, os_context_t *context)
1066 {
1067     struct thread *thread=arch_os_get_current_thread();
1068
1069     check_blockables_blocked_or_lose(0);
1070
1071     if (SymbolValue(INTERRUPT_PENDING,thread) != NIL)
1072         lose("interrupt already pending\n");
1073     if (thread->interrupt_data->pending_handler)
1074         lose("there is a pending handler already (PA)\n");
1075     if (data->gc_blocked_deferrables)
1076         lose("maybe_defer_handler: gc_blocked_deferrables true\n");
1077     check_interrupt_context_or_lose(context);
1078     /* If interrupts are disabled then INTERRUPT_PENDING is set and
1079      * not PSEDUO_ATOMIC_INTERRUPTED. This is important for a pseudo
1080      * atomic section inside a WITHOUT-INTERRUPTS.
1081      *
1082      * Also, if in_leaving_without_gcing_race_p then
1083      * interrupt_handle_pending is going to be called soon, so
1084      * stashing the signal away is safe.
1085      */
1086     if ((SymbolValue(INTERRUPTS_ENABLED,thread) == NIL) ||
1087         in_leaving_without_gcing_race_p(thread)) {
1088         FSHOW_SIGNAL((stderr,
1089                       "/maybe_defer_handler(%x,%d): deferred (RACE=%d)\n",
1090                       (unsigned int)handler,signal,
1091                       in_leaving_without_gcing_race_p(thread)));
1092         store_signal_data_for_later(data,handler,signal,info,context);
1093         SetSymbolValue(INTERRUPT_PENDING, T,thread);
1094         check_interrupt_context_or_lose(context);
1095         return 1;
1096     }
1097     /* a slightly confusing test. arch_pseudo_atomic_atomic() doesn't
1098      * actually use its argument for anything on x86, so this branch
1099      * may succeed even when context is null (gencgc alloc()) */
1100     if (arch_pseudo_atomic_atomic(context)) {
1101         FSHOW_SIGNAL((stderr,
1102                       "/maybe_defer_handler(%x,%d): deferred(PA)\n",
1103                       (unsigned int)handler,signal));
1104         store_signal_data_for_later(data,handler,signal,info,context);
1105         arch_set_pseudo_atomic_interrupted(context);
1106         check_interrupt_context_or_lose(context);
1107         return 1;
1108     }
1109     FSHOW_SIGNAL((stderr,
1110                   "/maybe_defer_handler(%x,%d): not deferred\n",
1111                   (unsigned int)handler,signal));
1112     return 0;
1113 }
1114
1115 static void
1116 store_signal_data_for_later (struct interrupt_data *data, void *handler,
1117                              int signal,
1118                              siginfo_t *info, os_context_t *context)
1119 {
1120     if (data->pending_handler)
1121         lose("tried to overwrite pending interrupt handler %x with %x\n",
1122              data->pending_handler, handler);
1123     if (!handler)
1124         lose("tried to defer null interrupt handler\n");
1125     data->pending_handler = handler;
1126     data->pending_signal = signal;
1127     if(info)
1128         memcpy(&(data->pending_info), info, sizeof(siginfo_t));
1129
1130     FSHOW_SIGNAL((stderr, "/store_signal_data_for_later: signal: %d\n",
1131                   signal));
1132
1133     if(!context)
1134         lose("Null context");
1135
1136     /* the signal mask in the context (from before we were
1137      * interrupted) is copied to be restored when run_deferred_handler
1138      * happens. Then the usually-blocked signals are added to the mask
1139      * in the context so that we are running with blocked signals when
1140      * the handler returns */
1141     sigcopyset(&(data->pending_mask),os_context_sigmask_addr(context));
1142     sigaddset_deferrable(os_context_sigmask_addr(context));
1143 }
1144
1145 static void
1146 maybe_now_maybe_later(int signal, siginfo_t *info, void *void_context)
1147 {
1148     SAVE_ERRNO(signal,context,void_context);
1149     struct thread *thread = arch_os_get_current_thread();
1150     struct interrupt_data *data = thread->interrupt_data;
1151     if(!maybe_defer_handler(interrupt_handle_now,data,signal,info,context))
1152         interrupt_handle_now(signal, info, context);
1153     RESTORE_ERRNO;
1154 }
1155
1156 static void
1157 low_level_interrupt_handle_now(int signal, siginfo_t *info,
1158                                os_context_t *context)
1159 {
1160     /* No FP control fixage needed, caller has done that. */
1161     check_blockables_blocked_or_lose(0);
1162     check_interrupts_enabled_or_lose(context);
1163     (*interrupt_low_level_handlers[signal])(signal, info, context);
1164     /* No Darwin context fixage needed, caller does that. */
1165 }
1166
1167 static void
1168 low_level_maybe_now_maybe_later(int signal, siginfo_t *info, void *void_context)
1169 {
1170     SAVE_ERRNO(signal,context,void_context);
1171     struct thread *thread = arch_os_get_current_thread();
1172     struct interrupt_data *data = thread->interrupt_data;
1173
1174     if(!maybe_defer_handler(low_level_interrupt_handle_now,data,
1175                             signal,info,context))
1176         low_level_interrupt_handle_now(signal, info, context);
1177     RESTORE_ERRNO;
1178 }
1179 #endif
1180
1181 #ifdef LISP_FEATURE_SB_THREAD
1182
1183 /* This function must not cons, because that may trigger a GC. */
1184 void
1185 sig_stop_for_gc_handler(int signal, siginfo_t *info, os_context_t *context)
1186 {
1187     struct thread *thread=arch_os_get_current_thread();
1188
1189     /* Test for GC_INHIBIT _first_, else we'd trap on every single
1190      * pseudo atomic until gc is finally allowed. */
1191     if (SymbolValue(GC_INHIBIT,thread) != NIL) {
1192         FSHOW_SIGNAL((stderr, "sig_stop_for_gc deferred (*GC-INHIBIT*)\n"));
1193         SetSymbolValue(STOP_FOR_GC_PENDING,T,thread);
1194         return;
1195     } else if (arch_pseudo_atomic_atomic(context)) {
1196         FSHOW_SIGNAL((stderr,"sig_stop_for_gc deferred (PA)\n"));
1197         SetSymbolValue(STOP_FOR_GC_PENDING,T,thread);
1198         arch_set_pseudo_atomic_interrupted(context);
1199         maybe_save_gc_mask_and_block_deferrables
1200             (os_context_sigmask_addr(context));
1201         return;
1202     }
1203
1204     FSHOW_SIGNAL((stderr, "/sig_stop_for_gc_handler\n"));
1205
1206     /* Not PA and GC not inhibited -- we can stop now. */
1207
1208     /* need the context stored so it can have registers scavenged */
1209     fake_foreign_function_call(context);
1210
1211     /* Not pending anymore. */
1212     SetSymbolValue(GC_PENDING,NIL,thread);
1213     SetSymbolValue(STOP_FOR_GC_PENDING,NIL,thread);
1214
1215     /* Consider this: in a PA section GC is requested: GC_PENDING,
1216      * pseudo_atomic_interrupted and gc_blocked_deferrables are set,
1217      * deferrables are blocked then pseudo_atomic_atomic is cleared,
1218      * but a SIG_STOP_FOR_GC arrives before trapping to
1219      * interrupt_handle_pending. Here, GC_PENDING is cleared but
1220      * pseudo_atomic_interrupted is not and we go on running with
1221      * pseudo_atomic_interrupted but without a pending interrupt or
1222      * GC. GC_BLOCKED_DEFERRABLES is also left at 1. So let's tidy it
1223      * up. */
1224     if (thread->interrupt_data->gc_blocked_deferrables) {
1225         FSHOW_SIGNAL((stderr,"cleaning up after gc_blocked_deferrables\n"));
1226         clear_pseudo_atomic_interrupted(thread);
1227         sigcopyset(os_context_sigmask_addr(context),
1228                    &thread->interrupt_data->pending_mask);
1229         thread->interrupt_data->gc_blocked_deferrables = 0;
1230     }
1231
1232     if(thread_state(thread)!=STATE_RUNNING) {
1233         lose("sig_stop_for_gc_handler: wrong thread state: %ld\n",
1234              fixnum_value(thread->state));
1235     }
1236
1237     set_thread_state(thread,STATE_SUSPENDED);
1238     FSHOW_SIGNAL((stderr,"suspended\n"));
1239
1240     /* While waiting for gc to finish occupy ourselves with zeroing
1241      * the unused portion of the control stack to reduce conservatism.
1242      * On hypothetic platforms with threads and exact gc it is
1243      * actually a must. */
1244     scrub_control_stack();
1245
1246     wait_for_thread_state_change(thread, STATE_SUSPENDED);
1247     FSHOW_SIGNAL((stderr,"resumed\n"));
1248
1249     if(thread_state(thread)!=STATE_RUNNING) {
1250         lose("sig_stop_for_gc_handler: wrong thread state on wakeup: %ld\n",
1251              fixnum_value(thread_state(thread)));
1252     }
1253
1254     undo_fake_foreign_function_call(context);
1255 }
1256
1257 #endif
1258
1259 void
1260 interrupt_handle_now_handler(int signal, siginfo_t *info, void *void_context)
1261 {
1262     SAVE_ERRNO(signal,context,void_context);
1263 #ifndef LISP_FEATURE_WIN32
1264     if ((signal == SIGILL) || (signal == SIGBUS)
1265 #ifndef LISP_FEATURE_LINUX
1266         || (signal == SIGEMT)
1267 #endif
1268         )
1269         corruption_warning_and_maybe_lose("Signal %d received", signal);
1270 #endif
1271     interrupt_handle_now(signal, info, context);
1272     RESTORE_ERRNO;
1273 }
1274
1275 /* manipulate the signal context and stack such that when the handler
1276  * returns, it will call function instead of whatever it was doing
1277  * previously
1278  */
1279
1280 #if (defined(LISP_FEATURE_X86) || defined(LISP_FEATURE_X86_64))
1281 extern int *context_eflags_addr(os_context_t *context);
1282 #endif
1283
1284 extern lispobj call_into_lisp(lispobj fun, lispobj *args, int nargs);
1285 extern void post_signal_tramp(void);
1286 extern void call_into_lisp_tramp(void);
1287 void
1288 arrange_return_to_lisp_function(os_context_t *context, lispobj function)
1289 {
1290 #ifndef LISP_FEATURE_WIN32
1291     check_gc_signals_unblocked_or_lose
1292         (os_context_sigmask_addr(context));
1293 #endif
1294 #if !(defined(LISP_FEATURE_X86) || defined(LISP_FEATURE_X86_64))
1295     void * fun=native_pointer(function);
1296     void *code = &(((struct simple_fun *) fun)->code);
1297 #endif
1298
1299     /* Build a stack frame showing `interrupted' so that the
1300      * user's backtrace makes (as much) sense (as usual) */
1301
1302     /* fp state is saved and restored by call_into_lisp */
1303     /* FIXME: errno is not restored, but since current uses of this
1304      * function only call Lisp code that signals an error, it's not
1305      * much of a problem. In other words, running out of the control
1306      * stack between a syscall and (GET-ERRNO) may clobber errno if
1307      * something fails during signalling or in the handler. But I
1308      * can't see what can go wrong as long as there is no CONTINUE
1309      * like restart on them. */
1310 #ifdef LISP_FEATURE_X86
1311     /* Suppose the existence of some function that saved all
1312      * registers, called call_into_lisp, then restored GP registers and
1313      * returned.  It would look something like this:
1314
1315      push   ebp
1316      mov    ebp esp
1317      pushfl
1318      pushal
1319      push   $0
1320      push   $0
1321      pushl  {address of function to call}
1322      call   0x8058db0 <call_into_lisp>
1323      addl   $12,%esp
1324      popal
1325      popfl
1326      leave
1327      ret
1328
1329      * What we do here is set up the stack that call_into_lisp would
1330      * expect to see if it had been called by this code, and frob the
1331      * signal context so that signal return goes directly to call_into_lisp,
1332      * and when that function (and the lisp function it invoked) returns,
1333      * it returns to the second half of this imaginary function which
1334      * restores all registers and returns to C
1335
1336      * For this to work, the latter part of the imaginary function
1337      * must obviously exist in reality.  That would be post_signal_tramp
1338      */
1339
1340     u32 *sp=(u32 *)*os_context_register_addr(context,reg_ESP);
1341
1342 #if defined(LISP_FEATURE_DARWIN)
1343     u32 *register_save_area = (u32 *)os_validate(0, 0x40);
1344
1345     FSHOW_SIGNAL((stderr, "/arrange_return_to_lisp_function: preparing to go to function %x, sp: %x\n", function, sp));
1346     FSHOW_SIGNAL((stderr, "/arrange_return_to_lisp_function: context: %x, &context %x\n", context, &context));
1347
1348     /* 1. os_validate (malloc/mmap) register_save_block
1349      * 2. copy register state into register_save_block
1350      * 3. put a pointer to register_save_block in a register in the context
1351      * 4. set the context's EIP to point to a trampoline which:
1352      *    a. builds the fake stack frame from the block
1353      *    b. frees the block
1354      *    c. calls the function
1355      */
1356
1357     *register_save_area = *os_context_pc_addr(context);
1358     *(register_save_area + 1) = function;
1359     *(register_save_area + 2) = *os_context_register_addr(context,reg_EDI);
1360     *(register_save_area + 3) = *os_context_register_addr(context,reg_ESI);
1361     *(register_save_area + 4) = *os_context_register_addr(context,reg_EDX);
1362     *(register_save_area + 5) = *os_context_register_addr(context,reg_ECX);
1363     *(register_save_area + 6) = *os_context_register_addr(context,reg_EBX);
1364     *(register_save_area + 7) = *os_context_register_addr(context,reg_EAX);
1365     *(register_save_area + 8) = *context_eflags_addr(context);
1366
1367     *os_context_pc_addr(context) =
1368       (os_context_register_t) call_into_lisp_tramp;
1369     *os_context_register_addr(context,reg_ECX) =
1370       (os_context_register_t) register_save_area;
1371 #else
1372
1373     /* return address for call_into_lisp: */
1374     *(sp-15) = (u32)post_signal_tramp;
1375     *(sp-14) = function;        /* args for call_into_lisp : function*/
1376     *(sp-13) = 0;               /*                           arg array */
1377     *(sp-12) = 0;               /*                           no. args */
1378     /* this order matches that used in POPAD */
1379     *(sp-11)=*os_context_register_addr(context,reg_EDI);
1380     *(sp-10)=*os_context_register_addr(context,reg_ESI);
1381
1382     *(sp-9)=*os_context_register_addr(context,reg_ESP)-8;
1383     /* POPAD ignores the value of ESP:  */
1384     *(sp-8)=0;
1385     *(sp-7)=*os_context_register_addr(context,reg_EBX);
1386
1387     *(sp-6)=*os_context_register_addr(context,reg_EDX);
1388     *(sp-5)=*os_context_register_addr(context,reg_ECX);
1389     *(sp-4)=*os_context_register_addr(context,reg_EAX);
1390     *(sp-3)=*context_eflags_addr(context);
1391     *(sp-2)=*os_context_register_addr(context,reg_EBP);
1392     *(sp-1)=*os_context_pc_addr(context);
1393
1394 #endif
1395
1396 #elif defined(LISP_FEATURE_X86_64)
1397     u64 *sp=(u64 *)*os_context_register_addr(context,reg_RSP);
1398
1399     /* return address for call_into_lisp: */
1400     *(sp-18) = (u64)post_signal_tramp;
1401
1402     *(sp-17)=*os_context_register_addr(context,reg_R15);
1403     *(sp-16)=*os_context_register_addr(context,reg_R14);
1404     *(sp-15)=*os_context_register_addr(context,reg_R13);
1405     *(sp-14)=*os_context_register_addr(context,reg_R12);
1406     *(sp-13)=*os_context_register_addr(context,reg_R11);
1407     *(sp-12)=*os_context_register_addr(context,reg_R10);
1408     *(sp-11)=*os_context_register_addr(context,reg_R9);
1409     *(sp-10)=*os_context_register_addr(context,reg_R8);
1410     *(sp-9)=*os_context_register_addr(context,reg_RDI);
1411     *(sp-8)=*os_context_register_addr(context,reg_RSI);
1412     /* skip RBP and RSP */
1413     *(sp-7)=*os_context_register_addr(context,reg_RBX);
1414     *(sp-6)=*os_context_register_addr(context,reg_RDX);
1415     *(sp-5)=*os_context_register_addr(context,reg_RCX);
1416     *(sp-4)=*os_context_register_addr(context,reg_RAX);
1417     *(sp-3)=*context_eflags_addr(context);
1418     *(sp-2)=*os_context_register_addr(context,reg_RBP);
1419     *(sp-1)=*os_context_pc_addr(context);
1420
1421     *os_context_register_addr(context,reg_RDI) =
1422         (os_context_register_t)function; /* function */
1423     *os_context_register_addr(context,reg_RSI) = 0;        /* arg. array */
1424     *os_context_register_addr(context,reg_RDX) = 0;        /* no. args */
1425 #else
1426     struct thread *th=arch_os_get_current_thread();
1427     build_fake_control_stack_frames(th,context);
1428 #endif
1429
1430 #ifdef LISP_FEATURE_X86
1431
1432 #if !defined(LISP_FEATURE_DARWIN)
1433     *os_context_pc_addr(context) = (os_context_register_t)call_into_lisp;
1434     *os_context_register_addr(context,reg_ECX) = 0;
1435     *os_context_register_addr(context,reg_EBP) = (os_context_register_t)(sp-2);
1436 #ifdef __NetBSD__
1437     *os_context_register_addr(context,reg_UESP) =
1438         (os_context_register_t)(sp-15);
1439 #else
1440     *os_context_register_addr(context,reg_ESP) = (os_context_register_t)(sp-15);
1441 #endif /* __NETBSD__ */
1442 #endif /* LISP_FEATURE_DARWIN */
1443
1444 #elif defined(LISP_FEATURE_X86_64)
1445     *os_context_pc_addr(context) = (os_context_register_t)call_into_lisp;
1446     *os_context_register_addr(context,reg_RCX) = 0;
1447     *os_context_register_addr(context,reg_RBP) = (os_context_register_t)(sp-2);
1448     *os_context_register_addr(context,reg_RSP) = (os_context_register_t)(sp-18);
1449 #else
1450     /* this much of the calling convention is common to all
1451        non-x86 ports */
1452     *os_context_pc_addr(context) = (os_context_register_t)(unsigned long)code;
1453     *os_context_register_addr(context,reg_NARGS) = 0;
1454     *os_context_register_addr(context,reg_LIP) =
1455         (os_context_register_t)(unsigned long)code;
1456     *os_context_register_addr(context,reg_CFP) =
1457         (os_context_register_t)(unsigned long)current_control_frame_pointer;
1458 #endif
1459 #ifdef ARCH_HAS_NPC_REGISTER
1460     *os_context_npc_addr(context) =
1461         4 + *os_context_pc_addr(context);
1462 #endif
1463 #ifdef LISP_FEATURE_SPARC
1464     *os_context_register_addr(context,reg_CODE) =
1465         (os_context_register_t)(fun + FUN_POINTER_LOWTAG);
1466 #endif
1467     FSHOW((stderr, "/arranged return to Lisp function (0x%lx)\n",
1468            (long)function));
1469 }
1470
1471 /* KLUDGE: Theoretically the approach we use for undefined alien
1472  * variables should work for functions as well, but on PPC/Darwin
1473  * we get bus error at bogus addresses instead, hence this workaround,
1474  * that has the added benefit of automatically discriminating between
1475  * functions and variables.
1476  */
1477 void
1478 undefined_alien_function(void)
1479 {
1480     funcall0(StaticSymbolFunction(UNDEFINED_ALIEN_FUNCTION_ERROR));
1481 }
1482
1483 void lower_thread_control_stack_guard_page(struct thread *th)
1484 {
1485     protect_control_stack_guard_page(0, th);
1486     protect_control_stack_return_guard_page(1, th);
1487     th->control_stack_guard_page_protected = NIL;
1488     fprintf(stderr, "INFO: Control stack guard page unprotected\n");
1489 }
1490
1491 void reset_thread_control_stack_guard_page(struct thread *th)
1492 {
1493     memset(CONTROL_STACK_GUARD_PAGE(th), 0, os_vm_page_size);
1494     protect_control_stack_guard_page(1, th);
1495     protect_control_stack_return_guard_page(0, th);
1496     th->control_stack_guard_page_protected = T;
1497     fprintf(stderr, "INFO: Control stack guard page reprotected\n");
1498 }
1499
1500 /* Called from the REPL, too. */
1501 void reset_control_stack_guard_page(void)
1502 {
1503     struct thread *th=arch_os_get_current_thread();
1504     if (th->control_stack_guard_page_protected == NIL) {
1505         reset_thread_control_stack_guard_page(th);
1506     }
1507 }
1508
1509 void lower_control_stack_guard_page(void)
1510 {
1511     lower_thread_control_stack_guard_page(arch_os_get_current_thread());
1512 }
1513
1514 boolean
1515 handle_guard_page_triggered(os_context_t *context,os_vm_address_t addr)
1516 {
1517     struct thread *th=arch_os_get_current_thread();
1518
1519     if(addr >= CONTROL_STACK_HARD_GUARD_PAGE(th) &&
1520        addr < CONTROL_STACK_HARD_GUARD_PAGE(th) + os_vm_page_size) {
1521         lose("Control stack exhausted");
1522     }
1523     else if(addr >= CONTROL_STACK_GUARD_PAGE(th) &&
1524             addr < CONTROL_STACK_GUARD_PAGE(th) + os_vm_page_size) {
1525         /* We hit the end of the control stack: disable guard page
1526          * protection so the error handler has some headroom, protect the
1527          * previous page so that we can catch returns from the guard page
1528          * and restore it. */
1529         if (th->control_stack_guard_page_protected == NIL)
1530             lose("control_stack_guard_page_protected NIL");
1531         lower_control_stack_guard_page();
1532 #ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK
1533         /* For the unfortunate case, when the control stack is
1534          * exhausted in a signal handler. */
1535         unblock_signals_in_context_and_maybe_warn(context);
1536 #endif
1537         arrange_return_to_lisp_function
1538             (context, StaticSymbolFunction(CONTROL_STACK_EXHAUSTED_ERROR));
1539         return 1;
1540     }
1541     else if(addr >= CONTROL_STACK_RETURN_GUARD_PAGE(th) &&
1542             addr < CONTROL_STACK_RETURN_GUARD_PAGE(th) + os_vm_page_size) {
1543         /* We're returning from the guard page: reprotect it, and
1544          * unprotect this one. This works even if we somehow missed
1545          * the return-guard-page, and hit it on our way to new
1546          * exhaustion instead. */
1547         if (th->control_stack_guard_page_protected != NIL)
1548             lose("control_stack_guard_page_protected not NIL");
1549         reset_control_stack_guard_page();
1550         return 1;
1551     }
1552     else if(addr >= BINDING_STACK_HARD_GUARD_PAGE(th) &&
1553             addr < BINDING_STACK_HARD_GUARD_PAGE(th) + os_vm_page_size) {
1554         lose("Binding stack exhausted");
1555     }
1556     else if(addr >= BINDING_STACK_GUARD_PAGE(th) &&
1557             addr < BINDING_STACK_GUARD_PAGE(th) + os_vm_page_size) {
1558         protect_binding_stack_guard_page(0, NULL);
1559         protect_binding_stack_return_guard_page(1, NULL);
1560         fprintf(stderr, "INFO: Binding stack guard page unprotected\n");
1561
1562         /* For the unfortunate case, when the binding stack is
1563          * exhausted in a signal handler. */
1564         unblock_signals_in_context_and_maybe_warn(context);
1565         arrange_return_to_lisp_function
1566             (context, StaticSymbolFunction(BINDING_STACK_EXHAUSTED_ERROR));
1567         return 1;
1568     }
1569     else if(addr >= BINDING_STACK_RETURN_GUARD_PAGE(th) &&
1570             addr < BINDING_STACK_RETURN_GUARD_PAGE(th) + os_vm_page_size) {
1571         protect_binding_stack_guard_page(1, NULL);
1572         protect_binding_stack_return_guard_page(0, NULL);
1573         fprintf(stderr, "INFO: Binding stack guard page reprotected\n");
1574         return 1;
1575     }
1576     else if(addr >= ALIEN_STACK_HARD_GUARD_PAGE(th) &&
1577             addr < ALIEN_STACK_HARD_GUARD_PAGE(th) + os_vm_page_size) {
1578         lose("Alien stack exhausted");
1579     }
1580     else if(addr >= ALIEN_STACK_GUARD_PAGE(th) &&
1581             addr < ALIEN_STACK_GUARD_PAGE(th) + os_vm_page_size) {
1582         protect_alien_stack_guard_page(0, NULL);
1583         protect_alien_stack_return_guard_page(1, NULL);
1584         fprintf(stderr, "INFO: Alien stack guard page unprotected\n");
1585
1586         /* For the unfortunate case, when the alien stack is
1587          * exhausted in a signal handler. */
1588         unblock_signals_in_context_and_maybe_warn(context);
1589         arrange_return_to_lisp_function
1590             (context, StaticSymbolFunction(ALIEN_STACK_EXHAUSTED_ERROR));
1591         return 1;
1592     }
1593     else if(addr >= ALIEN_STACK_RETURN_GUARD_PAGE(th) &&
1594             addr < ALIEN_STACK_RETURN_GUARD_PAGE(th) + os_vm_page_size) {
1595         protect_alien_stack_guard_page(1, NULL);
1596         protect_alien_stack_return_guard_page(0, NULL);
1597         fprintf(stderr, "INFO: Alien stack guard page reprotected\n");
1598         return 1;
1599     }
1600     else if (addr >= undefined_alien_address &&
1601              addr < undefined_alien_address + os_vm_page_size) {
1602         arrange_return_to_lisp_function
1603             (context, StaticSymbolFunction(UNDEFINED_ALIEN_VARIABLE_ERROR));
1604         return 1;
1605     }
1606     else return 0;
1607 }
1608 \f
1609 /*
1610  * noise to install handlers
1611  */
1612
1613 #ifndef LISP_FEATURE_WIN32
1614 /* In Linux 2.4 synchronous signals (sigtrap & co) can be delivered if
1615  * they are blocked, in Linux 2.6 the default handler is invoked
1616  * instead that usually coredumps. One might hastily think that adding
1617  * SA_NODEFER helps, but until ~2.6.13 if SA_NODEFER is specified then
1618  * the whole sa_mask is ignored and instead of not adding the signal
1619  * in question to the mask. That means if it's not blockable the
1620  * signal must be unblocked at the beginning of signal handlers.
1621  *
1622  * It turns out that NetBSD's SA_NODEFER doesn't DTRT in a different
1623  * way: if SA_NODEFER is set and the signal is in sa_mask, the signal
1624  * will be unblocked in the sigmask during the signal handler.  -- RMK
1625  * X-mas day, 2005
1626  */
1627 static volatile int sigaction_nodefer_works = -1;
1628
1629 #define SA_NODEFER_TEST_BLOCK_SIGNAL SIGABRT
1630 #define SA_NODEFER_TEST_KILL_SIGNAL SIGUSR1
1631
1632 static void
1633 sigaction_nodefer_test_handler(int signal, siginfo_t *info, void *void_context)
1634 {
1635     sigset_t current;
1636     int i;
1637     get_current_sigmask(&current);
1638     /* There should be exactly two blocked signals: the two we added
1639      * to sa_mask when setting up the handler.  NetBSD doesn't block
1640      * the signal we're handling when SA_NODEFER is set; Linux before
1641      * 2.6.13 or so also doesn't block the other signal when
1642      * SA_NODEFER is set. */
1643     for(i = 1; i < NSIG; i++)
1644         if (sigismember(&current, i) !=
1645             (((i == SA_NODEFER_TEST_BLOCK_SIGNAL) || (i == signal)) ? 1 : 0)) {
1646             FSHOW_SIGNAL((stderr, "SA_NODEFER doesn't work, signal %d\n", i));
1647             sigaction_nodefer_works = 0;
1648         }
1649     if (sigaction_nodefer_works == -1)
1650         sigaction_nodefer_works = 1;
1651 }
1652
1653 static void
1654 see_if_sigaction_nodefer_works(void)
1655 {
1656     struct sigaction sa, old_sa;
1657
1658     sa.sa_flags = SA_SIGINFO | SA_NODEFER;
1659     sa.sa_sigaction = sigaction_nodefer_test_handler;
1660     sigemptyset(&sa.sa_mask);
1661     sigaddset(&sa.sa_mask, SA_NODEFER_TEST_BLOCK_SIGNAL);
1662     sigaddset(&sa.sa_mask, SA_NODEFER_TEST_KILL_SIGNAL);
1663     sigaction(SA_NODEFER_TEST_KILL_SIGNAL, &sa, &old_sa);
1664     /* Make sure no signals are blocked. */
1665     {
1666         sigset_t empty;
1667         sigemptyset(&empty);
1668         thread_sigmask(SIG_SETMASK, &empty, 0);
1669     }
1670     kill(getpid(), SA_NODEFER_TEST_KILL_SIGNAL);
1671     while (sigaction_nodefer_works == -1);
1672     sigaction(SA_NODEFER_TEST_KILL_SIGNAL, &old_sa, NULL);
1673 }
1674
1675 #undef SA_NODEFER_TEST_BLOCK_SIGNAL
1676 #undef SA_NODEFER_TEST_KILL_SIGNAL
1677
1678 static void
1679 unblock_me_trampoline(int signal, siginfo_t *info, void *void_context)
1680 {
1681     SAVE_ERRNO(signal,context,void_context);
1682     sigset_t unblock;
1683
1684     sigemptyset(&unblock);
1685     sigaddset(&unblock, signal);
1686     thread_sigmask(SIG_UNBLOCK, &unblock, 0);
1687     interrupt_handle_now(signal, info, context);
1688     RESTORE_ERRNO;
1689 }
1690
1691 static void
1692 low_level_unblock_me_trampoline(int signal, siginfo_t *info, void *void_context)
1693 {
1694     SAVE_ERRNO(signal,context,void_context);
1695     sigset_t unblock;
1696
1697     sigemptyset(&unblock);
1698     sigaddset(&unblock, signal);
1699     thread_sigmask(SIG_UNBLOCK, &unblock, 0);
1700     (*interrupt_low_level_handlers[signal])(signal, info, context);
1701     RESTORE_ERRNO;
1702 }
1703
1704 static void
1705 low_level_handle_now_handler(int signal, siginfo_t *info, void *void_context)
1706 {
1707     SAVE_ERRNO(signal,context,void_context);
1708     (*interrupt_low_level_handlers[signal])(signal, info, context);
1709     RESTORE_ERRNO;
1710 }
1711
1712 void
1713 undoably_install_low_level_interrupt_handler (int signal,
1714                                               interrupt_handler_t handler)
1715 {
1716     struct sigaction sa;
1717
1718     if (0 > signal || signal >= NSIG) {
1719         lose("bad signal number %d\n", signal);
1720     }
1721
1722     if (ARE_SAME_HANDLER(handler, SIG_DFL))
1723         sa.sa_sigaction = (void (*)(int, siginfo_t*, void*))handler;
1724     else if (sigismember(&deferrable_sigset,signal))
1725         sa.sa_sigaction = low_level_maybe_now_maybe_later;
1726     else if (!sigaction_nodefer_works &&
1727              !sigismember(&blockable_sigset, signal))
1728         sa.sa_sigaction = low_level_unblock_me_trampoline;
1729     else
1730         sa.sa_sigaction = low_level_handle_now_handler;
1731
1732     sigcopyset(&sa.sa_mask, &blockable_sigset);
1733     sa.sa_flags = SA_SIGINFO | SA_RESTART
1734         | (sigaction_nodefer_works ? SA_NODEFER : 0);
1735 #ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK
1736     if((signal==SIG_MEMORY_FAULT))
1737         sa.sa_flags |= SA_ONSTACK;
1738 #endif
1739
1740     sigaction(signal, &sa, NULL);
1741     interrupt_low_level_handlers[signal] =
1742         (ARE_SAME_HANDLER(handler, SIG_DFL) ? 0 : handler);
1743 }
1744 #endif
1745
1746 /* This is called from Lisp. */
1747 unsigned long
1748 install_handler(int signal, void handler(int, siginfo_t*, os_context_t*))
1749 {
1750 #ifndef LISP_FEATURE_WIN32
1751     struct sigaction sa;
1752     sigset_t old;
1753     union interrupt_handler oldhandler;
1754
1755     FSHOW((stderr, "/entering POSIX install_handler(%d, ..)\n", signal));
1756
1757     block_blockable_signals(0, &old);
1758
1759     FSHOW((stderr, "/interrupt_low_level_handlers[signal]=%x\n",
1760            (unsigned int)interrupt_low_level_handlers[signal]));
1761     if (interrupt_low_level_handlers[signal]==0) {
1762         if (ARE_SAME_HANDLER(handler, SIG_DFL) ||
1763             ARE_SAME_HANDLER(handler, SIG_IGN))
1764             sa.sa_sigaction = (void (*)(int, siginfo_t*, void*))handler;
1765         else if (sigismember(&deferrable_sigset, signal))
1766             sa.sa_sigaction = maybe_now_maybe_later;
1767         else if (!sigaction_nodefer_works &&
1768                  !sigismember(&blockable_sigset, signal))
1769             sa.sa_sigaction = unblock_me_trampoline;
1770         else
1771             sa.sa_sigaction = interrupt_handle_now_handler;
1772
1773         sigcopyset(&sa.sa_mask, &blockable_sigset);
1774         sa.sa_flags = SA_SIGINFO | SA_RESTART |
1775             (sigaction_nodefer_works ? SA_NODEFER : 0);
1776         sigaction(signal, &sa, NULL);
1777     }
1778
1779     oldhandler = interrupt_handlers[signal];
1780     interrupt_handlers[signal].c = handler;
1781
1782     thread_sigmask(SIG_SETMASK, &old, 0);
1783
1784     FSHOW((stderr, "/leaving POSIX install_handler(%d, ..)\n", signal));
1785
1786     return (unsigned long)oldhandler.lisp;
1787 #else
1788     /* Probably-wrong Win32 hack */
1789     return 0;
1790 #endif
1791 }
1792
1793 /* This must not go through lisp as it's allowed anytime, even when on
1794  * the altstack. */
1795 void
1796 sigabrt_handler(int signal, siginfo_t *info, os_context_t *context)
1797 {
1798     lose("SIGABRT received.\n");
1799 }
1800
1801 void
1802 interrupt_init(void)
1803 {
1804 #ifndef LISP_FEATURE_WIN32
1805     int i;
1806     SHOW("entering interrupt_init()");
1807     see_if_sigaction_nodefer_works();
1808     sigemptyset(&deferrable_sigset);
1809     sigemptyset(&blockable_sigset);
1810     sigemptyset(&gc_sigset);
1811     sigaddset_deferrable(&deferrable_sigset);
1812     sigaddset_blockable(&blockable_sigset);
1813     sigaddset_gc(&gc_sigset);
1814
1815     /* Set up high level handler information. */
1816     for (i = 0; i < NSIG; i++) {
1817         interrupt_handlers[i].c =
1818             /* (The cast here blasts away the distinction between
1819              * SA_SIGACTION-style three-argument handlers and
1820              * signal(..)-style one-argument handlers, which is OK
1821              * because it works to call the 1-argument form where the
1822              * 3-argument form is expected.) */
1823             (void (*)(int, siginfo_t*, os_context_t*))SIG_DFL;
1824     }
1825     undoably_install_low_level_interrupt_handler(SIGABRT, sigabrt_handler);
1826     SHOW("returning from interrupt_init()");
1827 #endif
1828 }
1829
1830 #ifndef LISP_FEATURE_WIN32
1831 int
1832 siginfo_code(siginfo_t *info)
1833 {
1834     return info->si_code;
1835 }
1836 os_vm_address_t current_memory_fault_address;
1837
1838 void
1839 lisp_memory_fault_error(os_context_t *context, os_vm_address_t addr)
1840 {
1841    /* FIXME: This is lossy: if we get another memory fault (eg. from
1842     * another thread) before lisp has read this, we lose the information.
1843     * However, since this is mostly informative, we'll live with that for
1844     * now -- some address is better then no address in this case.
1845     */
1846     current_memory_fault_address = addr;
1847     /* To allow debugging memory faults in signal handlers and such. */
1848     corruption_warning_and_maybe_lose("Memory fault at %x (pc=%p, sp=%p)",
1849                                       addr,
1850                                       *os_context_pc_addr(context),
1851 #ifdef ARCH_HAS_STACK_POINTER
1852                                       *os_context_sp_addr(context)
1853 #else
1854                                       0
1855 #endif
1856                                       );
1857     unblock_signals_in_context_and_maybe_warn(context);
1858 #ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK
1859     arrange_return_to_lisp_function(context,
1860                                     StaticSymbolFunction(MEMORY_FAULT_ERROR));
1861 #else
1862     funcall0(StaticSymbolFunction(MEMORY_FAULT_ERROR));
1863 #endif
1864 }
1865 #endif
1866
1867 static void
1868 unhandled_trap_error(os_context_t *context)
1869 {
1870     lispobj context_sap;
1871     fake_foreign_function_call(context);
1872     unblock_gc_signals(0, 0);
1873     context_sap = alloc_sap(context);
1874 #ifndef LISP_FEATURE_WIN32
1875     thread_sigmask(SIG_SETMASK, os_context_sigmask_addr(context), 0);
1876 #endif
1877     funcall1(StaticSymbolFunction(UNHANDLED_TRAP_ERROR), context_sap);
1878     lose("UNHANDLED-TRAP-ERROR fell through");
1879 }
1880
1881 /* Common logic for trapping instructions. How we actually handle each
1882  * case is highly architecture dependent, but the overall shape is
1883  * this. */
1884 void
1885 handle_trap(os_context_t *context, int trap)
1886 {
1887     switch(trap) {
1888     case trap_PendingInterrupt:
1889         FSHOW((stderr, "/<trap pending interrupt>\n"));
1890         arch_skip_instruction(context);
1891         interrupt_handle_pending(context);
1892         break;
1893     case trap_Error:
1894     case trap_Cerror:
1895         FSHOW((stderr, "/<trap error/cerror %d>\n", trap));
1896         interrupt_internal_error(context, trap==trap_Cerror);
1897         break;
1898     case trap_Breakpoint:
1899         arch_handle_breakpoint(context);
1900         break;
1901     case trap_FunEndBreakpoint:
1902         arch_handle_fun_end_breakpoint(context);
1903         break;
1904 #ifdef trap_AfterBreakpoint
1905     case trap_AfterBreakpoint:
1906         arch_handle_after_breakpoint(context);
1907         break;
1908 #endif
1909 #ifdef trap_SingleStepAround
1910     case trap_SingleStepAround:
1911     case trap_SingleStepBefore:
1912         arch_handle_single_step_trap(context, trap);
1913         break;
1914 #endif
1915     case trap_Halt:
1916         fake_foreign_function_call(context);
1917         lose("%%PRIMITIVE HALT called; the party is over.\n");
1918     default:
1919         unhandled_trap_error(context);
1920     }
1921 }