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