X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-64-arch.c;h=f3f414b8d3293d98bb08a07b63db880db4dacba3;hb=8c564b785ae1dab0f1e04331f47638dde625372b;hp=d075ce60794f81684655db68ae73bb761d2362c3;hpb=de0a47a2f2b165f34177669bd9499135847b4897;p=sbcl.git diff --git a/src/runtime/x86-64-arch.c b/src/runtime/x86-64-arch.c index d075ce6..f3f414b 100644 --- a/src/runtime/x86-64-arch.c +++ b/src/runtime/x86-64-arch.c @@ -54,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 @@ -66,7 +66,9 @@ context_eflags_addr(os_context_t *context) #elif defined LISP_FEATURE_DARWIN return CONTEXT_ADDR_FROM_STEM(rflags); #elif defined __OpenBSD__ - return &context->sc_eflags; + return &context->sc_rflags; +#elif defined __NetBSD__ + return CONTEXT_ADDR_FROM_STEM(RFLAGS); #else #error unsupported OS #endif @@ -230,9 +232,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)) @@ -263,16 +264,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 @@ -283,16 +274,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 @@ -334,9 +323,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 */