[Git][cmucl/cmucl][issue-97-define-ud2-inst] 2 commits: Remove debugging prints

Raymond Toy gitlab at common-lisp.net
Sun Mar 28 15:03:02 UTC 2021



Raymond Toy pushed to branch issue-97-define-ud2-inst at cmucl / cmucl


Commits:
07da205f by Raymond Toy at 2021-03-28T08:02:04-07:00
Remove debugging prints

- - - - -
a99cd825 by Raymond Toy at 2021-03-28T08:02:24-07:00
Clean up and add comments on how things work.

- - - - -


4 changed files:

- src/code/debug-int.lisp
- src/lisp/breakpoint.c
- src/lisp/x86-arch.c
- src/lisp/x86-arch.h


Changes:

=====================================
src/code/debug-int.lisp
=====================================
@@ -4477,9 +4477,6 @@ The result is a symbol or nil if the routine cannot be found."
 ;;;
 (defun handle-breakpoint (offset component signal-context)
   (let ((data (breakpoint-data component offset nil)))
-    (format t "(handle-breakpoint ~A ~A ~A)~%"
-	    offset component signal-context)
-    (format t "  data = ~A~%" data)
     (unless data
       (error (intl:gettext "Unknown breakpoint in ~S at offset ~S.")
 	      (debug-function-name (debug-function-from-pc component offset))


=====================================
src/lisp/breakpoint.c
=====================================
@@ -192,8 +192,6 @@ compute_offset(os_context_t * scp, lispobj code, boolean function_end)
 static int
 compute_offset(os_context_t * scp, lispobj code, boolean function_end)
 {
-    extern unsigned int debug_handlers;
-    
     DPRINTF(debug_handlers, (stderr, "compute_offset: code = 0x%lx\n", code));
     
     if (code == NIL)
@@ -257,8 +255,6 @@ handle_breakpoint(int signal, int subcode, os_context_t * scp)
 void
 handle_breakpoint(int signal, int subcode, os_context_t * scp)
 {
-    extern unsigned int debug_handlers;
-
     lispobj code, scp_sap = alloc_sap(scp);
 
     fake_foreign_function_call(scp);


=====================================
src/lisp/x86-arch.c
=====================================
@@ -153,7 +153,8 @@ arch_skip_instruction(os_context_t * context)
     /* Get and skip the lisp error code. */
     char* pc = (char *) SC_PC(context);
     
-    pc += 2;        /* skip 0x0f and 0x0b */
+    /* Skip over the UD2 inst (0x0f, 0x0b) */
+    pc += 2;
 
     code = *pc++;
     SC_PC(context) = (unsigned long) pc;
@@ -173,6 +174,8 @@ arch_skip_instruction(os_context_t * context)
 	  break;
 
       case trap_Breakpoint:
+          lose("Unexpected breakpoint trap in arch_skip_instruction\n");
+          break;
       case trap_FunctionEndBreakpoint:
 	  break;
 
@@ -231,6 +234,11 @@ arch_remove_breakpoint(void *pc, unsigned long orig_inst)
             (stderr, "arch_remove_breakpoint: %p orig %lx\n",
              pc, orig_inst));
     unsigned char *ptr = (unsigned char *) pc;
+    /*
+     * Just restore all the bytes from orig_inst.  Should we just
+     * re-install just the one byte that was taken by the int3
+     * instruction?
+     */
     ptr[0] = orig_inst & 0xff;
     ptr[1] = (orig_inst >> 8) & 0xff;
     ptr[2] = (orig_inst >> 16) & 0xff;
@@ -267,8 +275,12 @@ arch_do_displaced_inst(os_context_t * context, unsigned long orig_inst)
 
     *((char *) pc) = orig_inst & 0xff;
 
+    /*
+     * If we have the SC_EFLAGS macro, we can enable single-stepping
+     * by setting the bit.  Otherwise, we need a more complicated way
+     * of enabling single-stepping.
+     */
 #ifdef SC_EFLAGS
-    /* Enable single-stepping */
     SC_EFLAGS(context) |= 0x100;
 #else
 
@@ -305,6 +317,11 @@ arch_do_displaced_inst(os_context_t * context, unsigned long orig_inst)
 }
 
 
+/*
+ * Handles the break instruction from lisp, which is now UD2 followed
+ * by the trap code.  In particular, this does not handle the
+ * breakpoint traps.
+ */
 void
 sigill_handler(HANDLER_ARGS)
 {
@@ -322,9 +339,6 @@ sigill_handler(HANDLER_ARGS)
              *((unsigned char*)SC_PC(context) + 3),
              *((unsigned char*)SC_PC(context) + 4)));
 
-    if (single_stepping) {
-        lose("sigill handler with single-stepping enabled?\n");
-    }
     
     /* This is just for info in case monitor wants to print an approx */
     current_control_stack_pointer = (unsigned long *) SC_SP(os_context);
@@ -346,6 +360,14 @@ sigill_handler(HANDLER_ARGS)
     DPRINTF(debug_handlers,
             (stderr, "pc %x\n",  *(unsigned short *)SC_PC(context)));
 
+    /*
+     * Make sure the trapping instruction is UD2.  Abort if not.
+     *
+     * TODO: aborting is probably not the best idea.  Could get here
+     * from other illegal instructions in, say, C code?  Maybe we
+     * should call interrupt_handle_now, as we do below for an unknown
+     * trap code?
+     */
     if (*(unsigned short *) SC_PC(context) == 0x0b0f) {
         trap = *(((char *)SC_PC(context)) + 2);
     } else {
@@ -413,6 +435,9 @@ sigill_handler(HANDLER_ARGS)
     }
 }
 
+/*
+ * Handles the breakpoint trap (int3) and also single-stepping
+ */
 void
 sigtrap_handler(HANDLER_ARGS) 
 {
@@ -464,6 +489,13 @@ sigtrap_handler(HANDLER_ARGS)
 
     DPRINTF(debug_handlers, (stderr, "*C break\n"));
 
+    /*
+     * The int3 instruction causes a trap that leaves us just after
+     * the instruction.  Backup one so we're at the beginning.  This
+     * is really important so that when we handle the breakpoint, the
+     * offset of the instruction matches where Lisp thinks the
+     * breakpoint was placed.
+     */
     SC_PC(os_context) -= 1;
 
     handle_breakpoint(signal, CODE(code), os_context);


=====================================
src/lisp/x86-arch.h
=====================================
@@ -9,6 +9,13 @@
 extern int arch_support_sse2(void);
 extern boolean os_support_sse2(void);
 
+/*
+ * Set to non-zero to enable debug prints for debugging the sigill and
+ * sigtrap handlers and for debugging breakpoints.
+ */
+extern unsigned int debug_handlers;
+
+
 /*
  * Define macro to allocate a local array of the appropriate size
  * where the fpu state can be stored.



View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/-/compare/d039eb90c6e86457c946c9f7d75c6a4c14ab4d78...a99cd82590c6b899d3fadd5180cdd61aa4523c31

-- 
View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/-/compare/d039eb90c6e86457c946c9f7d75c6a4c14ab4d78...a99cd82590c6b899d3fadd5180cdd61aa4523c31
You're receiving this email because of your account on gitlab.common-lisp.net.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/cmucl-cvs/attachments/20210328/43744750/attachment-0001.html>


More information about the cmucl-cvs mailing list