Raymond Toy pushed to branch issue-97-define-ud2-inst at cmucl / cmucl
Commits: b43c4c55 by Raymond Toy at 2021-03-27T11:21:18-07:00 Clean up changes.
- - - - - 6c9719ab by Raymond Toy at 2021-03-27T12:33:23-07:00 Reinstall breakpoint correctly.
Also remove some debugging #ifdefs and change debugging fprintfs to DPRINTF.
More work needed.
- - - - - fc557845 by Raymond Toy at 2021-03-27T14:44:08-07:00 Removing breakpoint stuff from sigill; more cleanups
For now, we get breakpoint trap in sigill, we lose. This shouldn't happen because the lisp code shouldn't be inserting breakpoints this way.
Remove some #ifed code.
- - - - - d039eb90 by Raymond Toy at 2021-03-27T15:03:12-07:00 Clean up implemenation, updating debugging prints
Change debugging prints to use DPRINTF.
- - - - -
3 changed files:
- src/code/x86-vm.lisp - src/lisp/breakpoint.c - src/lisp/x86-arch.c
Changes:
===================================== src/code/x86-vm.lisp ===================================== @@ -247,9 +247,9 @@ (vector (make-array length :element-type '(unsigned-byte 8)))) (declare (type (unsigned-byte 8) length) (type (simple-array (unsigned-byte 8) (*)) vector)) - #+t + #+nil (format t "internal-error-args scp ~A: pc ~X len ~D~%" scp pc length) - ;; Grab the bytes after length byte, which + ;; Grab the length bytes after the length byte. (copy-from-system-area pc (* vm:byte-bits 4) vector (* vm:word-bits vm:vector-data-offset)
===================================== src/lisp/breakpoint.c ===================================== @@ -192,7 +192,9 @@ compute_offset(os_context_t * scp, lispobj code, boolean function_end) static int compute_offset(os_context_t * scp, lispobj code, boolean function_end) { - fprintf(stderr, "compute_offset: code = 0x%lx\n", code); + extern unsigned int debug_handlers; + + DPRINTF(debug_handlers, (stderr, "compute_offset: code = 0x%lx\n", code));
if (code == NIL) return 0; @@ -209,16 +211,18 @@ compute_offset(os_context_t * scp, lispobj code, boolean function_end) code_start = (unsigned long) codeptr + HeaderValue(codeptr->header) * sizeof(lispobj);
- fprintf(stderr, "compute_offset: pc = 0x%lx, code_start = 0x%lx\n", - pc, code_start); + DPRINTF(debug_handlers, + (stderr, "compute_offset: pc = 0x%lx, code_start = 0x%lx\n", + pc, code_start));
if (pc < code_start) return 0; else { int offset = pc - code_start;
- fprintf(stderr, "compute_offset: offset %d, size = %ld\n", - offset, codeptr->code_size); + DPRINTF(debug_handlers, + (stderr, "compute_offset: offset %d, size = %ld\n", + offset, codeptr->code_size));
if (offset >= codeptr->code_size) { return 0; @@ -253,17 +257,18 @@ 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);
code = find_code(scp);
-#if 1 - fprintf(stderr, "handle_breakpoint\n"); - fprintf(stderr, " offset = %d\n", compute_offset(scp, code, 0)); -#endif - + DPRINTF(debug_handlers, + (stderr, "handle breakpoint: offset %d\n", + compute_offset(scp, code, 0))); + /* * Don't disallow recursive breakpoint traps. Otherwise, we can't * use debugger breakpoints anywhere in here.
===================================== src/lisp/x86-arch.c ===================================== @@ -25,6 +25,13 @@
unsigned long fast_random_state = 1;
+/* + * Set to positive value to enabled debug prints related to the sigill + * and sigtrap handlers. Also enables prints related to handling of + * breakpoints. + */ +unsigned int debug_handlers = 0; + #if defined(SOLARIS) /* * Use the /dev/cpu/self/cpuid interface on Solaris. We could use the @@ -140,7 +147,8 @@ arch_skip_instruction(os_context_t * context) { int vlen, code;
- DPRINTF(1, (stderr, "[arch_skip_inst at %lx>]\n", SC_PC(context))); + DPRINTF(debug_handlers, + (stderr, "[arch_skip_inst at %lx>]\n", SC_PC(context)));
/* Get and skip the lisp error code. */ char* pc = (char *) SC_PC(context); @@ -178,7 +186,8 @@ arch_skip_instruction(os_context_t * context) break; }
- DPRINTF(0, (stderr, "[arch_skip_inst resuming at %lx>]\n", SC_PC(context))); + DPRINTF(debug_handlers, + (stderr, "[arch_skip_inst resuming at %lx>]\n", SC_PC(context))); }
unsigned char * @@ -207,28 +216,20 @@ arch_install_breakpoint(void *pc) unsigned char* ptr = (unsigned char *) pc; unsigned long result = ptr[0] | (ptr[1] << 8) | (ptr[2] << 16) | (ptr[3] << 24);
- fprintf(stderr, "arch_install_breakpoint at %p, old code = 0x%lx\n", - pc, result); - -#if 1 - *(char *) pc = BREAKPOINT_INST; /* x86 INT3 */ -#if 0 - *((char *) pc + 1) = trap_Breakpoint; /* Lisp trap code */ -#endif -#else - *ptr++ = 0x0f; /* UD2 */ - *ptr++ = 0x0b; - *ptr++ = trap_Breakpoint; /* Lisp trap code */ -#endif + DPRINTF(debug_handlers, + (stderr, "arch_install_breakpoint at %p, old code = 0x%lx\n", + pc, result));
+ *(char *) pc = BREAKPOINT_INST; /* x86 INT3 */ return result; }
void arch_remove_breakpoint(void *pc, unsigned long orig_inst) { - fprintf(stderr, "arch_remove_breakpoint: %p orig %lx\n", - pc, orig_inst); + DPRINTF(debug_handlers, + (stderr, "arch_remove_breakpoint: %p orig %lx\n", + pc, orig_inst)); unsigned char *ptr = (unsigned char *) pc; ptr[0] = orig_inst & 0xff; ptr[1] = (orig_inst >> 8) & 0xff; @@ -256,23 +257,15 @@ arch_do_displaced_inst(os_context_t * context, unsigned long orig_inst) { unsigned char *pc = (unsigned char *) SC_PC(context);
- fprintf(stderr, "arch_do_displaced_inst: pc %p orig_inst %lx\n", - pc, orig_inst); + DPRINTF(debug_handlers, + (stderr, "arch_do_displaced_inst: pc %p orig_inst %lx\n", + pc, orig_inst));
/* * Put the original instruction back. */
-#if 1 *((char *) pc) = orig_inst & 0xff; -#if 0 - *((char *) pc + 1) = (orig_inst & 0xff00) >> 8; -#endif -#else - pc[0] = orig_inst & 0xff; - pc[1] = (orig_inst >> 8) & 0xff; - pc[2] = (orig_inst >> 16) & 0xff; -#endif
#ifdef SC_EFLAGS /* Enable single-stepping */ @@ -317,71 +310,25 @@ sigill_handler(HANDLER_ARGS) { unsigned int trap; os_context_t* os_context = (os_context_t *) context; -#if 1 -#if 0 - fprintf(stderr, "x86sigtrap: %8x %x\n", - SC_PC(os_os_context), *(unsigned char *) (SC_PC(os_context) - 1)); -#else - fprintf(stderr,"x86sigill: fp=%lx sp=%lx pc=%lx { %x, %x, %x, %x, %x }\n", - SC_REG(context, reg_FP), - SC_REG(context, reg_SP), - SC_PC(context), - *(unsigned char*)(SC_PC(context) + 0), /* 0x0F */ - *(unsigned char*)(SC_PC(context) + 1), /* 0x0B */ - *(unsigned char*)(SC_PC(context) + 2), - *(unsigned char*)(SC_PC(context) + 3), - *(unsigned char*)(SC_PC(context) + 4)); -#endif - fprintf(stderr, "sigtrap(%d %d %p)\n", signal, CODE(code), os_context); -#endif
-#if 0 - if (single_stepping && (signal == SIGTRAP)) { -#if 1 - fprintf(stderr, "* Single step trap %p\n", single_stepping); -#endif - -#ifdef SC_EFLAGS - /* Disable single-stepping */ - SC_EFLAGS(os_context) ^= 0x100; -#else - /* Un-install single step helper instructions. */ - *(single_stepping - 3) = single_step_save1; - *(single_stepping - 2) = single_step_save2; - *(single_stepping - 1) = single_step_save3; - DPRINTF(0, (stderr, "Uninstalling helper instructions\n")); -#endif - - /* - * Re-install the breakpoint if possible. - */ - fprintf(stderr, "* Maybe reinstall breakpoint for pc %p with single_stepping %p\n", - (void*) SC_PC(os_context), single_stepping); - - if ((int) SC_PC(os_context) < (int) single_stepping + 3) - fprintf(stderr, "* Breakpoint not re-install\n"); - else { - char *ptr = (char *) single_stepping; - -#if 0 - ptr[0] = BREAKPOINT_INST; /* x86 INT3 */ - ptr[1] = trap_Breakpoint; -#else - ptr[0] = 0x0f; - ptr[1] = 0x0b; - ptr[2] = trap_Breakpoint; -#endif - } - - single_stepping = NULL; - return; + DPRINTF(debug_handlers, + (stderr,"sigill: fp=%lx sp=%lx pc=%lx { %x, %x, %x, %x, %x }\n", + SC_REG(context, reg_FP), + SC_REG(context, reg_SP), + SC_PC(context), + *((unsigned char*)SC_PC(context) + 0), /* 0x0F */ + *((unsigned char*)SC_PC(context) + 1), /* 0x0B */ + *((unsigned char*)SC_PC(context) + 2), + *((unsigned char*)SC_PC(context) + 3), + *((unsigned char*)SC_PC(context) + 4))); + + if (single_stepping) { + lose("sigill handler with single-stepping enabled?\n"); } -#endif
/* This is just for info in case monitor wants to print an approx */ current_control_stack_pointer = (unsigned long *) SC_SP(os_context);
- /* * In many places in the switch below, we eventually throw instead * of returning from the signal handler. So, just in case, set @@ -396,22 +343,20 @@ sigill_handler(HANDLER_ARGS) * arguments to follow. */
-#if 1 - fprintf(stderr, "pc %x\n", *(unsigned short *)SC_PC(context)); -#endif + DPRINTF(debug_handlers, + (stderr, "pc %x\n", *(unsigned short *)SC_PC(context))); + if (*(unsigned short *) SC_PC(context) == 0x0b0f) { trap = *(((char *)SC_PC(context)) + 2); } else { abort(); }
-#if 1 - fprintf(stderr, "code = %x\n", trap); -#endif + DPRINTF(debug_handlers, (stderr, "code = %x\n", trap));
switch (trap) { case trap_PendingInterrupt: - DPRINTF(1, (stderr, "<trap Pending Interrupt.>\n")); + DPRINTF(debug_handlers, (stderr, "<trap Pending Interrupt.>\n")); arch_skip_instruction(os_context); interrupt_handle_pending(os_context); break; @@ -432,28 +377,15 @@ sigill_handler(HANDLER_ARGS)
case trap_Error: case trap_Cerror: - DPRINTF(1, (stderr, "<trap Error %x>\n", CODE(code))); + DPRINTF(debug_handlers, (stderr, "<trap Error %x>\n", CODE(code))); interrupt_internal_error(signal, code, os_context, CODE(code) == trap_Cerror); break;
case trap_Breakpoint: -#if 1 - fprintf(stderr, "*C break\n"); -#endif -#if 0 - SC_PC(os_context) -= 1; -#endif - - handle_breakpoint(signal, CODE(code), os_context); -#if 1 - fprintf(stderr, "*C break return\n"); -#endif + lose("Unexpected breakpoint trap in sigill-hander.\n"); break;
case trap_FunctionEndBreakpoint: -#if 0 - SC_PC(os_context) -= 1; -#endif SC_PC(os_context) = (int) handle_function_end_breakpoint(signal, CODE(code), os_context); break; @@ -473,7 +405,7 @@ sigill_handler(HANDLER_ARGS) break; #endif default: - DPRINTF(1, + DPRINTF(debug_handlers, (stderr, "[C--trap default %d %d %p]\n", signal, CODE(code), os_context)); interrupt_handle_now(signal, code, os_context); @@ -486,21 +418,19 @@ sigtrap_handler(HANDLER_ARGS) { os_context_t* os_context = (os_context_t *) context;
-#if 1 - fprintf(stderr,"sigtrap: fp=%lx sp=%lx pc=%lx { %x, %x, %x, %x, %x }\n", - SC_REG(context, reg_FP), - SC_REG(context, reg_SP), - SC_PC(context), - *(unsigned char*)(SC_PC(context) + 0), /* 0x0F */ - *(unsigned char*)(SC_PC(context) + 1), /* 0x0B */ - *(unsigned char*)(SC_PC(context) + 2), - *(unsigned char*)(SC_PC(context) + 3), - *(unsigned char*)(SC_PC(context) + 4)); -#endif + DPRINTF(debug_handlers, + (stderr,"sigtrap: fp=%lx sp=%lx pc=%lx { %x, %x, %x, %x, %x }\n", + SC_REG(context, reg_FP), + SC_REG(context, reg_SP), + SC_PC(context), + *((unsigned char*)SC_PC(context) + 0), /* 0x0F */ + *((unsigned char*)SC_PC(context) + 1), /* 0x0B */ + *((unsigned char*)SC_PC(context) + 2), + *((unsigned char*)SC_PC(context) + 3), + *(unsigned char*)(SC_PC(context) + 4))); + if (single_stepping && (signal == SIGTRAP)) { -#if 1 - fprintf(stderr, "* Single step trap %p\n", single_stepping); -#endif + DPRINTF(debug_handlers, (stderr, "* Single step trap %p\n", single_stepping));
#ifdef SC_EFLAGS /* Disable single-stepping */ @@ -516,38 +446,29 @@ sigtrap_handler(HANDLER_ARGS) /* * Re-install the breakpoint if possible. */ - fprintf(stderr, "* Maybe reinstall breakpoint for pc %p with single_stepping %p\n", - (void*) SC_PC(os_context), single_stepping); + DPRINTF(debug_handlers, + (stderr, "* Maybe reinstall breakpoint for pc %p with single_stepping %p\n", + (void*) SC_PC(os_context), single_stepping));
if ((unsigned long) SC_PC(os_context) <= (unsigned long) single_stepping) fprintf(stderr, "* Breakpoint not re-install\n"); else { char *ptr = (char *) single_stepping;
-#if 0 ptr[0] = BREAKPOINT_INST; /* x86 INT3 */ - ptr[1] = trap_Breakpoint; -#else - ptr[0] = 0x0f; - ptr[1] = 0x0b; - ptr[2] = trap_Breakpoint; -#endif }
single_stepping = NULL; return; } -#if 1 - fprintf(stderr, "*C break\n"); -#endif -#if 1 - SC_PC(os_context) -= 1; -#endif
- handle_breakpoint(signal, CODE(code), os_context); -#if 1 - fprintf(stderr, "*C break return\n"); -#endif + DPRINTF(debug_handlers, (stderr, "*C break\n")); + + SC_PC(os_context) -= 1; + + handle_breakpoint(signal, CODE(code), os_context); + + DPRINTF(debug_handlers, (stderr, "*C break return\n")); }
View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/-/compare/21dd39ea7b8e5bf144ee67f...