From f3e5780e38f42eaa3be318564c0def6f658f48be Mon Sep 17 00:00:00 2001
From: cshapiro <cshapiro>
Date: Sun, 15 Jul 2007 09:24:57 +0000
Subject: [PATCH] Use POSIX signals on FreeBSD.

---
 lisp/FreeBSD-os.c   | 57 +++++++++++++++++++++++----------------------
 lisp/FreeBSD-os.h   | 18 ++++++--------
 lisp/interrupt.c    | 10 ++++----
 lisp/x86-arch.c     |  6 ++---
 lisp/x86-lispregs.h |  6 ++---
 5 files changed, 47 insertions(+), 50 deletions(-)

diff --git a/lisp/FreeBSD-os.c b/lisp/FreeBSD-os.c
index 27bc76d04..5007df7b0 100644
--- a/lisp/FreeBSD-os.c
+++ b/lisp/FreeBSD-os.c
@@ -12,7 +12,7 @@
  * Much hacked by Paul Werkowski
  * GENCGC support by Douglas Crosher, 1996, 1997.
  *
- * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/FreeBSD-os.c,v 1.15 2007/06/12 03:21:46 cshapiro Exp $
+ * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/FreeBSD-os.c,v 1.16 2007/07/15 09:24:57 cshapiro Exp $
  *
  */
 
@@ -53,25 +53,25 @@ os_init(void)
 }
 
 int *
-sc_reg(struct sigcontext *c, int offset)
+sc_reg(ucontext_t *context, int offset)
 {
     switch (offset) {
       case 0:
-	  return &c->sc_eax;
+	  return &context->uc_mcontext.mc_eax;
       case 2:
-	  return &c->sc_ecx;
+	  return &context->uc_mcontext.mc_ecx;
       case 4:
-	  return &c->sc_edx;
+	  return &context->uc_mcontext.mc_edx;
       case 6:
-	  return &c->sc_ebx;
+	  return &context->uc_mcontext.mc_ebx;
       case 8:
-	  return &c->sc_esp;
+	  return &context->uc_mcontext.mc_esp;
       case 10:
-	  return &c->sc_ebp;
+	  return &context->uc_mcontext.mc_ebp;
       case 12:
-	  return &c->sc_esi;
+	  return &context->uc_mcontext.mc_esi;
       case 14:
-	  return &c->sc_edi;
+	  return &context->uc_mcontext.mc_edi;
     }
 
     return (int *) 0;
@@ -169,43 +169,44 @@ boolean valid_addr(os_vm_address_t addr)
 
 
 static void
-sigbus_handler(int signal, int code, struct sigcontext *context,
-	       void *fault_addr)
+sigbus_handler(int signal, siginfo_t *info, ucontext_t *context)
 {
     int page_index;
 
 #ifdef RED_ZONE_HIT
-    if (os_control_stack_overflow(fault_addr, context))
+    if (os_control_stack_overflow(info->si_addr, context))
 	return;
 #endif
 
 #if defined GENCGC
-    page_index = find_page_index(fault_addr);
+    if (info->si_code == BUS_PAGE_FAULT) {
+	page_index = find_page_index(info->si_addr);
 
-    /* Check if the fault is within the dynamic space. */
-    if (page_index != -1) {
-	/* Un-protect the page */
+	/* Check if the fault is within the dynamic space. */
+	if (page_index != -1) {
+	    /* Un-protect the page */
 
-	/* The page should have been marked write protected */
-	if (!PAGE_WRITE_PROTECTED(page_index))
-	    fprintf(stderr,
-		    "*** Sigbus in page not marked as write protected\n");
+	    /* The page should have been marked write protected */
+	    if (!PAGE_WRITE_PROTECTED(page_index))
+		fprintf(stderr,
+			"*** Sigbus in page not marked as write protected\n");
 
-	os_protect(page_address(page_index), 4096, OS_VM_PROT_ALL);
-	page_table[page_index].flags &= ~PAGE_WRITE_PROTECTED_MASK;
-	page_table[page_index].flags |= PAGE_WRITE_PROTECT_CLEARED_MASK;
+	    os_protect(page_address(page_index), 4096, OS_VM_PROT_ALL);
+	    page_table[page_index].flags &= ~PAGE_WRITE_PROTECTED_MASK;
+	    page_table[page_index].flags |= PAGE_WRITE_PROTECT_CLEARED_MASK;
 
-	return;
+	    return;
+	}
     }
 #endif /* GENCGC */
 
-    interrupt_handle_now(signal, code, context);
+    interrupt_handle_now(signal, info, context);
 }
 
 static void
-sigsegv_handler(int signal, int code, struct sigcontext *context)
+sigsegv_handler(int signal, siginfo_t *info, ucontext_t *context)
 {
-    interrupt_handle_now(signal, code, context);
+    interrupt_handle_now(signal, info, context);
 }
 
 void
diff --git a/lisp/FreeBSD-os.h b/lisp/FreeBSD-os.h
index fa4706090..d89625263 100644
--- a/lisp/FreeBSD-os.h
+++ b/lisp/FreeBSD-os.h
@@ -1,6 +1,6 @@
 /*
 
- $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/FreeBSD-os.h,v 1.16 2007/07/09 16:03:47 fgilham Exp $
+ $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/FreeBSD-os.h,v 1.17 2007/07/15 09:24:57 cshapiro Exp $
 
  This code was written as part of the CMU Common Lisp project at
  Carnegie Mellon University, and has been placed in the public domain.
@@ -19,13 +19,14 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
-
+#include <ucontext.h>
 #include <libgen.h>
 
 typedef caddr_t os_vm_address_t;
 typedef vm_size_t os_vm_size_t;
 typedef off_t os_vm_offset_t;
 typedef int os_vm_prot_t;
+#define os_context_t ucontext_t
 
 #define OS_VM_PROT_READ    PROT_READ
 #define OS_VM_PROT_WRITE   PROT_WRITE
@@ -33,16 +34,11 @@ typedef int os_vm_prot_t;
 
 #define OS_VM_DEFAULT_PAGESIZE	4096
 
-int *sc_reg(struct sigcontext *, int);
-void os_save_context(void);
+#define HANDLER_ARGS int signal, siginfo_t *code, ucontext_t *context
+#define CODE(code)  ((code) ? code->si_code : 0)
 
-/* If we used SA_SIGINFO in sigaction() the third argument to signal
-   handlers would be a struct ucontext_t.  (The manpage for
-   sigaction(2) is wrong!)  Sigcontext and ucontext_t are
-   "compatible", but access to registers in a ucontext_t goes through
-   the uc_mcontext field, so we just won't bother.  */
-#define USE_SA_SIGINFO 0
-#define uc_sigmask sc_mask
+int *sc_reg(ucontext_t *, int);
+void os_save_context(void);
 
 #define PROTECTION_VIOLATION_SIGNAL SIGBUS
 
diff --git a/lisp/interrupt.c b/lisp/interrupt.c
index ecbaaea86..731595c16 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.47 2007/07/06 08:04:39 cshapiro Exp $ */
+/* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/interrupt.c,v 1.48 2007/07/15 09:24:57 cshapiro Exp $ */
 
 /* Interrupt handling magic. */
 
@@ -32,7 +32,7 @@ void (*interrupt_low_level_handlers[NSIG]) (HANDLER_ARGS) = {
 
 static int pending_signal = 0;
 
-#if defined(SOLARIS) || defined(__OpenBSD__) || defined(__NetBSD__)
+#if defined(SOLARIS) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__FreeBSD__)
 static siginfo_t *pending_code;
 
 #define PASSCODE(code) ((code))
@@ -170,7 +170,7 @@ interrupt_internal_error(HANDLER_ARGS, boolean continuable)
 
     /* Allocate the SAP object while the interrupts are still disabled. */
     if (internal_errors_enabled)
-#if defined(DARWIN) && defined(__i386__)
+#if (defined(DARWIN) || defined(__FreeBSD__)) && defined(__i386__)
 	context_sap = alloc_sap(&context->uc_mcontext);
 #else
 	context_sap = alloc_sap(context);
@@ -227,7 +227,7 @@ interrupt_handle_pending(os_context_t * context)
     if (pending_signal) {
 	int signal;
 
-#if defined(SOLARIS) || defined(__OpenBSD__) || defined(__NetBSD__)
+#if defined(SOLARIS) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__FreeBSD__)
 	siginfo_t *code;
 #else
 	int code;
@@ -310,7 +310,7 @@ interrupt_handle_now(HANDLER_ARGS)
     else if (LowtagOf(handler.lisp) == type_FunctionPointer) {
 	/* Allocate the SAP object while the interrupts are still
 	   disabled. */
-#if defined(DARWIN) && defined(__i386__)
+#if (defined(DARWIN) || defined(__FreeBSD__)) && defined(__i386__)
 	lispobj context_sap = alloc_sap(&context->uc_mcontext);
 #else
 	lispobj context_sap = alloc_sap(context);
diff --git a/lisp/x86-arch.c b/lisp/x86-arch.c
index f18785fc2..04f346cbe 100644
--- a/lisp/x86-arch.c
+++ b/lisp/x86-arch.c
@@ -1,6 +1,6 @@
 /* x86-arch.c -*- Mode: C; comment-column: 40 -*-
  *
- * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/x86-arch.c,v 1.26 2007/07/06 08:04:39 cshapiro Exp $ 
+ * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/x86-arch.c,v 1.27 2007/07/15 09:24:57 cshapiro Exp $ 
  *
  */
 
@@ -263,7 +263,7 @@ sigtrap_handler(HANDLER_ARGS)
 #ifdef __linux__
 	  interrupt_internal_error(signal, contextstruct, code == trap_Cerror);
 #else
-	  interrupt_internal_error(signal, code, context, code == trap_Cerror);
+	  interrupt_internal_error(signal, code, context, CODE(code) == trap_Cerror);
 #endif
 	  break;
 
@@ -301,7 +301,7 @@ sigtrap_handler(HANDLER_ARGS)
 #endif
       default:
 	  DPRINTF(0,
-		  (stderr, "[C--trap default %d %d %p]\n", signal, code,
+		  (stderr, "[C--trap default %d %d %p]\n", signal, CODE(code),
 		   context));
 #ifdef __linux__
 	  interrupt_handle_now(signal, contextstruct);
diff --git a/lisp/x86-lispregs.h b/lisp/x86-lispregs.h
index c28d7baf8..d3ec2bd53 100644
--- a/lisp/x86-lispregs.h
+++ b/lisp/x86-lispregs.h
@@ -1,5 +1,5 @@
 /* x86-lispregs.h -*- Mode: C; -*-
- * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/x86-lispregs.h,v 1.6 2007/07/06 08:04:39 cshapiro Exp $
+ * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/x86-lispregs.h,v 1.7 2007/07/15 09:24:57 cshapiro Exp $
  */
 
 #ifndef _X86_LISPREGS_H_
@@ -53,8 +53,8 @@
 #define SC_PC(sc) ((sc)->uc_mcontext->ss.eip)
 #define SC_SP(sc) SC_REG(sc, reg_ESP)
 #else
-#define SC_PC(sc) ((sc)->sc_eip)
-#define SC_SP(sc) ((sc)->sc_esp)
+#define SC_PC(sc) ((sc)->uc_mcontext.mc_eip)
+#define SC_SP(sc) SC_REG(sc, reg_ESP)
 #endif
 
 #endif /* _X86_LISPREGS_H_ */
-- 
GitLab