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