From dbd8d943f628b6fb2d3e68d3c5a2568ade8db692 Mon Sep 17 00:00:00 2001
From: rtoy <rtoy>
Date: Fri, 5 Sep 2008 22:03:12 +0000
Subject: [PATCH] compiler/ppc/parms.lisp: compiler/sparc/parms.lisp: o Add
 lisp::*gc-inhibit* to list of static symbols.  (No cross-compile   needed
 because we used one of the spare static symbols.  Full cycle   of builds
 needed to progate the changes.)

lisp/breakpoint.c:
o Disable GC when calling HANDLE-BREAKPOINT.  This is a temporary
  workaround to the issue where a GC occurring during
  HANDLE-BREAKPOINT can cause a segfault during tracing.  GC moves the
  code object and/or bogus lra such that we don't know where we should
  return to.
---
 compiler/ppc/parms.lisp   |  5 +++--
 compiler/sparc/parms.lisp |  5 +++--
 lisp/breakpoint.c         | 19 ++++++++++++++++---
 3 files changed, 22 insertions(+), 7 deletions(-)

diff --git a/compiler/ppc/parms.lisp b/compiler/ppc/parms.lisp
index 3431ac9c1..e8e81e72e 100644
--- a/compiler/ppc/parms.lisp
+++ b/compiler/ppc/parms.lisp
@@ -7,7 +7,7 @@
 ;;; Scott Fahlman or slisp-group@cs.cmu.edu.
 ;;;
 (ext:file-comment
-  "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/ppc/parms.lisp,v 1.16 2006/12/02 15:22:36 rtoy Exp $")
+  "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/ppc/parms.lisp,v 1.17 2008/09/05 22:03:12 rtoy Exp $")
 ;;;
 ;;; **********************************************************************
 ;;;
@@ -270,9 +270,10 @@
     :key-and-value
     :key-or-value
     
+    lisp::*gc-inhibit*
+
     ;; Spare symbols.  Rename these when you need to add some static
     ;; symbols and don't want to do a cross-compile.
-    spare-9
     spare-8
     spare-7
     spare-6
diff --git a/compiler/sparc/parms.lisp b/compiler/sparc/parms.lisp
index 9e883d903..875666ea0 100644
--- a/compiler/sparc/parms.lisp
+++ b/compiler/sparc/parms.lisp
@@ -5,7 +5,7 @@
 ;;; Carnegie Mellon University, and has been placed in the public domain.
 ;;;
 (ext:file-comment
-  "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/sparc/parms.lisp,v 1.54 2008/04/15 14:33:25 rtoy Exp $")
+  "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/sparc/parms.lisp,v 1.55 2008/09/05 22:03:12 rtoy Exp $")
 ;;;
 ;;; **********************************************************************
 ;;;
@@ -329,10 +329,11 @@
     :key-and-value
     :key-or-value
     
+    lisp::*gc-inhibit*
+    
     ;; Some spare static symbols.  Useful for adding another static
     ;; symbol without having to do a cross-compile.  Just rename one
     ;; of these to the desired name.
-    spare-9
     spare-8
     spare-7
     spare-6
diff --git a/lisp/breakpoint.c b/lisp/breakpoint.c
index 01b4345f5..d742b9807 100644
--- a/lisp/breakpoint.c
+++ b/lisp/breakpoint.c
@@ -1,6 +1,6 @@
 /*
 
- $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/breakpoint.c,v 1.23 2008/09/05 13:12:03 rtoy Exp $
+ $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/breakpoint.c,v 1.24 2008/09/05 22:03:12 rtoy 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.
@@ -326,8 +326,6 @@ handle_function_end_breakpoint(int signal, int subcode, os_context_t * scp)
 #endif
     }
 
-    funcall3(SymbolFunction(HANDLE_BREAKPOINT), offset, code, alloc_sap(scp));
-
     /*
      * Breakpoint handling done, so get the real LRA where we're
      * supposed to return to so we can return there.
@@ -342,6 +340,21 @@ handle_function_end_breakpoint(int signal, int subcode, os_context_t * scp)
     if (codeptr->constants[KNOWN_RETURN_P_SLOT] == NIL)
 	SC_REG(scp, reg_CODE) = lra;
 #endif
+    
+    {
+        lispobj saved_gc_inhibit;
+
+#ifdef GC_INHIBIT
+        saved_gc_inhibit = SymbolValue(GC_INHIBIT);
+        SetSymbolValue(GC_INHIBIT, T);
+#endif        
+        funcall3(SymbolFunction(HANDLE_BREAKPOINT), offset, code, alloc_sap(scp));
+
+#ifdef GC_INHIBIT
+        SetSymbolValue(GC_INHIBIT, saved_gc_inhibit);
+#endif
+    }
+
     undo_fake_foreign_function_call(scp);
     return (void *) (lra - type_OtherPointer + sizeof(lispobj));
 }
-- 
GitLab