X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fmips-arch.c;h=b33b1185e24c2095eef0dc1c5577972a0c7022cb;hb=b9519773faa7b3c98915eccb9cb1fd8a8270ee56;hp=ac3b0ffe498a9e6d9f53858393e775eab95f6566;hpb=b5c69cfe906a31ae57bb0f18c67af9d2eaa1dfef;p=sbcl.git diff --git a/src/runtime/mips-arch.c b/src/runtime/mips-arch.c index ac3b0ff..b33b118 100644 --- a/src/runtime/mips-arch.c +++ b/src/runtime/mips-arch.c @@ -264,18 +264,7 @@ arch_internal_error_arguments(os_context_t *context) boolean arch_pseudo_atomic_atomic(os_context_t *context) { - /* FIXME: this foreign_function_call_active test is dubious at - * best. If a foreign call is made in a pseudo atomic section - * (?) or more likely a pseudo atomic section is in a foreign - * call then an interrupt is executed immediately. Maybe it - * has to do with C code not maintaining pseudo atomic - * properly. MG - 2005-08-10 - * - * The foreign_function_call_active used to live at each call-site - * to arch_pseudo_atomic_atomic, but this seems clearer. - * --NS 2007-05-15 */ - return (!foreign_function_call_active) - && os_context_register(context, reg_ALLOC) & 1; + return os_context_register(context, reg_ALLOC) & 1; } void @@ -400,7 +389,7 @@ arch_handle_after_breakpoint(os_context_t *context) void arch_handle_single_step_trap(os_context_t *context, int trap) { - unsigned int code = *((u32 *)(*os_context_pc_addr(context))); + unsigned int code = *((u32 *)(os_context_pc(context))); int register_offset = code >> 11 & 0x1f; handle_single_step_trap(context, trap, register_offset); arch_skip_instruction(context); @@ -411,6 +400,9 @@ sigtrap_handler(int signal, siginfo_t *info, void *void_context) { os_context_t *context = arch_os_get_context(&void_context); unsigned int code = (os_context_insn(context) >> 6) & 0xfffff; +#ifdef LISP_FEATURE_LINUX + os_restore_fp_control(context); +#endif /* FIXME: This magic number is pseudo-atomic-trap from parms.lisp. * Genesis should provide the proper #define, but it specialcases * pseudo-atomic-trap to work around some oddity on SPARC. @@ -433,6 +425,9 @@ sigfpe_handler(int signal, siginfo_t *info, void *void_context) unsigned int op, rs, rt, rd, funct, dest = 32; int immed; int result; +#ifdef LISP_FEATURE_LINUX + os_restore_fp_control(context); +#endif op = (bad_inst >> 26) & 0x3f; rs = (bad_inst >> 21) & 0x1f; @@ -484,6 +479,22 @@ sigfpe_handler(int signal, siginfo_t *info, void *void_context) arch_skip_instruction(context); } +unsigned int +arch_get_fp_control(void) +{ + register unsigned int ret asm("$2"); + + __asm__ __volatile__ ("cfc1 %0, $31" : "=r" (ret)); + + return ret; +} + +void +arch_set_fp_control(unsigned int fp) +{ + __asm__ __volatile__ ("ctc1 %0, $31" :: "r" (fp)); +} + void arch_install_interrupt_handlers(void) {