Raymond Toy pushed to branch issue-97-define-ud2-inst at cmucl / cmucl
Commits: 40fff139 by Raymond Toy at 2021-04-09T14:14:52-07:00 Use TRAP_CODE to insert the desired traps
- - - - - 3adaeb13 by Raymond Toy at 2021-04-09T14:15:50-07:00 Correctly extract the trap code from the instruction stream.
The code is in the low 6 bits. Need to ignore everything else when extracting it.
Verified that function end breakpoints now work again instead of getting a sigill error because of an unknown code.
- - - - -
2 changed files:
- src/lisp/x86-arch.c - src/lisp/x86-assem.S
Changes:
===================================== src/lisp/x86-arch.c ===================================== @@ -369,7 +369,12 @@ sigill_handler(HANDLER_ARGS) * trap code? */ if (*(unsigned short *) SC_PC(context) == 0xb90f) { - trap = *(((char *)SC_PC(context)) + 2); + /* + * This must match what the lisp code is doing. The trap + * number is placed in the low 6-bits of the 3rd byte of the + * instruction. + */ + trap = *(((char *)SC_PC(context)) + 2) & 63; } else { abort(); }
===================================== src/lisp/x86-assem.S ===================================== @@ -18,6 +18,16 @@ #include "internals.h" #include "lispregs.h"
+/* + * Emit the appropriate instruction used for implementing traps. + * Currently, this is the UD1 instruction. However, it make it + * easy to add the trap code, use a sequence of bytes. The code + * is smashed into the mod r/m byte with the mod bits set to + * #b11. This MUST be coordinated with the Lisp code and the C + * code. + * + * Also, clang doesn't recognize the ud1 instruction. + */ #define TRAP_CODE(code) \ .byte 0x0f ; \ .byte 0xb9 ; \ @@ -249,10 +259,7 @@ ENDFUNC(sse_restore) * The undefined-function trampoline. */ FUNCDEF(undefined_tramp) - # UD1 - .byte 0x0f - .byte 0xb9 - .byte trap_Error + TRAP_CODE(trap_Error) /* Number of argument bytes */ .byte 2 .byte UNDEFINED_SYMBOL_ERROR @@ -300,40 +307,28 @@ GNAME(function_end_breakpoint_trap): .byte 0xb9 .byte 0xc0 + trap_PendingInterrupt */ - # UD1 - .byte 0x0f - .byte 0xb9 - .byte 0xc0 + trap_FunctionEndBreakpoint + TRAP_CODE(trap_FunctionEndBreakpoint) hlt # Should never return here. +ENDFUNC(function_end_breakpoint_trap)
.globl GNAME(function_end_breakpoint_end) GNAME(function_end_breakpoint_end):
- FUNCDEF(do_pending_interrupt) - # UD1 - .byte 0x0f - .byte 0xb9 - .byte trap_PendingInterrupt + TRAP_CODE(trap_PendingInterrupt) ret ENDFUNC(do_pending_interrupt) #ifdef trap_DynamicSpaceOverflowError FUNCDEF(do_dynamic_space_overflow_error) - # UD1 - .byte 0x0f - .byte 0xb9 - .byte trap_DynamicSpaceOverflowError + TRAP_CODE(trap_DynamicSpaceOverflowError) ret ENDFUNC(do_dynamic_space_overflow_error) #endif #ifdef trap_DynamicSpaceOverflowWarning FUNCDEF(do_dynamic_space_overflow_warning) - # UD1 - .byte 0x0f - .byte 0xb9 - .byte trap_DynamicSpaceOverflowWarning + TRAP_CODE(trap_DynamicSpaceOverflowWarning) ret ENDFUNC(do_dynamic_space_overflow_warning) #endif @@ -515,10 +510,7 @@ FUNCDEF(undefined_foreign_symbol_trap) movl 8(%ebp),%eax
/* Now trap to Lisp */ - # UD1 - .byte 0x0f - .byte 0xb9 - .byte trap_Error + TRAP_CODE(trap_Error) /* Number of argument bytes */ .byte 2 .byte UNDEFINED_FOREIGN_SYMBOL_ERROR
View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/-/compare/93d7cf02396314c79a176f1...