|
|
1.1 ! root 1: /* $Header: /newbits/286_KERNEL/USRSRC/coh/RCS/sig.c,v 1.1 92/01/09 13:29:11 bin Exp Locker: bin $ */ ! 2: /* (lgl- ! 3: * The information contained herein is a trade secret of Mark Williams ! 4: * Company, and is confidential information. It is provided under a ! 5: * license agreement, and may be copied or disclosed only under the ! 6: * terms of that agreement. Any reproduction or disclosure of this ! 7: * material without the express written authorization of Mark Williams ! 8: * Company or persuant to the license agreement is unlawful. ! 9: * ! 10: * COHERENT Version 2.3.37 ! 11: * Copyright (c) 1982, 1983, 1984. ! 12: * An unpublished work by Mark Williams Company, Chicago. ! 13: * All rights reserved. ! 14: -lgl) */ ! 15: /* ! 16: * Coherent. ! 17: * Signal handling. ! 18: * ! 19: * $Log: sig.c,v $ ! 20: * Revision 1.1 92/01/09 13:29:11 bin ! 21: * Initial revision ! 22: * ! 23: * Revision 1.1 88/03/24 16:14:24 src ! 24: * Initial revision ! 25: * ! 26: * 87/11/05 Allan Cornish /usr/src/sys/coh/sig.c ! 27: * New seg struct now used to allow extended addressing. ! 28: * ! 29: * 86/11/19 Allan Cornish /usr/src/sys/coh/sig.c ! 30: * sigdump() initializes the (new) (IO).io_flag field to 0. ! 31: */ ! 32: #include <sys/coherent.h> ! 33: #include <errno.h> ! 34: #include <sys/ino.h> ! 35: #include <sys/inode.h> ! 36: #include <sys/io.h> ! 37: #include <sys/proc.h> ! 38: #include <sys/ptrace.h> ! 39: #include <sys/sched.h> ! 40: #include <sys/seg.h> ! 41: #include <signal.h> ! 42: #include <sys/uproc.h> ! 43: ! 44: /* ! 45: * Send a signal to the process `pp'. ! 46: */ ! 47: sendsig(sig, pp) ! 48: register unsigned sig; ! 49: register PROC *pp; ! 50: { ! 51: register sig_t f; ! 52: register int s; ! 53: ! 54: f = ((sig_t)1) << (sig-1); ! 55: if ((pp->p_isig&f) != 0) ! 56: return; ! 57: pp->p_ssig |= f; ! 58: if (pp->p_state == PSSLEEP) { ! 59: s = sphi(); ! 60: pp->p_lback->p_lforw = pp->p_lforw; ! 61: pp->p_lforw->p_lback = pp->p_lback; ! 62: addu(pp->p_cval, (utimer-pp->p_lctim)*CVCLOCK); ! 63: setrun(pp); ! 64: spl(s); ! 65: } ! 66: } ! 67: ! 68: /* ! 69: * Return signal number if we have a non ignored signal, else zero. ! 70: */ ! 71: nondsig() ! 72: { ! 73: register PROC *pp; ! 74: register sig_t mask; ! 75: register int signo; ! 76: ! 77: pp = SELF; ! 78: signo = 0; ! 79: pp->p_ssig &= ~pp->p_isig; ! 80: if (pp->p_ssig != 0) { ! 81: mask = (sig_t) 1; ! 82: signo += 1; ! 83: while ((pp->p_ssig&mask) == 0) { ! 84: mask <<= 1; ! 85: signo += 1; ! 86: } ! 87: } ! 88: return (signo); ! 89: } ! 90: ! 91: /* ! 92: * If we have a signal that isn't ignored, activate it. ! 93: */ ! 94: actvsig() ! 95: { ! 96: register int n; ! 97: register PROC *pp; ! 98: register int (*f)(); ! 99: ! 100: #if EBUG_VM > 0 ! 101: printf("actvsig "); /** DEBUG **/ ! 102: #endif ! 103: ! 104: if ((n = nondsig()) == 0) ! 105: return; ! 106: pp = SELF; ! 107: --n; ! 108: pp->p_ssig &= ~((sig_t)1<<n); ! 109: f = u.u_sfunc[n]; ! 110: u.u_signo = ++n; ! 111: if (f != SIG_DFL) { ! 112: msigint(n, f); ! 113: return; ! 114: } ! 115: msysgen(&u.u_sysgen); ! 116: if ((pp->p_flags&PFTRAC) != 0) { ! 117: pp->p_flags |= PFWAIT; ! 118: n = ptret(); ! 119: pp->p_flags &= ~(PFWAIT|PFSTOP); ! 120: if (n == 0) ! 121: return; ! 122: } ! 123: if (n>SIGKILL || n==SIGQUIT || n==SIGSYS) { ! 124: if (sigdump()) ! 125: n |= 0200; ! 126: } ! 127: pexit(n); ! 128: } ! 129: ! 130: /* ! 131: * Create a dump of ourselves onto the file `core'. ! 132: */ ! 133: sigdump() ! 134: { ! 135: register INODE *ip; ! 136: register SR *srp; ! 137: register SEG * sp; ! 138: register int n; ! 139: register paddr_t ssize; ! 140: ! 141: if ((SELF->p_flags&PFNDMP) != 0) ! 142: return (0); ! 143: u.u_io.io_seg = IOSYS; ! 144: u.u_io.io_flag = 0; ! 145: /* Make the core with the real owners */ ! 146: schizo(); ! 147: if (ftoi("core", 'c') != 0) { ! 148: schizo(); ! 149: return (0); ! 150: } ! 151: if ((ip=u.u_cdiri) == NULL) { ! 152: if ((ip=imake(IFREG|0644, 0)) == NULL) { ! 153: schizo(); ! 154: return (0); ! 155: } ! 156: } else { ! 157: if ((ip->i_mode&IFMT)!=IFREG ! 158: || iaccess(ip, IPW)==0 ! 159: || getment(ip->i_dev, 1)==NULL) { ! 160: idetach(ip); ! 161: schizo(); ! 162: return (0); ! 163: } ! 164: iclear(ip); ! 165: } ! 166: schizo(); ! 167: u.u_error = 0; ! 168: u.u_io.io_seek = 0; ! 169: for (srp=u.u_segl; u.u_error==0 && srp<&u.u_segl[NUSEG]; srp++) { ! 170: if ((sp = srp->sr_segp)==NULL || (srp->sr_flag&SRFDUMP)==0) ! 171: continue; ! 172: u.u_io.io_seg = IOPHY; ! 173: u.u_io.io_phys = sp->s_paddr; ! 174: u.u_io.io_flag = 0; ! 175: ssize = sp->s_size; ! 176: sp->s_lrefc++; ! 177: while (u.u_error == 0 && ssize != 0) { ! 178: n = ssize > SCHUNK ? SCHUNK : ssize; ! 179: u.u_io.io_ioc = n; ! 180: iwrite(ip, &u.u_io); ! 181: u.u_io.io_phys += (paddr_t)n; ! 182: ssize -= (paddr_t)n; ! 183: } ! 184: sp->s_lrefc--; ! 185: } ! 186: idetach(ip); ! 187: return (u.u_error==0); ! 188: } ! 189: ! 190: /* ! 191: * Send a ptrace command to the child. ! 192: */ ! 193: ptset(req, pid, addr, data) ! 194: unsigned req; ! 195: int *addr; ! 196: { ! 197: #ifdef TINY ! 198: sendsig(SELF, SIGSYS); ! 199: return (0); ! 200: #else ! 201: register PROC *pp; ! 202: ! 203: lock(pnxgate); ! 204: for (pp=procq.p_nforw; pp!=&procq; pp=pp->p_nforw) ! 205: if (pp->p_pid == pid) ! 206: break; ! 207: unlock(pnxgate); ! 208: if (pp==&procq || (pp->p_flags&PFSTOP)==0 || pp->p_ppid!=SELF->p_pid) { ! 209: u.u_error = ESRCH; ! 210: return; ! 211: } ! 212: lock(pts.pt_gate); ! 213: pts.pt_req = req; ! 214: pts.pt_pid = pid; ! 215: pts.pt_addr = addr; ! 216: pts.pt_data = data; ! 217: pts.pt_errs = 0; ! 218: pts.pt_rval = 0; ! 219: pts.pt_busy = 1; ! 220: wakeup((char *)&pts.pt_req); ! 221: while (pts.pt_busy != 0) ! 222: sleep((char *)&pts.pt_busy, CVPTSET, IVPTSET, SVPTSET); ! 223: u.u_error = pts.pt_errs; ! 224: unlock(pts.pt_gate); ! 225: return (pts.pt_rval); ! 226: #endif ! 227: } ! 228: ! 229: /* ! 230: * This routine is called when a child that is being traced receives a signal ! 231: * that is not caught or ignored. It follows up on any requests by the parent ! 232: * and returns when done. ! 233: */ ! 234: ptret() ! 235: { ! 236: #ifdef TINY ! 237: return (SIGKILL); ! 238: #else ! 239: register PROC *pp; ! 240: register PROC *pp1; ! 241: register int sign; ! 242: ! 243: pp = SELF; ! 244: next: ! 245: u.u_error = 0; ! 246: if (pp->p_ppid == 1) ! 247: return (SIGKILL); ! 248: sign = -1; ! 249: lock(pnxgate); ! 250: pp1 = &procq; ! 251: for (;;) { ! 252: if ((pp1=pp1->p_nforw) == &procq) { ! 253: sign = SIGKILL; ! 254: break; ! 255: } ! 256: if (pp1->p_pid != pp->p_ppid) ! 257: continue; ! 258: if (pp1->p_state == PSSLEEP) ! 259: wakeup((char *)pp1); ! 260: break; ! 261: } ! 262: unlock(pnxgate); ! 263: while (sign < 0) { ! 264: if (pts.pt_busy==0 || pp->p_pid!=pts.pt_pid) { ! 265: sleep((char *)&pts.pt_req, CVPTRET, IVPTRET, SVPTRET); ! 266: goto next; ! 267: } ! 268: switch (pts.pt_req) { ! 269: case 1: ! 270: pts.pt_rval = getuwi(pts.pt_addr); ! 271: break; ! 272: case 2: ! 273: pts.pt_rval = getuwd(pts.pt_addr); ! 274: break; ! 275: case 3: ! 276: if ((unsigned)pts.pt_addr < UPASIZE) ! 277: pts.pt_rval = *(int *)((char *)&u+pts.pt_addr); ! 278: else ! 279: u.u_error = EINVAL; ! 280: break; ! 281: case 4: ! 282: putuwi(pts.pt_addr, pts.pt_data); ! 283: break; ! 284: case 5: ! 285: putuwd(pts.pt_addr, pts.pt_data); ! 286: break; ! 287: case 6: ! 288: if (msetuof(pts.pt_addr, pts.pt_data) == 0) ! 289: u.u_error = EINVAL; ! 290: break; ! 291: case 7: ! 292: goto sig; ! 293: case 8: ! 294: sign = SIGKILL; ! 295: break; ! 296: case 9: ! 297: msigsin(); ! 298: sig: ! 299: if (pts.pt_data<0 || pts.pt_data>NSIG) { ! 300: u.u_error = EINVAL; ! 301: break; ! 302: } ! 303: sign = pts.pt_data; ! 304: if (pts.pt_addr != SIG_IGN) ! 305: msetppc((vaddr_t)pts.pt_addr); ! 306: break; ! 307: default: ! 308: u.u_error = EINVAL; ! 309: } ! 310: if ((pts.pt_errs=u.u_error) == EFAULT) ! 311: pts.pt_errs = EINVAL; ! 312: pts.pt_busy = 0; ! 313: wakeup((char *)&pts.pt_busy); ! 314: } ! 315: return (sign); ! 316: #endif ! 317: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.