void
arch_skip_instruction(os_context_t *context)
{
- ((char*)*os_context_pc_addr(context)) +=4;
+ char** pcptr;
+ pcptr = (char**) os_context_pc_addr(context);
+ *pcptr += 4;
}
unsigned char *
sigtrap_handler(int signal, siginfo_t *siginfo, os_context_t *context)
{
u32 code;
- sigset_t *mask;
#ifdef LISP_FEATURE_LINUX
os_restore_fp_control(context);
#endif
- mask=(os_context_sigmask_addr(context));
- sigsetmask(mask);
code=*((u32 *)(*os_context_pc_addr(context)));
if (code == ((3 << 26) | (16 << 21) | (reg_ALLOC << 16))) {
/* twlti reg_ALLOC,0 - check for deferred interrupt */
break;
case trap_PendingInterrupt:
- /* when do we run this branch instead of the twlti code above? */
+ /* This is supposed run after WITHOUT-INTERRUPTS if there
+ * were pending signals. */
arch_skip_instruction(context);
interrupt_handle_pending(context);
break;
break;
}
#ifdef LISP_FEATURE_DARWIN
- sigreturn(context);
+ DARWIN_FIX_CONTEXT(context);
#endif
return;
}
if (((code >> 26) == 3) && (((code >> 21) & 31) == 24)) {
interrupt_internal_error(signal, code, context, 0);
#ifdef LISP_FEATURE_DARWIN
- sigreturn(context);
+ DARWIN_FIX_CONTEXT(context);
#endif
return;
}
interrupt_handle_now(signal, code, context);
#ifdef LISP_FEATURE_DARWIN
/* Work around G5 bug */
- sigreturn(context);
+ DARWIN_FIX_CONTEXT(context);
#endif
}