X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fmips-arch.c;h=b33b1185e24c2095eef0dc1c5577972a0c7022cb;hb=aab81dccfb1a311eac523a855004a3669340aca6;hp=490d5dc82b00e40cace51dee8dd11ffe6cd6e597;hpb=e7c25fb39ec32a3084d35b04216e49e8dbc95733;p=sbcl.git diff --git a/src/runtime/mips-arch.c b/src/runtime/mips-arch.c index 490d5dc..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 @@ -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) {