xref: /original-bsd/sys/vax/vax/sys_machdep.c (revision 95b559cc)
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