Catch `Unimplemented Flush' traps.
This commit is contained in:
parent
231a906c71
commit
565d3768e5
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: trap.h,v 1.10 1996/12/01 23:19:00 pk Exp $ */
|
/* $NetBSD: trap.h,v 1.11 1999/01/20 00:15:08 pk Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1992, 1993
|
* Copyright (c) 1992, 1993
|
||||||
@ -88,7 +88,7 @@
|
|||||||
/* 0x20 unused */
|
/* 0x20 unused */
|
||||||
/* through 0x23 unused */
|
/* through 0x23 unused */
|
||||||
#define T_CPDISABLED 0x24 /* (5) coprocessor instr while disabled */
|
#define T_CPDISABLED 0x24 /* (5) coprocessor instr while disabled */
|
||||||
/* 0x25 unused */
|
#define T_UNIMPLFLUSH 0x25 /* Unimplemented FLUSH */
|
||||||
/* through 0x27 unused */
|
/* through 0x27 unused */
|
||||||
#define T_CPEXCEPTION 0x28 /* (9) coprocessor exception */
|
#define T_CPEXCEPTION 0x28 /* (9) coprocessor exception */
|
||||||
/* 0x29 unused */
|
/* 0x29 unused */
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: trap.c,v 1.78 1998/12/14 16:18:46 kleink Exp $ */
|
/* $NetBSD: trap.c,v 1.79 1999/01/20 00:15:07 pk Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1996
|
* Copyright (c) 1996
|
||||||
@ -374,6 +374,7 @@ badtrap:
|
|||||||
break; /* the work is all in userret() */
|
break; /* the work is all in userret() */
|
||||||
|
|
||||||
case T_ILLINST:
|
case T_ILLINST:
|
||||||
|
case T_UNIMPLFLUSH:
|
||||||
if ((n = emulinstr(pc, tf)) == 0) {
|
if ((n = emulinstr(pc, tf)) == 0) {
|
||||||
ADVANCE;
|
ADVANCE;
|
||||||
break;
|
break;
|
||||||
@ -415,8 +416,37 @@ badtrap:
|
|||||||
fpu_cleanup(p, fs);
|
fpu_cleanup(p, fs);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#if NEW
|
||||||
|
simple_lock(&cpuinfo.fplock);
|
||||||
if (cpuinfo.fpproc != p) { /* we do not have it */
|
if (cpuinfo.fpproc != p) { /* we do not have it */
|
||||||
int mid = p->p_md.md_fpumid;
|
if (cpuinfo.fpproc != NULL) { /* someone else had it*/
|
||||||
|
savefpstate(cpuinfo.fpproc->p_md.md_fpstate);
|
||||||
|
cpuinfo.fpproc->p_md.md_fpumid = -1;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* On MP machines, some of the other FPUs might
|
||||||
|
* still have our state. Tell the owning processor
|
||||||
|
* to save the process' FPU state.
|
||||||
|
*/
|
||||||
|
cpi = p->p_md.md_fpumid;
|
||||||
|
if (cpi != NULL) {
|
||||||
|
if (cpi->mid == cpuinfo.mid)
|
||||||
|
panic("FPU on module %d\n", mid);
|
||||||
|
simple_lock(&cpi->fplock);
|
||||||
|
simple_lock(&cpi->msg.lock);
|
||||||
|
cpi->msg.tag = XPMSG_SAVEFPU;
|
||||||
|
raise_ipi(cpi);
|
||||||
|
}
|
||||||
|
loadfpstate(fs);
|
||||||
|
cpuinfo.fpproc = p; /* now we do have it */
|
||||||
|
p->p_md.md_fpumid = cpuinfo.mid;
|
||||||
|
}
|
||||||
|
simple_unlock(&cpuinfo.fplock);
|
||||||
|
#else
|
||||||
|
if (cpuinfo.fpproc != p) { /* we do not have it */
|
||||||
|
int mid;
|
||||||
|
|
||||||
|
mid = p->p_md.md_fpumid;
|
||||||
if (cpuinfo.fpproc != NULL) { /* someone else had it*/
|
if (cpuinfo.fpproc != NULL) { /* someone else had it*/
|
||||||
savefpstate(cpuinfo.fpproc->p_md.md_fpstate);
|
savefpstate(cpuinfo.fpproc->p_md.md_fpstate);
|
||||||
cpuinfo.fpproc->p_md.md_fpumid = -1;
|
cpuinfo.fpproc->p_md.md_fpumid = -1;
|
||||||
@ -437,6 +467,7 @@ badtrap:
|
|||||||
cpuinfo.fpproc = p; /* now we do have it */
|
cpuinfo.fpproc = p; /* now we do have it */
|
||||||
p->p_md.md_fpumid = cpuinfo.mid;
|
p->p_md.md_fpumid = cpuinfo.mid;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
tf->tf_psr |= PSR_EF;
|
tf->tf_psr |= PSR_EF;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user