From 4d2513007d7d43060e9e426c52fa709b9412efe9 Mon Sep 17 00:00:00 2001
From: wlott <wlott>
Date: Wed, 6 Jun 1990 03:59:28 +0000
Subject: [PATCH] Added other signals, like sigsegv and sigbus.

---
 code/signal.lisp | 47 ++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 44 insertions(+), 3 deletions(-)

diff --git a/code/signal.lisp b/code/signal.lisp
index 3c058e1a9..164d09933 100644
--- a/code/signal.lisp
+++ b/code/signal.lisp
@@ -7,7 +7,7 @@
 ;;; Scott Fahlman (FAHLMAN@CMUC). 
 ;;; **********************************************************************
 ;;;
-;;; $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/code/signal.lisp,v 1.1 1990/06/04 05:34:33 wlott Exp $
+;;; $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/code/signal.lisp,v 1.2 1990/06/06 03:59:28 wlott Exp $
 ;;;
 ;;; Code for handling UNIX signals.
 ;;; 
@@ -24,7 +24,48 @@
   (signal int)
   (handler unsigned-long))
 
+
+(defmacro define-signal-handler (name what &optional (function 'error))
+  `(defun ,name (signal code scp)
+     (declare (ignore signal code))
+     (alien-bind ((sc
+		   (make-alien 'mach:sigcontext
+			       #.(c-sizeof 'mach:sigcontext)
+			       scp)
+		   mach:sigcontext
+		   t))
+       (,function ,(concatenate 'simple-string what " at #x~x.")
+		  (alien-access (mach:sigcontext-pc (alien-value sc)))))))
+
+(define-signal-handler sigint-handler "Interrupted" break)
+(define-signal-handler sigill-handler "Illegal Instruction")
+(define-signal-handler sigiot-handler "SIGIOT")
+(define-signal-handler sigemt-handler "SIGEMT")
+(define-signal-handler sigfpe-handler "SIGFPE")
+(define-signal-handler sigbus-handler "Bus Error")
+(define-signal-handler sigsegv-handler "Segmentation Violation")
+(define-signal-handler sigsys-handler "Bad Argument to a System Call")
+(define-signal-handler sigpipe-handler "SIGPIPE")
+(define-signal-handler sigalrm-handler "SIGALRM")
+
+(defun sigquit-handler (signal code scp)
+  (declare (ignore signal code scp))
+  (throw 'lisp::top-level-catcher nil))
+
+
 (defun signal-init ()
-  (install-handler #.(mach:unix-signal-number :sigtrap)
-		   (di::get-lisp-obj-address #'internal-error))
+  (macrolet ((frob (signal handler)
+	       `(install-handler ,(mach:unix-signal-number signal)
+				 (di::get-lisp-obj-address ,handler))))
+    #+nil (frob :sigint #'sigint-handler)
+    (frob :sigill #'sigill-handler)
+    (frob :sigtrap #'internal-error)
+    (frob :sigiot #'sigiot-handler)
+    (frob :sigemt #'sigemt-handler)
+    #+nil (frob :sigfpe #'sigfpe-handler)
+    (frob :sigbus #'sigbus-handler)
+    (frob :sigsegv #'sigsegv-handler)
+    (frob :sigsys #'sigsys-handler)
+    (frob :sigpipe #'sigpipe-handler)
+    (frob :sigalrm #'sigalrm-handler))
   nil)
-- 
GitLab