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