xref: /original-bsd/sys/i386/i386/sys_machdep.c (revision 23c6a147)
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