X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fmips-arch.c;h=490d5dc82b00e40cace51dee8dd11ffe6cd6e597;hb=3f79185595180cabcb53c05c88e6facc0a60cdb7;hp=6da857948cd33a2a50a5b8f2389a13d6871e051e;hpb=5c119c97cb1504dfdd5260fe8bcf1b8ac89ea3aa;p=sbcl.git diff --git a/src/runtime/mips-arch.c b/src/runtime/mips-arch.c index 6da8579..490d5dc 100644 --- a/src/runtime/mips-arch.c +++ b/src/runtime/mips-arch.c @@ -264,7 +264,18 @@ arch_internal_error_arguments(os_context_t *context) boolean arch_pseudo_atomic_atomic(os_context_t *context) { - return os_context_register(context, reg_ALLOC) & 1; + /* 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; } void @@ -389,7 +400,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);