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