X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-64-arch.c;h=6ee2690f6a09ec74504114a213b6f50e55ac8357;hb=6cb4f9ea3f4e35a5a8e75922833e14575ae92180;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..6ee2690 100644 --- a/src/runtime/x86-64-arch.c +++ b/src/runtime/x86-64-arch.c @@ -132,6 +132,13 @@ arch_set_pseudo_atomic_interrupted(os_context_t *context) SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(1), arch_os_get_current_thread()); } + +void +arch_clear_pseudo_atomic_interrupted(os_context_t *context) +{ + SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(0), + arch_os_get_current_thread()); +} /* * This stuff seems to get called for TRACE and debug activity. @@ -158,11 +165,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 +175,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 +190,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 +238,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: