Skip to content
Snippets Groups Projects
Commit 1f74edc2 authored by ch's avatar ch
Browse files

Made all the interrupts go through the standard mechanism (except for

SIGTRAP).  The SIGFPE and future SIGSEGV handlers were moved to ./test.c
parent cf764bba
No related branches found
No related tags found
No related merge requests found
/* $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. */ /* Interrupt handing magic. */
...@@ -124,29 +124,6 @@ struct sigcontext *context; ...@@ -124,29 +124,6 @@ struct sigcontext *context;
handle_now(signal, code, 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) static trap_handler(signal, code, context)
int signal, code; int signal, code;
struct sigcontext *context; struct sigcontext *context;
...@@ -162,73 +139,6 @@ struct sigcontext *context; ...@@ -162,73 +139,6 @@ struct sigcontext *context;
handle_now(signal, code, 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) void install_handler(signal, handler)
int signal; int signal;
union interrupt_handler handler; union interrupt_handler handler;
...@@ -237,12 +147,8 @@ union interrupt_handler handler; ...@@ -237,12 +147,8 @@ union interrupt_handler handler;
if (sigmask(signal)&BLOCKABLE) if (sigmask(signal)&BLOCKABLE)
sv.sv_handler = maybe_now_maybe_later; sv.sv_handler = maybe_now_maybe_later;
else if (signal == SIGSEGV)
sv.sv_handler = segv_handler;
else if (signal == SIGTRAP) else if (signal == SIGTRAP)
sv.sv_handler = trap_handler; sv.sv_handler = trap_handler;
else if (signal == SIGFPE)
sv.sv_handler = fpe_handler;
else else
sv.sv_handler = handle_now; sv.sv_handler = handle_now;
sv.sv_mask = BLOCKABLE; sv.sv_mask = BLOCKABLE;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment