From 776a63c3479dd1678d8ee4ee2f03db48897c48a6 Mon Sep 17 00:00:00 2001 From: gwr Date: Fri, 24 Feb 1995 05:03:47 +0000 Subject: [PATCH] Call trap() for FP faults (T_FPEMULI*) --- sys/arch/sun3/sun3/trap.c | 86 ++++++++++++++++++++++++--------------- sys/arch/sun3/sun3/trap.s | 36 ++++++++-------- 2 files changed, 71 insertions(+), 51 deletions(-) diff --git a/sys/arch/sun3/sun3/trap.c b/sys/arch/sun3/sun3/trap.c index e8d53f766bbf..a321faa1f166 100644 --- a/sys/arch/sun3/sun3/trap.c +++ b/sys/arch/sun3/sun3/trap.c @@ -1,4 +1,4 @@ -/* $NetBSD: trap.c,v 1.39 1995/01/24 06:03:11 gwr Exp $ */ +/* $NetBSD: trap.c,v 1.40 1995/02/24 05:03:47 gwr Exp $ */ /* * Copyright (c) 1994 Gordon W. Ross @@ -81,6 +81,7 @@ extern int nsunos_sysent; extern struct sysent sysent[]; extern int nsysent; extern int fubail(), subail(); +extern int *nofault; /* XXX - put these in some header file? */ extern vm_offset_t virtual_avail; @@ -263,20 +264,29 @@ trap(type, code, v, frame) sig = SIGBUS; break; - case T_ILLINST|T_USER: /* illegal instruction fault */ - case T_PRIVINST|T_USER: /* privileged instruction fault */ - ucode = frame.f_format; /* XXX was ILL_PRIVIN_FAULT */ - sig = SIGILL; +#ifdef FPCOPROC + case T_COPERR: /* kernel coprocessor violation */ +#endif /* FPCOPROC */ + case T_FMTERR|T_USER: /* do all RTE errors come in as T_USER? */ + case T_FMTERR: /* ...just in case... */ + /* + * The user has most likely trashed the RTE or FP state info + * in the stack frame of a signal handler. + */ + printf("pid %d: kernel %s exception\n", p->p_pid, + type==T_COPERR ? "coprocessor" : "format"); + type |= T_USER; + p->p_sigacts->ps_sigact[SIGILL] = SIG_DFL; + /* temporary use of sig as mask */ + sig = sigmask(SIGILL); + p->p_sigignore &= ~sig; + p->p_sigcatch &= ~sig; + p->p_sigmask &= ~sig; + sig = SIGILL; /* back to normal */ + ucode = frame.f_format; break; - case T_ZERODIV|T_USER: /* Divide by zero */ - case T_CHKINST|T_USER: /* CHK instruction trap */ - case T_TRAPVINST|T_USER: /* TRAPV instruction trap */ - ucode = frame.f_format; /* XXX was FPE_INTOVF_TRAP */ - sig = SIGFPE; - break; - -#ifdef FPCOPROC +#ifdef FPCOPROC case T_COPERR|T_USER: /* user coprocessor violation */ /* What is a proper response here? */ ucode = 0; @@ -296,27 +306,37 @@ trap(type, code, v, frame) ucode = code; sig = SIGFPE; break; +#endif /* FPCOPROC */ - case T_COPERR: /* kernel coprocessor violation */ - /*FALLTHROUGH*/ -#endif - case T_FMTERR|T_USER: /* do all RTE errors come in as T_USER? */ - case T_FMTERR: /* ...just in case... */ - /* - * The user has most likely trashed the RTE or FP state info - * in the stack frame of a signal handler. - */ - printf("pid %d: kernel %s exception\n", p->p_pid, - type==T_COPERR ? "coprocessor" : "format"); - type |= T_USER; - p->p_sigacts->ps_sigact[SIGILL] = SIG_DFL; - /* temporary use of sig as mask */ - sig = sigmask(SIGILL); - p->p_sigignore &= ~sig; - p->p_sigcatch &= ~sig; - p->p_sigmask &= ~sig; - sig = SIGILL; /* back to normal */ - ucode = frame.f_format; /* XXX was ILL_RESAD_FAULT */ + case T_FPEMULI: /* FPU faults in supervisor mode */ + case T_FPEMULD: + if (nofault) /* Doing FPU probe? */ + longjmp(nofault); + goto dopanic; + + case T_FPEMULI|T_USER: /* unimplemented FP instuction */ + case T_FPEMULD|T_USER: /* unimplemented FP data type */ + /* XXX - Need to attach FPU emulator here. */ + /* XXX need to FSAVE */ + printf("pid %d(%s): unimplemented FP %s at %x (EA %x)\n", + p->p_pid, p->p_comm, + frame.f_format == 2 ? "instruction" : "data type", + frame.f_pc, frame.f_fmt2.f_iaddr); + /* XXX need to FRESTORE */ + sig = SIGFPE; + break; + + case T_ILLINST|T_USER: /* illegal instruction fault */ + case T_PRIVINST|T_USER: /* privileged instruction fault */ + ucode = frame.f_format; + sig = SIGILL; + break; + + case T_ZERODIV|T_USER: /* Divide by zero */ + case T_CHKINST|T_USER: /* CHK instruction trap */ + case T_TRAPVINST|T_USER: /* TRAPV instruction trap */ + ucode = frame.f_format; + sig = SIGFPE; break; /* diff --git a/sys/arch/sun3/sun3/trap.s b/sys/arch/sun3/sun3/trap.s index cd046c8a48cb..d77b1a42481f 100644 --- a/sys/arch/sun3/sun3/trap.s +++ b/sys/arch/sun3/sun3/trap.s @@ -1,4 +1,4 @@ -/* $NetBSD: trap.s,v 1.11 1995/02/11 21:08:50 gwr Exp $ */ +/* $NetBSD: trap.s,v 1.12 1995/02/24 05:03:49 gwr Exp $ */ /* * Copyright (c) 1994 Gordon W. Ross @@ -44,20 +44,17 @@ * locore.s,v 1.2 1993/05/22 07:57:30 cgd Exp */ + .text + + .globl _buserr, _addrerr, _illinst, _zerodiv, _chkinst + .globl _trapvinst, _privinst, _trace, _badtrap, _fmterr + .globl _trap0, _trap1, _trap2, _trap12, _trap15 + .globl _coperr, _fpfline, _fpunsupp + /* * Trap/interrupt vector routines */ -/* the buserr/addrerr won't work on a sun3. in particular more interpretation - * of the memory error register is necessary - */ - -.text -.globl _buserr, _addrerr, _illinst, _zerodiv, _chkinst, _trapvinst -.globl _privinst, _trace, _fpfline, _badtrap, _coperr, _fmterr, _trap0, -.globl _trap1, _trap2, _trap12, _trap15 -.globl _fpunsupp - .globl _trap, _nofault, _longjmp _buserr: tstl _nofault | device probe? @@ -161,17 +158,20 @@ Lstkadj: movl sp@,sp | and our SP jra rei | all done -/* unchanged from hp300 */ - - /* * FP exceptions. */ _fpfline: - jra _illinst + clrl sp@- | stack adjust count + moveml #0xFFFF,sp@- | save registers + moveq #T_FPEMULI,d0 | denote as FP emulation trap + jra fault | do it _fpunsupp: - jra _illinst + clrl sp@- | stack adjust count + moveml #0xFFFF,sp@- | save registers + moveq #T_FPEMULD,d0 | denote as FP emulation trap + jra fault | do it /* * Handles all other FP coprocessor exceptions. @@ -179,7 +179,7 @@ _fpunsupp: * and may cause signal delivery, we need to test for stack adjustment * after the trap call. */ -.globl _fpfault + .globl _fpfault _fpfault: #ifdef FPCOPROC clrl sp@- | stack adjust count @@ -302,7 +302,7 @@ _trap0: movl a0,usp | user SP moveml sp@+,#0x7FFF | restore most registers addql #8,sp | pop SP and stack adjust - jra rei | all done + rte /* * Routines for traps 1 and 2. The meaning of the two traps depends