X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-64-arch.c;h=a88435c861d550cd14615419bb26af90cda6954e;hb=53ab0266f9a92943cc93f675cc727d01cfa55474;hp=611bee6d30159b7b8150ddea8705af796967504f;hpb=4023b1bec2412344e5eea4a33cd85dd662149c67;p=sbcl.git diff --git a/src/runtime/x86-64-arch.c b/src/runtime/x86-64-arch.c index 611bee6..a88435c 100644 --- a/src/runtime/x86-64-arch.c +++ b/src/runtime/x86-64-arch.c @@ -25,6 +25,7 @@ #include "interr.h" #include "breakpoint.h" #include "thread.h" +#include "pseudo-atomic.h" #include "genesis/static-symbols.h" #include "genesis/symbol.h" @@ -53,7 +54,7 @@ arch_get_bad_addr(int sig, siginfo_t *code, os_context_t *context) os_context_register_t * context_eflags_addr(os_context_t *context) { -#if defined __linux__ +#if defined __linux__ || defined __sun /* KLUDGE: As of kernel 2.2.14 on Red Hat 6.2, there's code in the * file to define symbolic names for offsets into * gregs[], but it's conditional on __USE_GNU and not defined, so @@ -63,9 +64,9 @@ context_eflags_addr(os_context_t *context) #elif defined __FreeBSD__ return &context->uc_mcontext.mc_rflags; #elif defined LISP_FEATURE_DARWIN - return &context->uc_mcontext->ss.rflags; + return CONTEXT_ADDR_FROM_STEM(rflags); #elif defined __OpenBSD__ - return &context->sc_eflags; + return &context->sc_rflags; #else #error unsupported OS #endif @@ -229,9 +230,8 @@ arch_handle_single_step_trap(os_context_t *context, int trap) void -sigtrap_handler(int signal, siginfo_t *info, void *void_context) +sigtrap_handler(int signal, siginfo_t *info, os_context_t *context) { - os_context_t *context = (os_context_t*)void_context; unsigned int trap; if (single_stepping && (signal==SIGTRAP)) @@ -262,16 +262,6 @@ 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 */ -#if defined(LISP_FEATURE_LINUX) || defined(RESTORE_FP_CONTROL_FROM_CONTEXT) - 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 @@ -282,16 +272,14 @@ sigtrap_handler(int signal, siginfo_t *info, void *void_context) } void -sigill_handler(int signal, siginfo_t *siginfo, void *void_context) { - os_context_t *context = (os_context_t*)void_context; - +sigill_handler(int signal, siginfo_t *siginfo, os_context_t *context) { /* Triggering SIGTRAP using int3 is unreliable on OS X/x86, so * we need to use illegal instructions for traps. */ #if defined(LISP_FEATURE_DARWIN) && !defined(LISP_FEATURE_MACH_EXCEPTION_HANDLER) if (*((unsigned short *)*os_context_pc_addr(context)) == 0x0b0f) { *os_context_pc_addr(context) += 2; - return sigtrap_handler(signal, siginfo, void_context); + return sigtrap_handler(signal, siginfo, context); } #endif @@ -333,9 +321,8 @@ mxcsr_to_code(unsigned int mxcsr) } static void -sigfpe_handler(int signal, siginfo_t *siginfo, void *void_context) +sigfpe_handler(int signal, siginfo_t *siginfo, os_context_t *context) { - os_context_t *context = arch_os_get_context(&void_context); unsigned int *mxcsr = arch_os_context_mxcsr_addr(context); if (siginfo->si_code == 0) { /* XMM exception */