trapsignal/sendsig type/sigval changes
authorderaadt <deraadt@openbsd.org>
Sat, 1 Feb 1997 23:05:05 +0000 (23:05 +0000)
committerderaadt <deraadt@openbsd.org>
Sat, 1 Feb 1997 23:05:05 +0000 (23:05 +0000)
sys/arch/sparc/fpu/fpu.c
sys/arch/sparc/include/svr4_machdep.h
sys/arch/sparc/sparc/machdep.c
sys/arch/sparc/sparc/svr4_machdep.c
sys/arch/sparc/sparc/trap.c

index 3b1c8a0..ea82f00 100644 (file)
@@ -89,6 +89,14 @@ static u_char fpu_codes[] = {
        X16(FPE_FLTOPERR_TRAP)
 };
 
+static int fpu_types[] = {
+       FPE_FLTRES,
+       FPE_FLTDIV,
+       FPE_FLTUND,
+       FPE_FLTOVF,
+       FPE_FLTINV,
+};
+
 /*
  * The FPU gave us an exception.  Clean up the mess.  Note that the
  * fp queue can only have FPops in it, never load/store FP registers
@@ -114,7 +122,7 @@ fpu_cleanup(p, fs)
                /* XXX missing trap address! */
                if ((i = fsr & FSR_CX) == 0)
                        panic("fpu ieee trap, but no exception");
-               trapsignal(p, SIGFPE, fpu_codes[i - 1], 0);
+               trapsignal(p, SIGFPE, fpu_codes[i - 1], fpu_types[i - i], 0);
                break;          /* XXX should return, but queue remains */
 
        case FSR_TT_UNFIN:
@@ -131,7 +139,7 @@ fpu_cleanup(p, fs)
                log(LOG_ERR, "fpu hardware error (%s[%d])\n",
                    p->p_comm, p->p_pid);
                uprintf("%s[%d]: fpu hardware error\n", p->p_comm, p->p_pid);
-               trapsignal(p, SIGFPE, -1, 0);   /* ??? */
+               trapsignal(p, SIGFPE, -1, FPE_FLTINV, 0);       /* ??? */
                goto out;
 
        default:
@@ -155,11 +163,12 @@ fpu_cleanup(p, fs)
 
                case FPE:
                        trapsignal(p, SIGFPE,
-                           fpu_codes[(fs->fs_fsr & FSR_CX) - 1], 0);
+                           fpu_codes[(fs->fs_fsr & FSR_CX) - 1],
+                           fpu_types[(fs->fs_fsr & FSR_CX) - 1], 0);
                        break;
 
                case NOTFPU:
-                       trapsignal(p, SIGILL, 0, 0);    /* ??? code?  */
+                       trapsignal(p, SIGILL, 0, FPE_FLTINV, 0);
                        break;
 
                default:
index 2c716b3..7b1220e 100644 (file)
@@ -101,7 +101,7 @@ struct svr4_ucontext;
 void svr4_getcontext __P((struct proc *, struct svr4_ucontext *,
                          int, int));
 int svr4_setcontext __P((struct proc *p, struct svr4_ucontext *));
-void svr4_sendsig __P((sig_t, int, int, u_long, caddr_t));
+void svr4_sendsig __P((sig_t, int, int, u_long, int, union sigval));
 int svr4_trap __P((int, struct proc *));
 
 #endif /* !_SPARC_SVR4_MACHDEP_H_ */
index 0db30c9..0e4ba58 100644 (file)
@@ -427,7 +427,7 @@ struct sigframe {
        int     sf_xxx;                 /* placeholder */
 #endif
        union {
-               int     sfu_addr;       /* SunOS compat */
+               caddr_t sfu_addr;       /* SunOS compat */
                siginfo_t *sfu_sip;     /* native */
        } sf_u;
        struct  sigcontext sf_sc;       /* actual sigcontext */
@@ -463,11 +463,12 @@ cpu_sysctl(name, namelen, oldp, oldlenp, newp, newlen, p)
  * Send an interrupt to process.
  */
 void
-sendsig(catcher, sig, mask, code, addr)
+sendsig(catcher, sig, mask, code, type, val)
        sig_t catcher;
        int sig, mask;
        u_long code;
-       caddr_t addr;
+       int type;
+       union sigval val;
 {
        register struct proc *p = curproc;
        register struct sigacts *psp = p->p_sigacts;
@@ -513,7 +514,7 @@ sendsig(catcher, sig, mask, code, addr)
 #ifdef COMPAT_SUNOS
        if (p->p_emul == &emul_sunos) {
                sf.sf_scp = &fp->sf_sc;
-               sf.sf_u.sfu_addr = (u_int)addr;
+               sf.sf_u.sfu_addr = val.sival_ptr;
        }
 #endif
 
@@ -531,17 +532,7 @@ sendsig(catcher, sig, mask, code, addr)
 
        if (psp->ps_siginfo & sigmask(sig)) {
                sf.sf_u.sfu_sip = &fp->sf_si;
-               initsiginfo(sf.sf_u.sfu_sip, sig);
-               fixsiginfo(sf.sf_u.sfu_sip, sig, code, addr);
-#if 0
-               if (sig == SIGSEGV) {
-                       /* try to be more specific about read or write */
-                       if (tf->tf_err & PGEX_W)
-                               sf.sf_si.si_code = SEGV_ACCERR;
-                       else
-                               sf.sf_si.si_code = SEGV_MAPERR;
-               }
-#endif
+               initsiginfo(sf.sf_u.sfu_sip, sig, code, type, val);
        }
 
        /*
@@ -652,77 +643,6 @@ sys_sigreturn(p, v, retval)
        return (EJUSTRETURN);
 }
 
-void
-fixsiginfo(si, sig, code, addr)
-       siginfo_t *si;
-       int sig;
-       u_long code;
-       caddr_t addr;
-{
-       si->si_addr = addr;
-
-#if 0
-       switch (code) {
-       case T_PRIVINFLT:
-               si->si_code = ILL_PRVOPC;
-               si->si_trapno = T_PRIVINFLT;
-               break;
-       case T_BPTFLT:
-               si->si_code = TRAP_BRKPT;
-               si->si_trapno = T_BPTFLT;
-               break;
-       case T_ARITHTRAP:
-               si->si_code = FPE_INTOVF;
-               si->si_trapno = T_DIVIDE;
-               break;
-       case T_PROTFLT:
-               si->si_code = SEGV_ACCERR;
-               si->si_trapno = T_PROTFLT;
-               break;
-       case T_TRCTRAP:
-               si->si_code = TRAP_TRACE;
-               si->si_trapno = T_TRCTRAP;
-               break;
-       case T_PAGEFLT:
-               si->si_code = SEGV_ACCERR;
-               si->si_trapno = T_PAGEFLT;
-               break;
-       case T_ALIGNFLT:
-               si->si_code = BUS_ADRALN;
-               si->si_trapno = T_ALIGNFLT;
-               break;
-       case T_DIVIDE:
-               si->si_code = FPE_FLTDIV;
-               si->si_trapno = T_DIVIDE;
-               break;
-       case T_OFLOW:
-               si->si_code = FPE_FLTOVF;
-               si->si_trapno = T_DIVIDE;
-               break;
-       case T_BOUND:
-               si->si_code = FPE_FLTSUB;
-               si->si_trapno = T_BOUND;
-               break;
-       case T_DNA:
-               si->si_code = FPE_FLTINV;
-               si->si_trapno = T_DNA;
-               break;
-       case T_FPOPFLT:
-               si->si_code = FPE_FLTINV;
-               si->si_trapno = T_FPOPFLT;
-               break;
-       case T_SEGNPFLT:
-               si->si_code = SEGV_MAPERR;
-               si->si_trapno = T_SEGNPFLT;
-               break;
-       case T_STKFLT:
-               si->si_code = ILL_BADSTK;
-               si->si_trapno = T_STKFLT;
-               break;
-       }
-#endif
-}
-
 int    waittime = -1;
 
 void
index f36f599..8593624 100644 (file)
@@ -462,11 +462,12 @@ svr4_getsiginfo(si, sig, code, addr)
  * will return to the user pc, psl.
  */
 void
-svr4_sendsig(catcher, sig, mask, code, addr)
+svr4_sendsig(catcher, sig, mask, code, type, val)
        sig_t catcher;
        int sig, mask;
        u_long code;
-       caddr_t addr;
+       int type;
+       union sigval val;
 {
        register struct proc *p = curproc;
        register struct trapframe *tf;
@@ -500,7 +501,7 @@ svr4_sendsig(catcher, sig, mask, code, addr)
        /*
         * Build the argument list for the signal handler.
         */
-       svr4_getsiginfo(&frame.sf_si, sig, code, addr);
+       svr4_getsiginfo(&frame.sf_si, sig, code, val.sival_ptr);
        svr4_getcontext(p, &frame.sf_uc, mask, oonstack);
        frame.sf_signum = frame.sf_si.svr4_si_signo;
        frame.sf_sip = &fp->sf_si;
index a2866f1..19a328d 100644 (file)
@@ -337,7 +337,7 @@ badtrap:
                /* ... but leave it in until we find anything */
                printf("%s[%d]: unimplemented software trap 0x%x\n",
                    p->p_comm, p->p_pid, type);
-               trapsignal(p, SIGILL, type, (caddr_t)pc);
+               trapsignal(p, SIGILL, type, ILL_ILLOPC, (caddr_t)pc);
                break;
 
 #ifdef COMPAT_SVR4
@@ -357,11 +357,11 @@ badtrap:
                break;  /* the work is all in userret() */
 
        case T_ILLINST:
-               trapsignal(p, SIGILL, 0, (caddr_t)pc);  /* XXX code?? */
+               trapsignal(p, SIGILL, 0, ILL_ILLOPC, (caddr_t)pc);
                break;
 
        case T_PRIVINST:
-               trapsignal(p, SIGILL, 0, (caddr_t)pc);  /* XXX code?? */
+               trapsignal(p, SIGILL, 0, ILL_PRVOPC, (caddr_t)pc);
                break;
 
        case T_FPDISABLED: {
@@ -380,7 +380,7 @@ badtrap:
                        fpu_emulate(p, tf, fs);
                        break;
 #else
-                       trapsignal(p, SIGFPE, 0, (caddr_t)pc);  /* XXX code?? */
+                       trapsignal(p, SIGFPE, 0, FPE_FLTINV, (caddr_t)pc);
                        break;
 #endif
                }
@@ -465,7 +465,7 @@ badtrap:
                break;
 
        case T_ALIGN:
-               trapsignal(p, SIGBUS, 0, (caddr_t)pc);  /* XXX code?? */
+               trapsignal(p, SIGBUS, 0, BUS_ADRALN, (caddr_t)pc);
                break;
 
        case T_FPE:
@@ -490,21 +490,21 @@ badtrap:
                break;
 
        case T_TAGOF:
-               trapsignal(p, SIGEMT, 0, (caddr_t)pc);  /* XXX code?? */
+               trapsignal(p, SIGEMT, 0, EMT_TAGOVF, (caddr_t)pc);
                break;
 
        case T_CPDISABLED:
                uprintf("coprocessor instruction\n");   /* XXX */
-               trapsignal(p, SIGILL, 0, (caddr_t)pc);  /* XXX code?? */
+               trapsignal(p, SIGILL, 0, FPE_FLTINV, (caddr_t)pc);
                break;
 
        case T_BREAKPOINT:
-               trapsignal(p, SIGTRAP, 0, (caddr_t)pc);
+               trapsignal(p, SIGTRAP, 0, TRAP_BRKPT, (caddr_t)pc);
                break;
 
        case T_DIV0:
                ADVANCE;
-               trapsignal(p, SIGFPE, FPE_INTDIV_TRAP, (caddr_t)pc);
+               trapsignal(p, SIGFPE, 0, FPE_INTDIV_TRAP, (caddr_t)pc);
                break;
 
        case T_FLUSHWIN:
@@ -524,7 +524,7 @@ badtrap:
        case T_RANGECHECK:
                uprintf("T_RANGECHECK\n");      /* XXX */
                ADVANCE;
-               trapsignal(p, SIGILL, 0, (caddr_t)pc);  /* XXX code?? */
+               trapsignal(p, SIGILL, 0, ILL_ILLOPN, (caddr_t)pc);
                break;
 
        case T_FIXALIGN:
@@ -535,7 +535,7 @@ badtrap:
        case T_INTOF:
                uprintf("T_INTOF\n");           /* XXX */
                ADVANCE;
-               trapsignal(p, SIGFPE, FPE_INTOVF_TRAP, (caddr_t)pc);
+               trapsignal(p, SIGFPE, FPE_INTOVF_TRAP, FPE_INTOVF, (caddr_t)pc);
                break;
        }
        userret(p, pc, sticks);
@@ -743,7 +743,7 @@ kfault:
                        tf->tf_npc = onfault + 4;
                        return;
                }
-               trapsignal(p, SIGSEGV, (u_int)v, (caddr_t)v);
+               trapsignal(p, SIGSEGV, (u_int)v, SEGV_MAPERR, (caddr_t)v);
        }
 out:
        if ((psr & PSR_PS) == 0) {
@@ -1015,7 +1015,7 @@ kfault:
                        tf->tf_npc = onfault + 4;
                        return;
                }
-               trapsignal(p, SIGSEGV, (u_int)sfva, (caddr_t)sfva);
+               trapsignal(p, SIGSEGV, (u_int)sfva, SEGV_MAPERR, (caddr_t)sfva);
        }
 out:
        if ((psr & PSR_PS) == 0) {