X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-64-arch.c;h=6ee2690f6a09ec74504114a213b6f50e55ac8357;hb=2ffb42cdf6d95801c24460084e8b486c71b767c2;hp=ee8f6c6cdb5c6e731ec76ba4a7d792dcf4301306;hpb=79cc569a97e444389350ea3f5b1017374fe16bec;p=sbcl.git diff --git a/src/runtime/x86-64-arch.c b/src/runtime/x86-64-arch.c index ee8f6c6..6ee2690 100644 --- a/src/runtime/x86-64-arch.c +++ b/src/runtime/x86-64-arch.c @@ -36,6 +36,13 @@ unsigned long fast_random_state = 1; void arch_init(void) {} + +os_vm_address_t +arch_get_bad_addr(int sig, siginfo_t *code, os_context_t *context) +{ + return (os_vm_address_t)code->si_addr; +} + /* * hacking signal contexts @@ -125,15 +132,22 @@ 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. */ -unsigned long +unsigned int arch_install_breakpoint(void *pc) { - unsigned long result = *(unsigned long*)pc; + unsigned int result = *(unsigned int*)pc; *(char*)pc = BREAKPOINT_INST; /* x86 INT3 */ *((char*)pc+1) = trap_Breakpoint; /* Lisp trap code */ @@ -142,7 +156,7 @@ arch_install_breakpoint(void *pc) } void -arch_remove_breakpoint(void *pc, unsigned long orig_inst) +arch_remove_breakpoint(void *pc, unsigned int orig_inst) { *((char *)pc) = orig_inst & 0xff; *((char *)pc + 1) = (orig_inst & 0xff00) >> 8; @@ -150,41 +164,22 @@ arch_remove_breakpoint(void *pc, unsigned long orig_inst) /* When single stepping, single_stepping holds the original instruction * PC location. */ -unsigned long *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 +unsigned int *single_stepping = NULL; void arch_do_displaced_inst(os_context_t *context, unsigned int orig_inst) { - unsigned long *pc = (unsigned long*)(*os_context_pc_addr(context)); + unsigned int *pc = (unsigned int*)(*os_context_pc_addr(context)); /* Put the original instruction back. */ *((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 = (unsigned int*)pc; - -#ifdef CANNOT_GET_TO_SINGLE_STEP_FLAG - *os_context_pc_addr(context) = (char *)pc - 9; -#endif + single_stepping = pc; } + void sigtrap_handler(int signal, siginfo_t *info, void *void_context) @@ -195,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"); @@ -251,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: