X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-arch.c;h=9b51cc096223d3b876f4f962e9b299b36ddbe8a9;hb=e365f2f7a9c66d307b48fee70778f4eaa84bdcc0;hp=c46711567e9307364a4dbde2836f4937abdfa57f;hpb=dfa55a883f94470267b626dae77ce7e7dfac3df6;p=sbcl.git diff --git a/src/runtime/x86-arch.c b/src/runtime/x86-arch.c index c467115..9b51cc0 100644 --- a/src/runtime/x86-arch.c +++ b/src/runtime/x86-arch.c @@ -23,6 +23,11 @@ #include "interrupt.h" #include "interr.h" #include "breakpoint.h" +#include "monitor.h" +#include "thread.h" + +#include "genesis/static-symbols.h" +#include "genesis/symbol.h" #define BREAKPOINT_INST 0xcc /* INT3 */ @@ -67,7 +72,7 @@ void arch_skip_instruction(os_context_t *context) int vlen; int code; - FSHOW((stderr, "[arch_skip_inst at %x]\n", *os_context_pc_addr(context))); + FSHOW((stderr, "/[arch_skip_inst at %x]\n", *os_context_pc_addr(context))); /* Get and skip the Lisp interrupt code. */ code = *(char*)(*os_context_pc_addr(context))++; @@ -84,7 +89,7 @@ void arch_skip_instruction(os_context_t *context) break; case trap_Breakpoint: /* not tested */ - case trap_FunctionEndBreakpoint: /* not tested */ + case trap_FunEndBreakpoint: /* not tested */ break; case trap_PendingInterrupt: @@ -98,7 +103,7 @@ void arch_skip_instruction(os_context_t *context) } FSHOW((stderr, - "[arch_skip_inst resuming at %x]\n", + "/[arch_skip_inst resuming at %x]\n", *os_context_pc_addr(context))); } @@ -111,13 +116,14 @@ arch_internal_error_arguments(os_context_t *context) boolean arch_pseudo_atomic_atomic(os_context_t *context) { - return SymbolValue(PSEUDO_ATOMIC_ATOMIC); + return SymbolValue(PSEUDO_ATOMIC_ATOMIC,arch_os_get_current_thread()); } void arch_set_pseudo_atomic_interrupted(os_context_t *context) { - SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(1)); + SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(1), + arch_os_get_current_thread()); } /* @@ -216,6 +222,16 @@ sigtrap_handler(int signal, siginfo_t *info, void *void_context) current_control_stack_pointer = (lispobj *)*os_context_sp_addr(context); + /* FIXME: CMUCL puts the float control restoration code here. + Thus, it seems to me that single-stepping won't restore the + float control. Since SBCL currently doesn't support + single-stepping (as far as I can tell) this is somewhat moot, + but it might be worth either moving this code up or deleting + the single-stepping code entirely. -- CSR, 2002-07-15 */ +#ifdef LISP_FEATURE_LINUX + os_restore_fp_control(context); +#endif + /* On entry %eip points just after the INT3 byte and aims at the * 'kind' value (eg trap_Cerror). For error-trap and Cerror-trap a * number of bytes will follow, the first is the length of the byte @@ -224,7 +240,7 @@ sigtrap_handler(int signal, siginfo_t *info, void *void_context) switch (trap) { case trap_PendingInterrupt: - FSHOW((stderr, "\n")); + FSHOW((stderr, "/\n")); arch_skip_instruction(context); interrupt_handle_pending(context); break; @@ -248,25 +264,46 @@ sigtrap_handler(int signal, siginfo_t *info, void *void_context) handle_breakpoint(signal, info, context); break; - case trap_FunctionEndBreakpoint: + case trap_FunEndBreakpoint: (char*)(*os_context_pc_addr(context)) -= 1; *os_context_pc_addr(context) = - (int)handle_function_end_breakpoint(signal, info, context); + (int)handle_fun_end_breakpoint(signal, info, context); break; default: - FSHOW((stderr,"[C--trap default %d %d %x]\n", + FSHOW((stderr,"/[C--trap default %d %d %x]\n", signal, code, context)); interrupt_handle_now(signal, info, context); break; } } +static void +sigill_handler(int signal, siginfo_t *siginfo, void *void_context) { + os_context_t *context = (os_context_t*)void_context; + fake_foreign_function_call(context); + monitor_or_something(); +} + void arch_install_interrupt_handlers() { - interrupt_install_low_level_handler(SIGILL , sigtrap_handler); - interrupt_install_low_level_handler(SIGTRAP, sigtrap_handler); + SHOW("entering arch_install_interrupt_handlers()"); + + /* Note: The old CMU CL code here used sigtrap_handler() to handle + * SIGILL as well as SIGTRAP. I couldn't see any reason to do + * things that way. So, I changed to separate handlers when + * debugging a problem on OpenBSD, where SBCL wasn't catching + * SIGILL properly, but was instead letting the process be + * terminated with an "Illegal instruction" output. If this change + * turns out to break something (maybe breakpoint handling on some + * OS I haven't tested on?) and we have to go back to the old CMU + * CL way, I hope there will at least be a comment to explain + * why.. -- WHN 2001-06-07 */ + undoably_install_low_level_interrupt_handler(SIGILL , sigill_handler); + undoably_install_low_level_interrupt_handler(SIGTRAP, sigtrap_handler); + + SHOW("returning from arch_install_interrupt_handlers()"); } /* This is implemented in assembly language and called from C: */ @@ -281,11 +318,13 @@ call_into_lisp(lispobj fun, lispobj *args, int nargs); * could be in registers depending on what the compiler likes. So we * copy the args into a portable vector and let the assembly language * call-in function figure it out. */ + lispobj funcall0(lispobj function) { lispobj *args = NULL; + FSHOW((stderr, "/entering funcall0(0x%lx)\n", (long)function)); return call_into_lisp(function, args, 0); } lispobj