1 /* 2 * Copyright (c) 1982, 1986 Regents of the University of California. 3 * All rights reserved. The Berkeley software License Agreement 4 * specifies the terms and conditions for redistribution. 5 * 6 * @(#)sys_machdep.c 7.8 (Berkeley) 07/12/92 7 */ 8 9 #include "sys/param.h" 10 #include "sys/systm.h" 11 #include "sys/user.h" 12 #include "sys/ioctl.h" 13 #include "sys/file.h" 14 #include "sys/proc.h" 15 #include "sys/kernel.h" 16 #include "sys/mtio.h" 17 #include "sys/buf.h" 18 #include "sys/trace.h" 19 20 #include "../include/pte.h" 21 #include "../uba/ubareg.h" 22 #include "../uba/ubavar.h" 23 24 struct resuba_args { 25 int value; 26 }; 27 /* ARGSUSED */ 28 resuba(p, uap, retval) 29 struct proc *p; 30 struct resuba_args *uap; 31 int *retval; 32 { 33 int error; 34 35 if (error = suser(u.u_cred, &u.u_acflag)) 36 return (error); 37 if (uap->value < numuba) 38 ubareset(uap->value); 39 return (0); 40 } 41 42 #ifdef TRACE 43 int nvualarm; 44 45 struct vtrace_args { 46 int request; 47 int value; 48 }; 49 vtrace(p, uap, retval) 50 struct proc *p; 51 register struct vtrace_args *uap; 52 int *retval; 53 { 54 int vdoualarm(); 55 56 switch (uap->request) { 57 58 case VTR_DISABLE: /* disable a trace point */ 59 case VTR_ENABLE: /* enable a trace point */ 60 if (uap->value < 0 || uap->value >= TR_NFLAGS) 61 return (EINVAL); 62 *retval = traceflags[uap->value]; 63 traceflags[uap->value] = uap->request; 64 break; 65 66 case VTR_VALUE: /* return a trace point setting */ 67 if (uap->value < 0 || uap->value >= TR_NFLAGS) 68 return (EINVAL); 69 *retval = traceflags[uap->value]; 70 break; 71 72 case VTR_UALARM: /* set a real-time ualarm, less than 1 min */ 73 if (uap->value <= 0 || uap->value > 60 * hz || nvualarm > 5) 74 return (EINVAL); 75 nvualarm++; 76 timeout(vdoualarm, (caddr_t)p->p_pid, uap->value); 77 break; 78 79 case VTR_STAMP: 80 trace(TR_STAMP, uap->value, p->p_pid); 81 break; 82 } 83 return (0); 84 } 85 86 vdoualarm(arg) 87 int arg; 88 { 89 register struct proc *p; 90 91 p = pfind(arg); 92 if (p) 93 psignal(p, 16); 94 nvualarm--; 95 } 96 #endif 97 98 #ifdef COMPAT 99 /* 100 * Note: these tables are sorted by 101 * ioctl "code" (in ascending order). 102 */ 103 int dctls[] = { DKIOCHDR, 0 }; 104 int fctls[] = { FIOCLEX, FIONCLEX, FIOASYNC, FIONBIO, FIONREAD, 0 }; 105 int mctls[] = { MTIOCTOP, MTIOCGET, 0 }; 106 int tctls[] = { 107 TIOCGETD, TIOCSETD, TIOCHPCL, TIOCMODG, TIOCMODS, 108 TIOCGETP, TIOCSETP, TIOCSETN, TIOCEXCL, TIOCNXCL, 109 TIOCFLUSH,TIOCSETC, TIOCGETC, TIOCREMOTE,TIOCMGET, 110 TIOCMBIC, TIOCMBIS, TIOCMSET, TIOCSTART,TIOCSTOP, 111 TIOCPKT, TIOCNOTTY,TIOCSTI, TIOCOUTQ, TIOCGLTC, 112 TIOCSLTC, TIOCSPGRP,TIOCGPGRP,TIOCCDTR, TIOCSDTR, 113 TIOCCBRK, TIOCSBRK, TIOCLGET, TIOCLSET, TIOCLBIC, 114 TIOCLBIS, 0 115 }; 116 117 /* 118 * Map an old style ioctl command to new. 119 */ 120 mapioctl(cmd) 121 int cmd; 122 { 123 register int *map, c; 124 125 switch ((cmd >> 8) & 0xff) { 126 127 case 'd': 128 map = dctls; 129 break; 130 131 case 'f': 132 map = fctls; 133 break; 134 135 case 'm': 136 map = mctls; 137 break; 138 139 case 't': 140 map = tctls; 141 break; 142 143 default: 144 return (0); 145 } 146 while ((c = *map) && (c&0xff) < (cmd&0xff)) 147 map++; 148 if (c && (c&0xff) == (cmd&0xff)) 149 return (c); 150 return (0); 151 } 152 #endif 153