/* This may be complete rubbish, as (at least for traps) pc points
* _after_ the instruction that caused us to be here anyway.
*/
- ((char*)*os_context_pc_addr(context)) +=4; }
+ char **pcptr;
+ pcptr = (char **) os_context_pc_addr(context);
+ *pcptr += 4;
+}
unsigned char *
arch_internal_error_arguments(os_context_t *context)
boolean
arch_pseudo_atomic_atomic(os_context_t *context)
{
- return ((*os_context_register_addr(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_addr(context,reg_ALLOC)) & 1);
}
void arch_set_pseudo_atomic_interrupted(os_context_t *context)
(int)handle_fun_end_breakpoint(context);
}
+void
+arch_handle_single_step_trap(os_context_t *context, int trap)
+{
+ unsigned int code = *((u32 *) (*os_context_pc_addr(context)));
+ int register_offset = code >> 5 & 0x1f;
+ handle_single_step_trap(context, trap, register_offset);
+ arch_skip_instruction(context);
+}
+
static void
sigtrap_handler(int signal, siginfo_t *siginfo, os_context_t *context)
{
unsigned int code;
-#ifdef LISP_FEATURE_LINUX
- os_restore_fp_control(context);
-#endif
/* this is different from how CMUCL does it. CMUCL used "call_pal
* PAL_gentrap", which doesn't do anything on Linux (unless NL0