From 52fca1acbd567843e8fada013e432777d6b660fa Mon Sep 17 00:00:00 2001 From: rtoy <rtoy> Date: Tue, 4 May 2004 12:38:13 +0000 Subject: [PATCH] Use an alternate signal stack for delivering signals. --- lisp/interrupt.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/lisp/interrupt.c b/lisp/interrupt.c index 3491eec44..e909fe454 100644 --- a/lisp/interrupt.c +++ b/lisp/interrupt.c @@ -1,4 +1,4 @@ -/* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/interrupt.c,v 1.33 2003/11/01 15:40:35 toy Exp $ */ +/* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/interrupt.c,v 1.34 2004/05/04 12:38:13 rtoy Exp $ */ /* Interrupt handing magic. */ @@ -513,6 +513,11 @@ boolean interrupt_maybe_gc(HANDLER_ARGS) * Noise to install handlers. * \****************************************************************/ +#ifndef i386 +#define SIGNAL_STACK_SIZE SIGSTKSZ +static char altstack[SIGNAL_STACK_SIZE]; +#endif + void interrupt_install_low_level_handler (int signal, void handler (HANDLER_ARGS)) { @@ -542,6 +547,17 @@ interrupt_install_low_level_handler (int signal, void handler (HANDLER_ARGS)) perror ("sigaltstack"); sa.sa_flags |= SA_ONSTACK; } +#else + if (signal == PROTECTION_VIOLATION_SIGNAL) + { + stack_t sigstack; + sigstack.ss_sp = (void *) altstack; + sigstack.ss_flags = 0; + sigstack.ss_size = SIGNAL_STACK_SIZE; + if (sigaltstack (&sigstack, 0) == -1) + perror ("sigaltstack"); + sa.sa_flags |= SA_ONSTACK; + } #endif /* RED_ZONE_HIT */ sigaction (signal, &sa, NULL); -- GitLab