diff --git a/ldb/interrupt.c b/ldb/interrupt.c index 3e43ba52c2d0c64d828cf6949a29cf5035b76b2d..bbaf98c6e772dd99d30cd7dd0455acf1296c2325 100644 --- a/ldb/interrupt.c +++ b/ldb/interrupt.c @@ -1,4 +1,4 @@ -/* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/ldb/Attic/interrupt.c,v 1.4 1990/05/24 17:46:09 wlott Exp $ */ +/* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/ldb/Attic/interrupt.c,v 1.5 1990/05/26 01:20:17 ch Exp $ */ /* Interrupt handing magic. */ @@ -124,29 +124,6 @@ struct sigcontext *context; handle_now(signal, code, context); } -static segv_handler(signal, code, context) -int signal, code; -struct sigcontext *context; -{ -#if 0 - if (bogus_page == guard_page) { - unprotext(guard_page); - if ((!foreign_function_call_active) && - (context->sc_regs[FLAGS] & (1<<flag_Atomic))) { - pending_signal = signal; - pending_code = code; - pending_mask = context->sc_mask; - context->sc_mask |= BLOCKABLE; - context->sc_regs[FLAGS] |= (1<<flag_Interrupted); - } - /* ### Fix this */ - SetSymbolValue(GC_TRIGGER_HIT, T); - } - else -#endif - handle_now(signal, code, context); -} - static trap_handler(signal, code, context) int signal, code; struct sigcontext *context; @@ -162,73 +139,6 @@ struct sigcontext *context; handle_now(signal, code, context); } -#define FIXNUM_VALUE(lispobj) (((int)lispobj)>>2) - -static boolean handle_integer_overflow(context) -struct sigcontext *context; -{ - unsigned long bad_inst; - unsigned int op, rs, rt, rd, funct, dest; - int immed; - long result; - - if (context->sc_cause & CAUSE_BD) - bad_inst = *(unsigned long *)(context->sc_pc + 4); - else - bad_inst = *(unsigned long *)(context->sc_pc); - - op = (bad_inst >> 26) & 0x3f; - rs = (bad_inst >> 21) & 0x1f; - rt = (bad_inst >> 15) & 0x1f; - rd = (bad_inst >> 10) & 0x1f; - funct = bad_inst & 0x3f; - immed = (((int)(bad_inst & 0xffff)) << 16) >> 16; - - switch (op) { - case 0x0: /* SPECIAL */ - switch (funct) { - case 0x20: /* ADD */ - result = FIXNUM_VALUE(context->sc_regs[rs]) + FIXNUM_VALUE(context->sc_regs[rt]); - dest = rd; - break; - - case 0x22: /* SUB */ - result = FIXNUM_VALUE(context->sc_regs[rs]) - FIXNUM_VALUE(context->sc_regs[rt]); - dest = rd; - break; - - default: - return FALSE; - } - - case 0x8: /* ADDI */ - result = FIXNUM_VALUE(context->sc_regs[rs]) + (immed>>2); - dest = rt; - break; - - default: - return FALSE; - } - - context->sc_regs[dest] = alloc_number(result); - - /* Skip the offending instruction */ - if (context->sc_cause & CAUSE_BD) - emulate_branch(context, *(unsigned long *)context->sc_pc); - else - context->sc_pc += 4; - - return TRUE; -} - -static fpe_handler(signal, code, context) -int signal, code; -struct sigcontext *context; -{ - if ((context->sc_cause & CAUSE_EXCMASK) != EXC_OV || !handle_integer_overflow(context)) - handle_now(signal, code, context); -} - void install_handler(signal, handler) int signal; union interrupt_handler handler; @@ -237,12 +147,8 @@ union interrupt_handler handler; if (sigmask(signal)&BLOCKABLE) sv.sv_handler = maybe_now_maybe_later; - else if (signal == SIGSEGV) - sv.sv_handler = segv_handler; else if (signal == SIGTRAP) sv.sv_handler = trap_handler; - else if (signal == SIGFPE) - sv.sv_handler = fpe_handler; else sv.sv_handler = handle_now; sv.sv_mask = BLOCKABLE;