X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-64-arch.c;h=eaa1e23a99734590534177897a666d8b7c3d3c3b;hb=d1e7b48b17180a417c41ed55eb382ebf6d4e7a2a;hp=40b068327dfd9bd9ed17c93825472a3a7afcef74;hpb=71c1aff9923ecec1b55fdc48a3a2f149e9e7da68;p=sbcl.git diff --git a/src/runtime/x86-64-arch.c b/src/runtime/x86-64-arch.c index 40b0683..eaa1e23 100644 --- a/src/runtime/x86-64-arch.c +++ b/src/runtime/x86-64-arch.c @@ -24,7 +24,6 @@ #include "interrupt.h" #include "interr.h" #include "breakpoint.h" -#include "monitor.h" #include "thread.h" #include "genesis/static-symbols.h" @@ -123,14 +122,21 @@ arch_internal_error_arguments(os_context_t *context) boolean arch_pseudo_atomic_atomic(os_context_t *context) { - return SymbolValue(PSEUDO_ATOMIC_ATOMIC,arch_os_get_current_thread()); + return get_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), - arch_os_get_current_thread()); + struct thread *thread = arch_os_get_current_thread(); + set_pseudo_atomic_interrupted(thread); +} + +void +arch_clear_pseudo_atomic_interrupted(os_context_t *context) +{ + struct thread *thread = arch_os_get_current_thread(); + clear_pseudo_atomic_interrupted(thread); } /* @@ -158,11 +164,6 @@ arch_remove_breakpoint(void *pc, unsigned int orig_inst) /* When single stepping, single_stepping holds the original instruction * PC location. */ unsigned int *single_stepping = NULL; -#ifdef CANNOT_GET_TO_SINGLE_STEP_FLAG -unsigned long single_step_save1; -unsigned long single_step_save2; -unsigned long single_step_save3; -#endif void arch_do_displaced_inst(os_context_t *context, unsigned int orig_inst) @@ -173,25 +174,11 @@ arch_do_displaced_inst(os_context_t *context, unsigned int orig_inst) *((char *)pc) = orig_inst & 0xff; *((char *)pc + 1) = (orig_inst & 0xff00) >> 8; -#ifdef CANNOT_GET_TO_SINGLE_STEP_FLAG - /* Install helper instructions for the single step: - * pushf; or [esp],0x100; popf. */ - single_step_save1 = *(pc-3); - single_step_save2 = *(pc-2); - single_step_save3 = *(pc-1); - *(pc-3) = 0x9c909090; - *(pc-2) = 0x00240c81; - *(pc-1) = 0x9d000001; -#else *context_eflags_addr(context) |= 0x100; -#endif single_stepping = pc; - -#ifdef CANNOT_GET_TO_SINGLE_STEP_FLAG - *os_context_pc_addr(context) = (char *)pc - 9; -#endif } + void sigtrap_handler(int signal, siginfo_t *info, void *void_context) @@ -202,16 +189,8 @@ sigtrap_handler(int signal, siginfo_t *info, void *void_context) if (single_stepping && (signal==SIGTRAP)) { - /* fprintf(stderr,"* single step trap %x\n", single_stepping); */ - -#ifdef CANNOT_GET_TO_SINGLE_STEP_FLAG - /* Un-install single step helper instructions. */ - *(single_stepping-3) = single_step_save1; - *(single_stepping-2) = single_step_save2; - *(single_stepping-1) = single_step_save3; -#else *context_eflags_addr(context) ^= 0x100; -#endif + /* Re-install the breakpoint if possible. */ if (*os_context_pc_addr(context) == (int)single_stepping + 1) { fprintf(stderr, "warning: couldn't reinstall breakpoint\n"); @@ -258,7 +237,7 @@ sigtrap_handler(int signal, siginfo_t *info, void *void_context) * seems to be no point in doing that, since we're just * going to lose(..) anyway. */ fake_foreign_function_call(context); - lose("%%PRIMITIVE HALT called; the party is over."); + lose("%%PRIMITIVE HALT called; the party is over.\n"); case trap_Error: case trap_Cerror: @@ -289,7 +268,7 @@ 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(); + lose("fake_foreign_function_call fell through"); } void