X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fruntime%2Fmips-arch.c;h=72ac15afb7120b7a04eaaff05e70a610f6e1c545;hb=dd54f9e004a0a83d1328e94648f48dcc27e0be5b;hp=ac3b0ffe498a9e6d9f53858393e775eab95f6566;hpb=b5c69cfe906a31ae57bb0f18c67af9d2eaa1dfef;p=sbcl.git diff --git a/src/runtime/mips-arch.c b/src/runtime/mips-arch.c index ac3b0ff..72ac15a 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,16 +389,15 @@ 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); } static 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 = arch_os_get_context(&void_context); unsigned int code = (os_context_insn(context) >> 6) & 0xfffff; /* FIXME: This magic number is pseudo-atomic-trap from parms.lisp. * Genesis should provide the proper #define, but it specialcases @@ -426,9 +414,8 @@ sigtrap_handler(int signal, siginfo_t *info, void *void_context) #define FIXNUM_VALUE(lispobj) (((int)lispobj) >> N_FIXNUM_TAG_BITS) static void -sigfpe_handler(int signal, siginfo_t *info, void *void_context) +sigfpe_handler(int signal, siginfo_t *info, os_context_t *context) { - os_context_t *context = arch_os_get_context(&void_context); unsigned int bad_inst = os_context_insn(context); unsigned int op, rs, rt, rd, funct, dest = 32; int immed; @@ -484,6 +471,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) {