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