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