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