Date: Thursday, December 23, 2010 @ 17:23:48
Author: rtoy
Path: /project/cmucl/cvsroot/src/lisp
Modified: x86-arch.c x86-lispregs.h
Fix tracing for NetBSD. Function end breakpoints didn't seem to be
working when tracing, for example
(declaim (ftype (function (double-float) double-float) fact))
(defun fact (x)
(declare (double-float x))
(if (= x 1)
1d0
(* x (fact (1- x)))))
lisp/x86-lispregs.h
o NetBSD has access to the eflags register
lisp/x86-arch.c:
o Add some debugging prints (disabled).
o The stuff near line 262 about pc-9 pointing to the pushf instruction
should be conditioned on SC_EFLAGS because that's what decides
whether we insert the pushf instructions for single stepping.
----------------+
x86-arch.c | 12 ++++++++----
x86-lispregs.h | 4 +++-
2 files changed, 11 insertions(+), 5 deletions(-)
Index: src/lisp/x86-arch.c
diff -u src/lisp/x86-arch.c:1.40 src/lisp/x86-arch.c:1.41
--- src/lisp/x86-arch.c:1.40 Tue Dec 21 21:12:52 2010
+++ src/lisp/x86-arch.c Thu Dec 23 17:23:48 2010
@@ -1,6 +1,6 @@
/* x86-arch.c -*- Mode: C; comment-column: 40 -*-
*
- * $Header: /project/cmucl/cvsroot/src/lisp/x86-arch.c,v 1.40 2010-12-22 02:12:52 rtoy Exp $
+ * $Header: /project/cmucl/cvsroot/src/lisp/x86-arch.c,v 1.41 2010-12-23 22:23:48 rtoy Exp $
*
*/
@@ -250,6 +250,8 @@
* single-stepping and stop on the next instruction.
*/
+ DFPRINTF(0, (stderr, "Installing helper instructions\n"));
+
single_step_save1 = *(pc - 3);
single_step_save2 = *(pc - 2);
single_step_save3 = *(pc - 1);
@@ -260,12 +262,13 @@
single_stepping = (unsigned int *) pc;
-#if !(defined(__linux__) || defined(DARWIN))
+#ifndef SC_EFLAGS
/*
* pc - 9 points to the pushf instruction that we installed for
* the helper.
*/
+ DFPRINTF(0, (stderr, " Setting pc to pushf instruction at %p\n", (void*) ((char*) pc - 9)));
SC_PC(context) = (int)((char *) pc - 9);
#endif
}
@@ -277,8 +280,8 @@
unsigned int trap;
#if 0
- fprintf(stderr, "x86sigtrap: %8x %x\n",
- SC_PC(context), *(unsigned char *) (SC_PC(context) - 1));
+ fprintf(stderr, "x86sigtrap: %8x %x\n",
+ SC_PC(context), *(unsigned char *) (SC_PC(context) - 1));
fprintf(stderr, "sigtrap(%d %d %x)\n", signal, CODE(code), context);
#endif
@@ -295,6 +298,7 @@
*(single_stepping - 3) = single_step_save1;
*(single_stepping - 2) = single_step_save2;
*(single_stepping - 1) = single_step_save3;
+ DFPRINTF(0, (stderr, "Uninstalling helper instructions\n"));
#endif
/*
Index: src/lisp/x86-lispregs.h
diff -u src/lisp/x86-lispregs.h:1.13 src/lisp/x86-lispregs.h:1.14
--- src/lisp/x86-lispregs.h:1.13 Mon Dec 29 09:40:34 2008
+++ src/lisp/x86-lispregs.h Thu Dec 23 17:23:48 2010
@@ -1,5 +1,5 @@
/* x86-lispregs.h -*- Mode: C; -*-
- * $Header: /project/cmucl/cvsroot/src/lisp/x86-lispregs.h,v 1.13 2008-12-29 14:40:34 rtoy Rel $
+ * $Header: /project/cmucl/cvsroot/src/lisp/x86-lispregs.h,v 1.14 2010-12-23 22:23:48 rtoy Exp $
*/
#ifndef _X86_LISPREGS_H_
@@ -58,6 +58,8 @@
#endif
#elif defined(__linux__)
#define SC_EFLAGS(sc) ((sc)->uc_mcontext.gregs[REG_EFL])
+#elif defined(__NetBSD__)
+#define SC_EFLAGS(sc) ((sc)->uc_mcontext.__gregs[_REG_EFL])
#endif
#endif /* _X86_LISPREGS_H_ */