1*85e7c9a4Smckusick /* 2*85e7c9a4Smckusick * Copyright (c) 1982, 1986 Regents of the University of California. 3*85e7c9a4Smckusick * All rights reserved. 4*85e7c9a4Smckusick * 5*85e7c9a4Smckusick * %sccs.include.redist.c% 6*85e7c9a4Smckusick * 7*85e7c9a4Smckusick * @(#)sys_machdep.c 7.1 (Berkeley) 05/08/90 8*85e7c9a4Smckusick */ 9*85e7c9a4Smckusick 10*85e7c9a4Smckusick #include "param.h" 11*85e7c9a4Smckusick #include "systm.h" 12*85e7c9a4Smckusick #include "user.h" 13*85e7c9a4Smckusick #include "ioctl.h" 14*85e7c9a4Smckusick #include "file.h" 15*85e7c9a4Smckusick #include "proc.h" 16*85e7c9a4Smckusick #include "uio.h" 17*85e7c9a4Smckusick #include "kernel.h" 18*85e7c9a4Smckusick #include "mtio.h" 19*85e7c9a4Smckusick #include "buf.h" 20*85e7c9a4Smckusick #include "trace.h" 21*85e7c9a4Smckusick 22*85e7c9a4Smckusick #include "pte.h" 23*85e7c9a4Smckusick 24*85e7c9a4Smckusick #ifdef TRACE 25*85e7c9a4Smckusick int nvualarm; 26*85e7c9a4Smckusick 27*85e7c9a4Smckusick vtrace() 28*85e7c9a4Smckusick { 29*85e7c9a4Smckusick register struct a { 30*85e7c9a4Smckusick int request; 31*85e7c9a4Smckusick int value; 32*85e7c9a4Smckusick } *uap; 33*85e7c9a4Smckusick int vdoualarm(); 34*85e7c9a4Smckusick 35*85e7c9a4Smckusick uap = (struct a *)u.u_ap; 36*85e7c9a4Smckusick switch (uap->request) { 37*85e7c9a4Smckusick 38*85e7c9a4Smckusick case VTR_DISABLE: /* disable a trace point */ 39*85e7c9a4Smckusick case VTR_ENABLE: /* enable a trace point */ 40*85e7c9a4Smckusick if (uap->value < 0 || uap->value >= TR_NFLAGS) 41*85e7c9a4Smckusick u.u_error = EINVAL; 42*85e7c9a4Smckusick else { 43*85e7c9a4Smckusick u.u_r.r_val1 = traceflags[uap->value]; 44*85e7c9a4Smckusick traceflags[uap->value] = uap->request; 45*85e7c9a4Smckusick } 46*85e7c9a4Smckusick break; 47*85e7c9a4Smckusick 48*85e7c9a4Smckusick case VTR_VALUE: /* return a trace point setting */ 49*85e7c9a4Smckusick if (uap->value < 0 || uap->value >= TR_NFLAGS) 50*85e7c9a4Smckusick u.u_error = EINVAL; 51*85e7c9a4Smckusick else 52*85e7c9a4Smckusick u.u_r.r_val1 = traceflags[uap->value]; 53*85e7c9a4Smckusick break; 54*85e7c9a4Smckusick 55*85e7c9a4Smckusick case VTR_UALARM: /* set a real-time ualarm, less than 1 min */ 56*85e7c9a4Smckusick if (uap->value <= 0 || uap->value > 60 * hz || 57*85e7c9a4Smckusick nvualarm > 5) 58*85e7c9a4Smckusick u.u_error = EINVAL; 59*85e7c9a4Smckusick else { 60*85e7c9a4Smckusick nvualarm++; 61*85e7c9a4Smckusick timeout(vdoualarm, (caddr_t)u.u_procp->p_pid, 62*85e7c9a4Smckusick uap->value); 63*85e7c9a4Smckusick } 64*85e7c9a4Smckusick break; 65*85e7c9a4Smckusick 66*85e7c9a4Smckusick case VTR_STAMP: 67*85e7c9a4Smckusick trace(TR_STAMP, uap->value, u.u_procp->p_pid); 68*85e7c9a4Smckusick break; 69*85e7c9a4Smckusick } 70*85e7c9a4Smckusick } 71*85e7c9a4Smckusick 72*85e7c9a4Smckusick vdoualarm(arg) 73*85e7c9a4Smckusick int arg; 74*85e7c9a4Smckusick { 75*85e7c9a4Smckusick register struct proc *p; 76*85e7c9a4Smckusick 77*85e7c9a4Smckusick p = pfind(arg); 78*85e7c9a4Smckusick if (p) 79*85e7c9a4Smckusick psignal(p, 16); 80*85e7c9a4Smckusick nvualarm--; 81*85e7c9a4Smckusick } 82*85e7c9a4Smckusick #endif 83