xref: /minix3/minix/usr.bin/trace/ioctl/char.c (revision 521fa314e2aaec3c192c15f2aaa4c677a544e62a)
1*521fa314SDavid van Moolenbroek 
2*521fa314SDavid van Moolenbroek #include "inc.h"
3*521fa314SDavid van Moolenbroek 
4*521fa314SDavid van Moolenbroek #include <sys/ioctl.h>
5*521fa314SDavid van Moolenbroek #include <minix/i2c.h>
6*521fa314SDavid van Moolenbroek #include <minix/fb.h>
7*521fa314SDavid van Moolenbroek #include <minix/sound.h>
8*521fa314SDavid van Moolenbroek #include <sys/termios.h>
9*521fa314SDavid van Moolenbroek #include <sys/time.h>
10*521fa314SDavid van Moolenbroek #include <sys/kbdio.h>
11*521fa314SDavid van Moolenbroek #include <minix/keymap.h>
12*521fa314SDavid van Moolenbroek #include <sys/vm.h>
13*521fa314SDavid van Moolenbroek #include <sys/fcntl.h>
14*521fa314SDavid van Moolenbroek 
15*521fa314SDavid van Moolenbroek const char *
16*521fa314SDavid van Moolenbroek char_ioctl_name(unsigned long req)
17*521fa314SDavid van Moolenbroek {
18*521fa314SDavid van Moolenbroek 
19*521fa314SDavid van Moolenbroek 	switch (req) {
20*521fa314SDavid van Moolenbroek 	NAME(MINIX_I2C_IOCTL_EXEC);
21*521fa314SDavid van Moolenbroek 	NAME(FBIOGET_VSCREENINFO);
22*521fa314SDavid van Moolenbroek 	NAME(FBIOPUT_VSCREENINFO);
23*521fa314SDavid van Moolenbroek 	NAME(FBIOGET_FSCREENINFO);	/* TODO: print argument */
24*521fa314SDavid van Moolenbroek 	NAME(FBIOPAN_DISPLAY);
25*521fa314SDavid van Moolenbroek 	NAME(DSPIORATE);
26*521fa314SDavid van Moolenbroek 	NAME(DSPIOSTEREO);
27*521fa314SDavid van Moolenbroek 	NAME(DSPIOSIZE);
28*521fa314SDavid van Moolenbroek 	NAME(DSPIOBITS);
29*521fa314SDavid van Moolenbroek 	NAME(DSPIOSIGN);
30*521fa314SDavid van Moolenbroek 	NAME(DSPIOMAX);
31*521fa314SDavid van Moolenbroek 	NAME(DSPIORESET);		/* no argument */
32*521fa314SDavid van Moolenbroek 	NAME(DSPIOFREEBUF);
33*521fa314SDavid van Moolenbroek 	NAME(DSPIOSAMPLESINBUF);
34*521fa314SDavid van Moolenbroek 	NAME(DSPIOPAUSE);		/* no argument */
35*521fa314SDavid van Moolenbroek 	NAME(DSPIORESUME);		/* no argument */
36*521fa314SDavid van Moolenbroek 	NAME(MIXIOGETVOLUME);
37*521fa314SDavid van Moolenbroek 	NAME(MIXIOGETINPUTLEFT);
38*521fa314SDavid van Moolenbroek 	NAME(MIXIOGETINPUTRIGHT);
39*521fa314SDavid van Moolenbroek 	NAME(MIXIOGETOUTPUT);
40*521fa314SDavid van Moolenbroek 	NAME(MIXIOSETVOLUME);
41*521fa314SDavid van Moolenbroek 	NAME(MIXIOSETINPUTLEFT);
42*521fa314SDavid van Moolenbroek 	NAME(MIXIOSETINPUTRIGHT);
43*521fa314SDavid van Moolenbroek 	NAME(MIXIOSETOUTPUT);
44*521fa314SDavid van Moolenbroek 	NAME(TIOCEXCL);			/* no argument */
45*521fa314SDavid van Moolenbroek 	NAME(TIOCNXCL);			/* no argument */
46*521fa314SDavid van Moolenbroek 	NAME(TIOCFLUSH);
47*521fa314SDavid van Moolenbroek 	NAME(TIOCGETA);
48*521fa314SDavid van Moolenbroek 	NAME(TIOCSETA);
49*521fa314SDavid van Moolenbroek 	NAME(TIOCSETAW);
50*521fa314SDavid van Moolenbroek 	NAME(TIOCSETAF);
51*521fa314SDavid van Moolenbroek 	NAME(TIOCGETD);
52*521fa314SDavid van Moolenbroek 	NAME(TIOCSETD);
53*521fa314SDavid van Moolenbroek 	NAME(TIOCGLINED);
54*521fa314SDavid van Moolenbroek 	NAME(TIOCSLINED);
55*521fa314SDavid van Moolenbroek 	NAME(TIOCSBRK);			/* no argument */
56*521fa314SDavid van Moolenbroek 	NAME(TIOCCBRK);			/* no argument */
57*521fa314SDavid van Moolenbroek 	NAME(TIOCSDTR);			/* no argument */
58*521fa314SDavid van Moolenbroek 	NAME(TIOCCDTR);			/* no argument */
59*521fa314SDavid van Moolenbroek 	NAME(TIOCGPGRP);
60*521fa314SDavid van Moolenbroek 	NAME(TIOCSPGRP);
61*521fa314SDavid van Moolenbroek 	NAME(TIOCOUTQ);
62*521fa314SDavid van Moolenbroek 	NAME(TIOCSTI);
63*521fa314SDavid van Moolenbroek 	NAME(TIOCNOTTY);		/* no argument */
64*521fa314SDavid van Moolenbroek 	NAME(TIOCPKT);
65*521fa314SDavid van Moolenbroek 	NAME(TIOCSTOP);			/* no argument */
66*521fa314SDavid van Moolenbroek 	NAME(TIOCSTART);		/* no argument */
67*521fa314SDavid van Moolenbroek 	NAME(TIOCMSET);			/* TODO: print argument */
68*521fa314SDavid van Moolenbroek 	NAME(TIOCMBIS);			/* TODO: print argument */
69*521fa314SDavid van Moolenbroek 	NAME(TIOCMBIC);			/* TODO: print argument */
70*521fa314SDavid van Moolenbroek 	NAME(TIOCMGET);			/* TODO: print argument */
71*521fa314SDavid van Moolenbroek 	NAME(TIOCREMOTE);
72*521fa314SDavid van Moolenbroek 	NAME(TIOCGWINSZ);
73*521fa314SDavid van Moolenbroek 	NAME(TIOCSWINSZ);
74*521fa314SDavid van Moolenbroek 	NAME(TIOCUCNTL);
75*521fa314SDavid van Moolenbroek 	NAME(TIOCSTAT);
76*521fa314SDavid van Moolenbroek 	NAME(TIOCGSID);
77*521fa314SDavid van Moolenbroek 	NAME(TIOCCONS);
78*521fa314SDavid van Moolenbroek 	NAME(TIOCSCTTY);		/* no argument */
79*521fa314SDavid van Moolenbroek 	NAME(TIOCEXT);
80*521fa314SDavid van Moolenbroek 	NAME(TIOCSIG);			/* no argument */
81*521fa314SDavid van Moolenbroek 	NAME(TIOCDRAIN);		/* no argument */
82*521fa314SDavid van Moolenbroek 	NAME(TIOCGFLAGS);		/* TODO: print argument */
83*521fa314SDavid van Moolenbroek 	NAME(TIOCSFLAGS);		/* TODO: print argument */
84*521fa314SDavid van Moolenbroek 	NAME(TIOCDCDTIMESTAMP);		/* TODO: print argument */
85*521fa314SDavid van Moolenbroek 	NAME(TIOCRCVFRAME);		/* TODO: print argument */
86*521fa314SDavid van Moolenbroek 	NAME(TIOCXMTFRAME);		/* TODO: print argument */
87*521fa314SDavid van Moolenbroek 	NAME(TIOCPTMGET);		/* TODO: print argument */
88*521fa314SDavid van Moolenbroek 	NAME(TIOCGRANTPT);		/* no argument */
89*521fa314SDavid van Moolenbroek 	NAME(TIOCPTSNAME);		/* TODO: print argument */
90*521fa314SDavid van Moolenbroek 	NAME(TIOCSQSIZE);
91*521fa314SDavid van Moolenbroek 	NAME(TIOCGQSIZE);
92*521fa314SDavid van Moolenbroek 	NAME(TIOCSFON);			/* big IOCTL, not printing argument */
93*521fa314SDavid van Moolenbroek 	NAME(KIOCBELL);
94*521fa314SDavid van Moolenbroek 	NAME(KIOCSLEDS);
95*521fa314SDavid van Moolenbroek 	NAME(KIOCSMAP);			/* not worth interpreting */
96*521fa314SDavid van Moolenbroek 	NAME(TIOCMAPMEM);
97*521fa314SDavid van Moolenbroek 	NAME(TIOCUNMAPMEM);
98*521fa314SDavid van Moolenbroek 	}
99*521fa314SDavid van Moolenbroek 
100*521fa314SDavid van Moolenbroek 	return NULL;
101*521fa314SDavid van Moolenbroek }
102*521fa314SDavid van Moolenbroek 
103*521fa314SDavid van Moolenbroek static void
104*521fa314SDavid van Moolenbroek put_i2c_op(struct trace_proc * proc, const char *name, i2c_op_t op)
105*521fa314SDavid van Moolenbroek {
106*521fa314SDavid van Moolenbroek 	const char *text = NULL;
107*521fa314SDavid van Moolenbroek 
108*521fa314SDavid van Moolenbroek 	if (!valuesonly) {
109*521fa314SDavid van Moolenbroek 		switch (op) {
110*521fa314SDavid van Moolenbroek 		TEXT(I2C_OP_READ);
111*521fa314SDavid van Moolenbroek 		TEXT(I2C_OP_READ_WITH_STOP);
112*521fa314SDavid van Moolenbroek 		TEXT(I2C_OP_WRITE);
113*521fa314SDavid van Moolenbroek 		TEXT(I2C_OP_WRITE_WITH_STOP);
114*521fa314SDavid van Moolenbroek 		TEXT(I2C_OP_READ_BLOCK);
115*521fa314SDavid van Moolenbroek 		TEXT(I2C_OP_WRITE_BLOCK);
116*521fa314SDavid van Moolenbroek 		}
117*521fa314SDavid van Moolenbroek 	}
118*521fa314SDavid van Moolenbroek 
119*521fa314SDavid van Moolenbroek 	if (text != NULL)
120*521fa314SDavid van Moolenbroek 		put_field(proc, name, text);
121*521fa314SDavid van Moolenbroek 	else
122*521fa314SDavid van Moolenbroek 		put_value(proc, name, "%d", op);
123*521fa314SDavid van Moolenbroek }
124*521fa314SDavid van Moolenbroek 
125*521fa314SDavid van Moolenbroek static void
126*521fa314SDavid van Moolenbroek put_sound_device(struct trace_proc * proc, const char * name, int device)
127*521fa314SDavid van Moolenbroek {
128*521fa314SDavid van Moolenbroek 	const char *text = NULL;
129*521fa314SDavid van Moolenbroek 
130*521fa314SDavid van Moolenbroek 	if (!valuesonly) {
131*521fa314SDavid van Moolenbroek 		switch (device) {
132*521fa314SDavid van Moolenbroek 		TEXT(Master);
133*521fa314SDavid van Moolenbroek 		TEXT(Dac);
134*521fa314SDavid van Moolenbroek 		TEXT(Fm);
135*521fa314SDavid van Moolenbroek 		TEXT(Cd);
136*521fa314SDavid van Moolenbroek 		TEXT(Line);
137*521fa314SDavid van Moolenbroek 		TEXT(Mic);
138*521fa314SDavid van Moolenbroek 		TEXT(Speaker);
139*521fa314SDavid van Moolenbroek 		TEXT(Treble);
140*521fa314SDavid van Moolenbroek 		TEXT(Bass);
141*521fa314SDavid van Moolenbroek 		}
142*521fa314SDavid van Moolenbroek 	}
143*521fa314SDavid van Moolenbroek 
144*521fa314SDavid van Moolenbroek 	if (text != NULL)
145*521fa314SDavid van Moolenbroek 		put_field(proc, name, text);
146*521fa314SDavid van Moolenbroek 	else
147*521fa314SDavid van Moolenbroek 		put_value(proc, name, "%d", device);
148*521fa314SDavid van Moolenbroek }
149*521fa314SDavid van Moolenbroek 
150*521fa314SDavid van Moolenbroek static void
151*521fa314SDavid van Moolenbroek put_sound_state(struct trace_proc * proc, const char * name, int state)
152*521fa314SDavid van Moolenbroek {
153*521fa314SDavid van Moolenbroek 
154*521fa314SDavid van Moolenbroek 	if (!valuesonly && state == ON)
155*521fa314SDavid van Moolenbroek 		put_field(proc, name, "ON");
156*521fa314SDavid van Moolenbroek 	else if (!valuesonly && state == OFF)
157*521fa314SDavid van Moolenbroek 		put_field(proc, name, "OFF");
158*521fa314SDavid van Moolenbroek 	else
159*521fa314SDavid van Moolenbroek 		put_value(proc, name, "%d", state);
160*521fa314SDavid van Moolenbroek }
161*521fa314SDavid van Moolenbroek 
162*521fa314SDavid van Moolenbroek static const struct flags flush_flags[] = {
163*521fa314SDavid van Moolenbroek 	FLAG(FREAD),
164*521fa314SDavid van Moolenbroek 	FLAG(FWRITE),
165*521fa314SDavid van Moolenbroek };
166*521fa314SDavid van Moolenbroek 
167*521fa314SDavid van Moolenbroek static const struct flags tc_iflags[] = {
168*521fa314SDavid van Moolenbroek 	FLAG(IGNBRK),
169*521fa314SDavid van Moolenbroek 	FLAG(BRKINT),
170*521fa314SDavid van Moolenbroek 	FLAG(IGNPAR),
171*521fa314SDavid van Moolenbroek 	FLAG(PARMRK),
172*521fa314SDavid van Moolenbroek 	FLAG(INPCK),
173*521fa314SDavid van Moolenbroek 	FLAG(ISTRIP),
174*521fa314SDavid van Moolenbroek 	FLAG(INLCR),
175*521fa314SDavid van Moolenbroek 	FLAG(IGNCR),
176*521fa314SDavid van Moolenbroek 	FLAG(ICRNL),
177*521fa314SDavid van Moolenbroek 	FLAG(IXON),
178*521fa314SDavid van Moolenbroek 	FLAG(IXOFF),
179*521fa314SDavid van Moolenbroek 	FLAG(IXANY),
180*521fa314SDavid van Moolenbroek 	FLAG(IMAXBEL),
181*521fa314SDavid van Moolenbroek };
182*521fa314SDavid van Moolenbroek 
183*521fa314SDavid van Moolenbroek static const struct flags tc_oflags[] = {
184*521fa314SDavid van Moolenbroek 	FLAG(OPOST),
185*521fa314SDavid van Moolenbroek 	FLAG(ONLCR),
186*521fa314SDavid van Moolenbroek 	FLAG(OXTABS),
187*521fa314SDavid van Moolenbroek 	FLAG(ONOEOT),
188*521fa314SDavid van Moolenbroek 	FLAG(OCRNL),
189*521fa314SDavid van Moolenbroek 	FLAG(ONOCR),
190*521fa314SDavid van Moolenbroek 	FLAG(ONLRET),
191*521fa314SDavid van Moolenbroek };
192*521fa314SDavid van Moolenbroek 
193*521fa314SDavid van Moolenbroek static const struct flags tc_cflags[] = {
194*521fa314SDavid van Moolenbroek 	FLAG(CIGNORE),
195*521fa314SDavid van Moolenbroek 	FLAG_MASK(CSIZE, CS5),
196*521fa314SDavid van Moolenbroek 	FLAG_MASK(CSIZE, CS6),
197*521fa314SDavid van Moolenbroek 	FLAG_MASK(CSIZE, CS7),
198*521fa314SDavid van Moolenbroek 	FLAG_MASK(CSIZE, CS8),
199*521fa314SDavid van Moolenbroek 	FLAG(CSTOPB),
200*521fa314SDavid van Moolenbroek 	FLAG(CREAD),
201*521fa314SDavid van Moolenbroek 	FLAG(PARENB),
202*521fa314SDavid van Moolenbroek 	FLAG(PARODD),
203*521fa314SDavid van Moolenbroek 	FLAG(HUPCL),
204*521fa314SDavid van Moolenbroek 	FLAG(CLOCAL),
205*521fa314SDavid van Moolenbroek 	FLAG(CRTSCTS),
206*521fa314SDavid van Moolenbroek 	FLAG(CDTRCTS),
207*521fa314SDavid van Moolenbroek 	FLAG(MDMBUF),
208*521fa314SDavid van Moolenbroek };
209*521fa314SDavid van Moolenbroek 
210*521fa314SDavid van Moolenbroek static const struct flags tc_lflags[] = {
211*521fa314SDavid van Moolenbroek 	FLAG(ECHOKE),
212*521fa314SDavid van Moolenbroek 	FLAG(ECHOE),
213*521fa314SDavid van Moolenbroek 	FLAG(ECHOK),
214*521fa314SDavid van Moolenbroek 	FLAG(ECHO),
215*521fa314SDavid van Moolenbroek 	FLAG(ECHONL),
216*521fa314SDavid van Moolenbroek 	FLAG(ECHOPRT),
217*521fa314SDavid van Moolenbroek 	FLAG(ECHOCTL),
218*521fa314SDavid van Moolenbroek 	FLAG(ISIG),
219*521fa314SDavid van Moolenbroek 	FLAG(ICANON),
220*521fa314SDavid van Moolenbroek 	FLAG(ALTWERASE),
221*521fa314SDavid van Moolenbroek 	FLAG(IEXTEN),
222*521fa314SDavid van Moolenbroek 	FLAG(EXTPROC),
223*521fa314SDavid van Moolenbroek 	FLAG(TOSTOP),
224*521fa314SDavid van Moolenbroek 	FLAG(FLUSHO),
225*521fa314SDavid van Moolenbroek 	FLAG(NOKERNINFO),
226*521fa314SDavid van Moolenbroek 	FLAG(PENDIN),
227*521fa314SDavid van Moolenbroek 	FLAG(NOFLSH),
228*521fa314SDavid van Moolenbroek };
229*521fa314SDavid van Moolenbroek 
230*521fa314SDavid van Moolenbroek static void
231*521fa314SDavid van Moolenbroek put_tty_disc(struct trace_proc * proc, const char * name, int disc)
232*521fa314SDavid van Moolenbroek {
233*521fa314SDavid van Moolenbroek 	const char *text = NULL;
234*521fa314SDavid van Moolenbroek 
235*521fa314SDavid van Moolenbroek 	if (!valuesonly) {
236*521fa314SDavid van Moolenbroek 		switch (disc) {
237*521fa314SDavid van Moolenbroek 		TEXT(TTYDISC);
238*521fa314SDavid van Moolenbroek 		TEXT(TABLDISC);
239*521fa314SDavid van Moolenbroek 		TEXT(SLIPDISC);
240*521fa314SDavid van Moolenbroek 		TEXT(PPPDISC);
241*521fa314SDavid van Moolenbroek 		TEXT(STRIPDISC);
242*521fa314SDavid van Moolenbroek 		TEXT(HDLCDISC);
243*521fa314SDavid van Moolenbroek 		}
244*521fa314SDavid van Moolenbroek 	}
245*521fa314SDavid van Moolenbroek 
246*521fa314SDavid van Moolenbroek 	if (text != NULL)
247*521fa314SDavid van Moolenbroek 		put_field(proc, name, text);
248*521fa314SDavid van Moolenbroek 	else
249*521fa314SDavid van Moolenbroek 		put_value(proc, name, "%d", disc);
250*521fa314SDavid van Moolenbroek }
251*521fa314SDavid van Moolenbroek 
252*521fa314SDavid van Moolenbroek static const struct flags kbd_leds[] = {
253*521fa314SDavid van Moolenbroek 	FLAG(KBD_LEDS_NUM),
254*521fa314SDavid van Moolenbroek 	FLAG(KBD_LEDS_CAPS),
255*521fa314SDavid van Moolenbroek 	FLAG(KBD_LEDS_SCROLL),
256*521fa314SDavid van Moolenbroek };
257*521fa314SDavid van Moolenbroek 
258*521fa314SDavid van Moolenbroek int
259*521fa314SDavid van Moolenbroek char_ioctl_arg(struct trace_proc * proc, unsigned long req, void * ptr,
260*521fa314SDavid van Moolenbroek 	int dir)
261*521fa314SDavid van Moolenbroek {
262*521fa314SDavid van Moolenbroek 	minix_i2c_ioctl_exec_t *iie;
263*521fa314SDavid van Moolenbroek 	struct fb_var_screeninfo *fbvs;
264*521fa314SDavid van Moolenbroek 	struct volume_level *level;
265*521fa314SDavid van Moolenbroek 	struct inout_ctrl *inout;
266*521fa314SDavid van Moolenbroek 	struct termios *tc;
267*521fa314SDavid van Moolenbroek 	struct winsize *ws;
268*521fa314SDavid van Moolenbroek 	struct kio_bell *bell;
269*521fa314SDavid van Moolenbroek 	struct kio_leds *leds;
270*521fa314SDavid van Moolenbroek 	struct mapreqvm *mapreq;
271*521fa314SDavid van Moolenbroek 
272*521fa314SDavid van Moolenbroek 	switch (req) {
273*521fa314SDavid van Moolenbroek 	case MINIX_I2C_IOCTL_EXEC:
274*521fa314SDavid van Moolenbroek 		if ((iie = (minix_i2c_ioctl_exec_t *)ptr) == NULL)
275*521fa314SDavid van Moolenbroek 			return IF_OUT; /* we print only the request for now */
276*521fa314SDavid van Moolenbroek 
277*521fa314SDavid van Moolenbroek 		put_i2c_op(proc, "iie_op", iie->iie_op);
278*521fa314SDavid van Moolenbroek 		put_value(proc, "iie_addr", "0x%04x", iie->iie_addr);
279*521fa314SDavid van Moolenbroek 		return 0; /* TODO: print command/data/result */
280*521fa314SDavid van Moolenbroek 
281*521fa314SDavid van Moolenbroek 	case FBIOGET_VSCREENINFO:
282*521fa314SDavid van Moolenbroek 		if ((fbvs = (struct fb_var_screeninfo *)ptr) == NULL)
283*521fa314SDavid van Moolenbroek 			return IF_IN;
284*521fa314SDavid van Moolenbroek 
285*521fa314SDavid van Moolenbroek 		put_value(proc, "xres", "%"PRIu32, fbvs->xres);
286*521fa314SDavid van Moolenbroek 		put_value(proc, "yres", "%"PRIu32, fbvs->yres);
287*521fa314SDavid van Moolenbroek 		put_value(proc, "xres_virtual", "%"PRIu32, fbvs->xres_virtual);
288*521fa314SDavid van Moolenbroek 		put_value(proc, "yres_virtual", "%"PRIu32, fbvs->yres_virtual);
289*521fa314SDavid van Moolenbroek 		put_value(proc, "xoffset", "%"PRIu32, fbvs->xoffset);
290*521fa314SDavid van Moolenbroek 		put_value(proc, "yoffset", "%"PRIu32, fbvs->yoffset);
291*521fa314SDavid van Moolenbroek 		put_value(proc, "bits_per_pixel", "%"PRIu32,
292*521fa314SDavid van Moolenbroek 		    fbvs->bits_per_pixel);
293*521fa314SDavid van Moolenbroek 		return 0;
294*521fa314SDavid van Moolenbroek 
295*521fa314SDavid van Moolenbroek 	case FBIOPUT_VSCREENINFO:
296*521fa314SDavid van Moolenbroek 	case FBIOPAN_DISPLAY:
297*521fa314SDavid van Moolenbroek 		if ((fbvs = (struct fb_var_screeninfo *)ptr) == NULL)
298*521fa314SDavid van Moolenbroek 			return IF_OUT;
299*521fa314SDavid van Moolenbroek 
300*521fa314SDavid van Moolenbroek 		put_value(proc, "xoffset", "%"PRIu32, fbvs->xoffset);
301*521fa314SDavid van Moolenbroek 		put_value(proc, "yoffset", "%"PRIu32, fbvs->yoffset);
302*521fa314SDavid van Moolenbroek 		return 0;
303*521fa314SDavid van Moolenbroek 
304*521fa314SDavid van Moolenbroek 	case DSPIORATE:
305*521fa314SDavid van Moolenbroek 	case DSPIOSTEREO:
306*521fa314SDavid van Moolenbroek 	case DSPIOSIZE:
307*521fa314SDavid van Moolenbroek 	case DSPIOBITS:
308*521fa314SDavid van Moolenbroek 	case DSPIOSIGN:
309*521fa314SDavid van Moolenbroek 	case DSPIOMAX:
310*521fa314SDavid van Moolenbroek 	case DSPIOFREEBUF:
311*521fa314SDavid van Moolenbroek 	case DSPIOSAMPLESINBUF:
312*521fa314SDavid van Moolenbroek 		if (ptr == NULL)
313*521fa314SDavid van Moolenbroek 			return dir;
314*521fa314SDavid van Moolenbroek 
315*521fa314SDavid van Moolenbroek 		put_value(proc, NULL, "%u", *(unsigned int *)ptr);
316*521fa314SDavid van Moolenbroek 		return IF_ALL;
317*521fa314SDavid van Moolenbroek 
318*521fa314SDavid van Moolenbroek 	case MIXIOGETVOLUME:
319*521fa314SDavid van Moolenbroek 		if ((level = (struct volume_level *)ptr) == NULL)
320*521fa314SDavid van Moolenbroek 			return dir;
321*521fa314SDavid van Moolenbroek 
322*521fa314SDavid van Moolenbroek 		if (dir == IF_OUT)
323*521fa314SDavid van Moolenbroek 			put_sound_device(proc, "device", level->device);
324*521fa314SDavid van Moolenbroek 		else {
325*521fa314SDavid van Moolenbroek 			put_value(proc, "left", "%d", level->left);
326*521fa314SDavid van Moolenbroek 			put_value(proc, "right", "%d", level->right);
327*521fa314SDavid van Moolenbroek 		}
328*521fa314SDavid van Moolenbroek 		return IF_ALL;
329*521fa314SDavid van Moolenbroek 
330*521fa314SDavid van Moolenbroek 	case MIXIOSETVOLUME:
331*521fa314SDavid van Moolenbroek 		/* Print the corrected volume levels only with verbosity on. */
332*521fa314SDavid van Moolenbroek 		if ((level = (struct volume_level *)ptr) == NULL)
333*521fa314SDavid van Moolenbroek 			return IF_OUT | ((verbose > 0) ? IF_IN : 0);
334*521fa314SDavid van Moolenbroek 
335*521fa314SDavid van Moolenbroek 		if (dir == IF_OUT)
336*521fa314SDavid van Moolenbroek 			put_sound_device(proc, "device", level->device);
337*521fa314SDavid van Moolenbroek 		put_value(proc, "left", "%d", level->left);
338*521fa314SDavid van Moolenbroek 		put_value(proc, "right", "%d", level->right);
339*521fa314SDavid van Moolenbroek 		return IF_ALL;
340*521fa314SDavid van Moolenbroek 
341*521fa314SDavid van Moolenbroek 	case MIXIOGETINPUTLEFT:
342*521fa314SDavid van Moolenbroek 	case MIXIOGETINPUTRIGHT:
343*521fa314SDavid van Moolenbroek 	case MIXIOGETOUTPUT:
344*521fa314SDavid van Moolenbroek 		if ((inout = (struct inout_ctrl *)ptr) == NULL)
345*521fa314SDavid van Moolenbroek 			return dir;
346*521fa314SDavid van Moolenbroek 
347*521fa314SDavid van Moolenbroek 		if (dir == IF_OUT)
348*521fa314SDavid van Moolenbroek 			put_sound_device(proc, "device", inout->device);
349*521fa314SDavid van Moolenbroek 		else {
350*521fa314SDavid van Moolenbroek 			put_sound_state(proc, "left", inout->left);
351*521fa314SDavid van Moolenbroek 			put_sound_state(proc, "right", inout->right);
352*521fa314SDavid van Moolenbroek 		}
353*521fa314SDavid van Moolenbroek 		return IF_ALL;
354*521fa314SDavid van Moolenbroek 
355*521fa314SDavid van Moolenbroek 	case MIXIOSETINPUTLEFT:
356*521fa314SDavid van Moolenbroek 	case MIXIOSETINPUTRIGHT:
357*521fa314SDavid van Moolenbroek 	case MIXIOSETOUTPUT:
358*521fa314SDavid van Moolenbroek 		if ((inout = (struct inout_ctrl *)ptr) == NULL)
359*521fa314SDavid van Moolenbroek 			return IF_OUT;
360*521fa314SDavid van Moolenbroek 
361*521fa314SDavid van Moolenbroek 		put_sound_device(proc, "device", inout->device);
362*521fa314SDavid van Moolenbroek 		put_sound_state(proc, "left", inout->left);
363*521fa314SDavid van Moolenbroek 		put_sound_state(proc, "right", inout->right);
364*521fa314SDavid van Moolenbroek 		return IF_ALL;
365*521fa314SDavid van Moolenbroek 
366*521fa314SDavid van Moolenbroek 	case TIOCFLUSH:
367*521fa314SDavid van Moolenbroek 		if (ptr == NULL)
368*521fa314SDavid van Moolenbroek 			return IF_OUT;
369*521fa314SDavid van Moolenbroek 
370*521fa314SDavid van Moolenbroek 		put_flags(proc, NULL, flush_flags, COUNT(flush_flags), "0x%x",
371*521fa314SDavid van Moolenbroek 		    *(int *)ptr);
372*521fa314SDavid van Moolenbroek 		return IF_ALL;
373*521fa314SDavid van Moolenbroek 
374*521fa314SDavid van Moolenbroek 	case TIOCGETA:
375*521fa314SDavid van Moolenbroek 	case TIOCSETA:
376*521fa314SDavid van Moolenbroek 	case TIOCSETAW:
377*521fa314SDavid van Moolenbroek 	case TIOCSETAF:
378*521fa314SDavid van Moolenbroek 		if ((tc = (struct termios *)ptr) == NULL)
379*521fa314SDavid van Moolenbroek 			return dir;
380*521fa314SDavid van Moolenbroek 
381*521fa314SDavid van Moolenbroek 		/*
382*521fa314SDavid van Moolenbroek 		 * These are fairly common IOCTLs, so printing everything by
383*521fa314SDavid van Moolenbroek 		 * default would create a lot of noise.  By default we limit
384*521fa314SDavid van Moolenbroek 		 * ourselves to printing the field that contains what I
385*521fa314SDavid van Moolenbroek 		 * consider to be the most important flag: ICANON.
386*521fa314SDavid van Moolenbroek 		 * TODO: see if we can come up with a decent format for
387*521fa314SDavid van Moolenbroek 		 * selectively printing (relatively important) flags.
388*521fa314SDavid van Moolenbroek 		 */
389*521fa314SDavid van Moolenbroek 		if (verbose > 0) {
390*521fa314SDavid van Moolenbroek 			put_flags(proc, "c_iflag", tc_iflags, COUNT(tc_iflags),
391*521fa314SDavid van Moolenbroek 			    "0x%x", tc->c_iflag);
392*521fa314SDavid van Moolenbroek 			put_flags(proc, "c_oflag", tc_oflags, COUNT(tc_oflags),
393*521fa314SDavid van Moolenbroek 			    "0x%x", tc->c_oflag);
394*521fa314SDavid van Moolenbroek 			put_flags(proc, "c_cflag", tc_cflags, COUNT(tc_cflags),
395*521fa314SDavid van Moolenbroek 			    "0x%x", tc->c_cflag);
396*521fa314SDavid van Moolenbroek 		}
397*521fa314SDavid van Moolenbroek 		put_flags(proc, "c_lflag", tc_lflags, COUNT(tc_lflags), "0x%x",
398*521fa314SDavid van Moolenbroek 			tc->c_lflag);
399*521fa314SDavid van Moolenbroek 		if (verbose > 0) {
400*521fa314SDavid van Moolenbroek 			put_value(proc, "c_ispeed", "%d", tc->c_ispeed);
401*521fa314SDavid van Moolenbroek 			put_value(proc, "c_ospeed", "%d", tc->c_ospeed);
402*521fa314SDavid van Moolenbroek 		}
403*521fa314SDavid van Moolenbroek 		return 0; /* TODO: print the c_cc fields */
404*521fa314SDavid van Moolenbroek 
405*521fa314SDavid van Moolenbroek 	case TIOCGETD:
406*521fa314SDavid van Moolenbroek 	case TIOCSETD:
407*521fa314SDavid van Moolenbroek 		if (ptr == NULL)
408*521fa314SDavid van Moolenbroek 			return dir;
409*521fa314SDavid van Moolenbroek 
410*521fa314SDavid van Moolenbroek 		put_tty_disc(proc, NULL, *(int *)ptr);
411*521fa314SDavid van Moolenbroek 		return IF_ALL;
412*521fa314SDavid van Moolenbroek 
413*521fa314SDavid van Moolenbroek 	case TIOCGLINED:
414*521fa314SDavid van Moolenbroek 	case TIOCSLINED:
415*521fa314SDavid van Moolenbroek 		if (ptr == NULL)
416*521fa314SDavid van Moolenbroek 			return dir;
417*521fa314SDavid van Moolenbroek 
418*521fa314SDavid van Moolenbroek 		put_buf(proc, NULL, PF_LOCADDR | PF_STRING, (vir_bytes)ptr,
419*521fa314SDavid van Moolenbroek 		    sizeof(linedn_t));
420*521fa314SDavid van Moolenbroek 		return IF_ALL;
421*521fa314SDavid van Moolenbroek 
422*521fa314SDavid van Moolenbroek 	case TIOCGPGRP:
423*521fa314SDavid van Moolenbroek 	case TIOCSPGRP:
424*521fa314SDavid van Moolenbroek 	case TIOCOUTQ:
425*521fa314SDavid van Moolenbroek 	case TIOCPKT:
426*521fa314SDavid van Moolenbroek 	case TIOCREMOTE:
427*521fa314SDavid van Moolenbroek 	case TIOCUCNTL:
428*521fa314SDavid van Moolenbroek 	case TIOCSTAT:		/* argument seems unused? */
429*521fa314SDavid van Moolenbroek 	case TIOCGSID:
430*521fa314SDavid van Moolenbroek 	case TIOCCONS:		/* argument seems unused? */
431*521fa314SDavid van Moolenbroek 	case TIOCEXT:
432*521fa314SDavid van Moolenbroek 	case TIOCSQSIZE:
433*521fa314SDavid van Moolenbroek 	case TIOCGQSIZE:
434*521fa314SDavid van Moolenbroek 		/* Print a simple integer. */
435*521fa314SDavid van Moolenbroek 		if (ptr == NULL)
436*521fa314SDavid van Moolenbroek 			return dir;
437*521fa314SDavid van Moolenbroek 
438*521fa314SDavid van Moolenbroek 		put_value(proc, NULL, "%d", *(int *)ptr);
439*521fa314SDavid van Moolenbroek 		return IF_ALL;
440*521fa314SDavid van Moolenbroek 
441*521fa314SDavid van Moolenbroek 	case TIOCSTI:
442*521fa314SDavid van Moolenbroek 		if (ptr == NULL)
443*521fa314SDavid van Moolenbroek 			return dir;
444*521fa314SDavid van Moolenbroek 
445*521fa314SDavid van Moolenbroek 		if (!valuesonly)
446*521fa314SDavid van Moolenbroek 			put_value(proc, NULL, "'%s'",
447*521fa314SDavid van Moolenbroek 			    get_escape(*(char *)ptr));
448*521fa314SDavid van Moolenbroek 		else
449*521fa314SDavid van Moolenbroek 			put_value(proc, NULL, "%u", *(char *)ptr);
450*521fa314SDavid van Moolenbroek 		return IF_ALL;
451*521fa314SDavid van Moolenbroek 
452*521fa314SDavid van Moolenbroek 	case TIOCGWINSZ:
453*521fa314SDavid van Moolenbroek 	case TIOCSWINSZ:
454*521fa314SDavid van Moolenbroek 		if ((ws = (struct winsize *)ptr) == NULL)
455*521fa314SDavid van Moolenbroek 			return dir;
456*521fa314SDavid van Moolenbroek 
457*521fa314SDavid van Moolenbroek 		/* This is a stupid order, but we follow the struct layout. */
458*521fa314SDavid van Moolenbroek 		put_value(proc, "ws_row", "%u", ws->ws_row);
459*521fa314SDavid van Moolenbroek 		put_value(proc, "ws_col", "%u", ws->ws_col);
460*521fa314SDavid van Moolenbroek 		if (verbose > 0) {
461*521fa314SDavid van Moolenbroek 			put_value(proc, "ws_xpixel", "%u", ws->ws_xpixel);
462*521fa314SDavid van Moolenbroek 			put_value(proc, "ws_ypixel", "%u", ws->ws_ypixel);
463*521fa314SDavid van Moolenbroek 		}
464*521fa314SDavid van Moolenbroek 		return (verbose > 0) ? IF_ALL : 0;
465*521fa314SDavid van Moolenbroek 
466*521fa314SDavid van Moolenbroek 	case KIOCBELL:
467*521fa314SDavid van Moolenbroek 		if ((bell = (struct kio_bell *)ptr) == NULL)
468*521fa314SDavid van Moolenbroek 			return IF_OUT;
469*521fa314SDavid van Moolenbroek 
470*521fa314SDavid van Moolenbroek 		put_value(proc, "kb_pitch", "%u", bell->kb_pitch);
471*521fa314SDavid van Moolenbroek 		put_value(proc, "kb_volume", "%lu", bell->kb_volume);
472*521fa314SDavid van Moolenbroek 		put_struct_timeval(proc, "kb_duration", PF_LOCADDR,
473*521fa314SDavid van Moolenbroek 		    (vir_bytes)&bell->kb_duration);
474*521fa314SDavid van Moolenbroek 
475*521fa314SDavid van Moolenbroek 		return IF_ALL;
476*521fa314SDavid van Moolenbroek 
477*521fa314SDavid van Moolenbroek 	case KIOCSLEDS:
478*521fa314SDavid van Moolenbroek 		if ((leds = (struct kio_leds *)ptr) == NULL)
479*521fa314SDavid van Moolenbroek 			return IF_OUT;
480*521fa314SDavid van Moolenbroek 
481*521fa314SDavid van Moolenbroek 		put_flags(proc, "kl_bits", kbd_leds, COUNT(kbd_leds), "0x%x",
482*521fa314SDavid van Moolenbroek 		    leds->kl_bits);
483*521fa314SDavid van Moolenbroek 		return IF_ALL;
484*521fa314SDavid van Moolenbroek 
485*521fa314SDavid van Moolenbroek 	case TIOCMAPMEM:
486*521fa314SDavid van Moolenbroek 		if ((mapreq = (struct mapreqvm *)ptr) == NULL)
487*521fa314SDavid van Moolenbroek 			return dir;
488*521fa314SDavid van Moolenbroek 
489*521fa314SDavid van Moolenbroek 		/* This structure has more fields, but they're all unused.. */
490*521fa314SDavid van Moolenbroek 		if (dir == IF_OUT) {
491*521fa314SDavid van Moolenbroek 			put_value(proc, "phys_offset", "%"PRIu64,
492*521fa314SDavid van Moolenbroek 			    (uint64_t)mapreq->phys_offset); /* future compat */
493*521fa314SDavid van Moolenbroek 			put_value(proc, "size", "%zu", mapreq->size);
494*521fa314SDavid van Moolenbroek 		} else
495*521fa314SDavid van Moolenbroek 			put_ptr(proc, "vaddr_ret", (vir_bytes)mapreq->vaddr);
496*521fa314SDavid van Moolenbroek 		return IF_ALL;
497*521fa314SDavid van Moolenbroek 
498*521fa314SDavid van Moolenbroek 	case TIOCUNMAPMEM:
499*521fa314SDavid van Moolenbroek 		if ((mapreq = (struct mapreqvm *)ptr) == NULL)
500*521fa314SDavid van Moolenbroek 			return IF_OUT;
501*521fa314SDavid van Moolenbroek 
502*521fa314SDavid van Moolenbroek 		put_ptr(proc, "vaddr", (vir_bytes)mapreq->vaddr);
503*521fa314SDavid van Moolenbroek 		put_value(proc, "size", "%zu", mapreq->size);
504*521fa314SDavid van Moolenbroek 		return IF_ALL;
505*521fa314SDavid van Moolenbroek 
506*521fa314SDavid van Moolenbroek 	default:
507*521fa314SDavid van Moolenbroek 		return 0;
508*521fa314SDavid van Moolenbroek 	}
509*521fa314SDavid van Moolenbroek }
510