xref: /minix3/minix/usr.bin/trace/ioctl/char.c (revision da21d850255e4f11bb2023f69a0b3aad4eab62e2)
1521fa314SDavid van Moolenbroek 
2521fa314SDavid van Moolenbroek #include "inc.h"
3521fa314SDavid van Moolenbroek 
45d831176SLionel Sambuc #include <dev/pci/pciio.h>
55d831176SLionel Sambuc 
6521fa314SDavid van Moolenbroek #include <minix/fb.h>
75d831176SLionel Sambuc #include <minix/i2c.h>
85d831176SLionel Sambuc #include <minix/keymap.h>
9521fa314SDavid van Moolenbroek #include <minix/sound.h>
105d831176SLionel Sambuc 
115d831176SLionel Sambuc #include <sys/fcntl.h>
125d831176SLionel Sambuc #include <sys/ioctl.h>
135d831176SLionel Sambuc #include <sys/kbdio.h>
14521fa314SDavid van Moolenbroek #include <sys/termios.h>
15521fa314SDavid van Moolenbroek #include <sys/time.h>
16521fa314SDavid van Moolenbroek 
17521fa314SDavid van Moolenbroek const char *
char_ioctl_name(unsigned long req)18521fa314SDavid van Moolenbroek char_ioctl_name(unsigned long req)
19521fa314SDavid van Moolenbroek {
20521fa314SDavid van Moolenbroek 
21521fa314SDavid van Moolenbroek 	switch (req) {
22521fa314SDavid van Moolenbroek 	NAME(MINIX_I2C_IOCTL_EXEC);
23521fa314SDavid van Moolenbroek 	NAME(FBIOGET_VSCREENINFO);
24521fa314SDavid van Moolenbroek 	NAME(FBIOPUT_VSCREENINFO);
25521fa314SDavid van Moolenbroek 	NAME(FBIOGET_FSCREENINFO);	/* TODO: print argument */
26521fa314SDavid van Moolenbroek 	NAME(FBIOPAN_DISPLAY);
27521fa314SDavid van Moolenbroek 	NAME(DSPIORATE);
28521fa314SDavid van Moolenbroek 	NAME(DSPIOSTEREO);
29521fa314SDavid van Moolenbroek 	NAME(DSPIOSIZE);
30521fa314SDavid van Moolenbroek 	NAME(DSPIOBITS);
31521fa314SDavid van Moolenbroek 	NAME(DSPIOSIGN);
32521fa314SDavid van Moolenbroek 	NAME(DSPIOMAX);
33521fa314SDavid van Moolenbroek 	NAME(DSPIORESET);		/* no argument */
34521fa314SDavid van Moolenbroek 	NAME(DSPIOFREEBUF);
35521fa314SDavid van Moolenbroek 	NAME(DSPIOSAMPLESINBUF);
36521fa314SDavid van Moolenbroek 	NAME(DSPIOPAUSE);		/* no argument */
37521fa314SDavid van Moolenbroek 	NAME(DSPIORESUME);		/* no argument */
38521fa314SDavid van Moolenbroek 	NAME(MIXIOGETVOLUME);
39521fa314SDavid van Moolenbroek 	NAME(MIXIOGETINPUTLEFT);
40521fa314SDavid van Moolenbroek 	NAME(MIXIOGETINPUTRIGHT);
41521fa314SDavid van Moolenbroek 	NAME(MIXIOGETOUTPUT);
42521fa314SDavid van Moolenbroek 	NAME(MIXIOSETVOLUME);
43521fa314SDavid van Moolenbroek 	NAME(MIXIOSETINPUTLEFT);
44521fa314SDavid van Moolenbroek 	NAME(MIXIOSETINPUTRIGHT);
45521fa314SDavid van Moolenbroek 	NAME(MIXIOSETOUTPUT);
46521fa314SDavid van Moolenbroek 	NAME(TIOCEXCL);			/* no argument */
47521fa314SDavid van Moolenbroek 	NAME(TIOCNXCL);			/* no argument */
48521fa314SDavid van Moolenbroek 	NAME(TIOCFLUSH);
49521fa314SDavid van Moolenbroek 	NAME(TIOCGETA);
50521fa314SDavid van Moolenbroek 	NAME(TIOCSETA);
51521fa314SDavid van Moolenbroek 	NAME(TIOCSETAW);
52521fa314SDavid van Moolenbroek 	NAME(TIOCSETAF);
53521fa314SDavid van Moolenbroek 	NAME(TIOCGETD);
54521fa314SDavid van Moolenbroek 	NAME(TIOCSETD);
55521fa314SDavid van Moolenbroek 	NAME(TIOCGLINED);
56521fa314SDavid van Moolenbroek 	NAME(TIOCSLINED);
57521fa314SDavid van Moolenbroek 	NAME(TIOCSBRK);			/* no argument */
58521fa314SDavid van Moolenbroek 	NAME(TIOCCBRK);			/* no argument */
59521fa314SDavid van Moolenbroek 	NAME(TIOCSDTR);			/* no argument */
60521fa314SDavid van Moolenbroek 	NAME(TIOCCDTR);			/* no argument */
61521fa314SDavid van Moolenbroek 	NAME(TIOCGPGRP);
62521fa314SDavid van Moolenbroek 	NAME(TIOCSPGRP);
63521fa314SDavid van Moolenbroek 	NAME(TIOCOUTQ);
64521fa314SDavid van Moolenbroek 	NAME(TIOCSTI);
65521fa314SDavid van Moolenbroek 	NAME(TIOCNOTTY);		/* no argument */
66521fa314SDavid van Moolenbroek 	NAME(TIOCPKT);
67521fa314SDavid van Moolenbroek 	NAME(TIOCSTOP);			/* no argument */
68521fa314SDavid van Moolenbroek 	NAME(TIOCSTART);		/* no argument */
69521fa314SDavid van Moolenbroek 	NAME(TIOCMSET);			/* TODO: print argument */
70521fa314SDavid van Moolenbroek 	NAME(TIOCMBIS);			/* TODO: print argument */
71521fa314SDavid van Moolenbroek 	NAME(TIOCMBIC);			/* TODO: print argument */
72521fa314SDavid van Moolenbroek 	NAME(TIOCMGET);			/* TODO: print argument */
73521fa314SDavid van Moolenbroek 	NAME(TIOCREMOTE);
74521fa314SDavid van Moolenbroek 	NAME(TIOCGWINSZ);
75521fa314SDavid van Moolenbroek 	NAME(TIOCSWINSZ);
76521fa314SDavid van Moolenbroek 	NAME(TIOCUCNTL);
77521fa314SDavid van Moolenbroek 	NAME(TIOCSTAT);
78521fa314SDavid van Moolenbroek 	NAME(TIOCGSID);
79521fa314SDavid van Moolenbroek 	NAME(TIOCCONS);
80521fa314SDavid van Moolenbroek 	NAME(TIOCSCTTY);		/* no argument */
81521fa314SDavid van Moolenbroek 	NAME(TIOCEXT);
82521fa314SDavid van Moolenbroek 	NAME(TIOCSIG);			/* no argument */
83521fa314SDavid van Moolenbroek 	NAME(TIOCDRAIN);		/* no argument */
84521fa314SDavid van Moolenbroek 	NAME(TIOCGFLAGS);		/* TODO: print argument */
85521fa314SDavid van Moolenbroek 	NAME(TIOCSFLAGS);		/* TODO: print argument */
86521fa314SDavid van Moolenbroek 	NAME(TIOCDCDTIMESTAMP);		/* TODO: print argument */
87521fa314SDavid van Moolenbroek 	NAME(TIOCRCVFRAME);		/* TODO: print argument */
88521fa314SDavid van Moolenbroek 	NAME(TIOCXMTFRAME);		/* TODO: print argument */
89521fa314SDavid van Moolenbroek 	NAME(TIOCPTMGET);		/* TODO: print argument */
90521fa314SDavid van Moolenbroek 	NAME(TIOCGRANTPT);		/* no argument */
91521fa314SDavid van Moolenbroek 	NAME(TIOCPTSNAME);		/* TODO: print argument */
92521fa314SDavid van Moolenbroek 	NAME(TIOCSQSIZE);
93521fa314SDavid van Moolenbroek 	NAME(TIOCGQSIZE);
94521fa314SDavid van Moolenbroek 	NAME(TIOCSFON);			/* big IOCTL, not printing argument */
95521fa314SDavid van Moolenbroek 	NAME(KIOCBELL);
96521fa314SDavid van Moolenbroek 	NAME(KIOCSLEDS);
97521fa314SDavid van Moolenbroek 	NAME(KIOCSMAP);			/* not worth interpreting */
985d831176SLionel Sambuc 	NAME(PCI_IOC_CFGREAD);
995d831176SLionel Sambuc 	NAME(PCI_IOC_CFGWRITE);
1005d831176SLionel Sambuc 	NAME(PCI_IOC_BDF_CFGREAD);
1015d831176SLionel Sambuc 	NAME(PCI_IOC_BDF_CFGWRITE);
1025d831176SLionel Sambuc 	NAME(PCI_IOC_BUSINFO);
1035d831176SLionel Sambuc 	NAME(PCI_IOC_MAP);
1045d831176SLionel Sambuc 	NAME(PCI_IOC_UNMAP);
1055d831176SLionel Sambuc 	NAME(PCI_IOC_RESERVE);
1065d831176SLionel Sambuc 	NAME(PCI_IOC_RELEASE);
107521fa314SDavid van Moolenbroek 	}
108521fa314SDavid van Moolenbroek 
109521fa314SDavid van Moolenbroek 	return NULL;
110521fa314SDavid van Moolenbroek }
111521fa314SDavid van Moolenbroek 
112521fa314SDavid van Moolenbroek static void
put_i2c_op(struct trace_proc * proc,const char * name,i2c_op_t op)113521fa314SDavid van Moolenbroek put_i2c_op(struct trace_proc * proc, const char *name, i2c_op_t op)
114521fa314SDavid van Moolenbroek {
115521fa314SDavid van Moolenbroek 	const char *text = NULL;
116521fa314SDavid van Moolenbroek 
117521fa314SDavid van Moolenbroek 	if (!valuesonly) {
118521fa314SDavid van Moolenbroek 		switch (op) {
119521fa314SDavid van Moolenbroek 		TEXT(I2C_OP_READ);
120521fa314SDavid van Moolenbroek 		TEXT(I2C_OP_READ_WITH_STOP);
121521fa314SDavid van Moolenbroek 		TEXT(I2C_OP_WRITE);
122521fa314SDavid van Moolenbroek 		TEXT(I2C_OP_WRITE_WITH_STOP);
123521fa314SDavid van Moolenbroek 		TEXT(I2C_OP_READ_BLOCK);
124521fa314SDavid van Moolenbroek 		TEXT(I2C_OP_WRITE_BLOCK);
125521fa314SDavid van Moolenbroek 		}
126521fa314SDavid van Moolenbroek 	}
127521fa314SDavid van Moolenbroek 
128521fa314SDavid van Moolenbroek 	if (text != NULL)
129521fa314SDavid van Moolenbroek 		put_field(proc, name, text);
130521fa314SDavid van Moolenbroek 	else
131521fa314SDavid van Moolenbroek 		put_value(proc, name, "%d", op);
132521fa314SDavid van Moolenbroek }
133521fa314SDavid van Moolenbroek 
134521fa314SDavid van Moolenbroek static void
put_sound_device(struct trace_proc * proc,const char * name,int device)135521fa314SDavid van Moolenbroek put_sound_device(struct trace_proc * proc, const char * name, int device)
136521fa314SDavid van Moolenbroek {
137521fa314SDavid van Moolenbroek 	const char *text = NULL;
138521fa314SDavid van Moolenbroek 
139521fa314SDavid van Moolenbroek 	if (!valuesonly) {
140521fa314SDavid van Moolenbroek 		switch (device) {
141521fa314SDavid van Moolenbroek 		TEXT(Master);
142521fa314SDavid van Moolenbroek 		TEXT(Dac);
143521fa314SDavid van Moolenbroek 		TEXT(Fm);
144521fa314SDavid van Moolenbroek 		TEXT(Cd);
145521fa314SDavid van Moolenbroek 		TEXT(Line);
146521fa314SDavid van Moolenbroek 		TEXT(Mic);
147521fa314SDavid van Moolenbroek 		TEXT(Speaker);
148521fa314SDavid van Moolenbroek 		TEXT(Treble);
149521fa314SDavid van Moolenbroek 		TEXT(Bass);
150521fa314SDavid van Moolenbroek 		}
151521fa314SDavid van Moolenbroek 	}
152521fa314SDavid van Moolenbroek 
153521fa314SDavid van Moolenbroek 	if (text != NULL)
154521fa314SDavid van Moolenbroek 		put_field(proc, name, text);
155521fa314SDavid van Moolenbroek 	else
156521fa314SDavid van Moolenbroek 		put_value(proc, name, "%d", device);
157521fa314SDavid van Moolenbroek }
158521fa314SDavid van Moolenbroek 
159521fa314SDavid van Moolenbroek static void
put_sound_state(struct trace_proc * proc,const char * name,int state)160521fa314SDavid van Moolenbroek put_sound_state(struct trace_proc * proc, const char * name, int state)
161521fa314SDavid van Moolenbroek {
162521fa314SDavid van Moolenbroek 
163521fa314SDavid van Moolenbroek 	if (!valuesonly && state == ON)
164521fa314SDavid van Moolenbroek 		put_field(proc, name, "ON");
165521fa314SDavid van Moolenbroek 	else if (!valuesonly && state == OFF)
166521fa314SDavid van Moolenbroek 		put_field(proc, name, "OFF");
167521fa314SDavid van Moolenbroek 	else
168521fa314SDavid van Moolenbroek 		put_value(proc, name, "%d", state);
169521fa314SDavid van Moolenbroek }
170521fa314SDavid van Moolenbroek 
171521fa314SDavid van Moolenbroek static const struct flags flush_flags[] = {
172521fa314SDavid van Moolenbroek 	FLAG(FREAD),
173521fa314SDavid van Moolenbroek 	FLAG(FWRITE),
174521fa314SDavid van Moolenbroek };
175521fa314SDavid van Moolenbroek 
176521fa314SDavid van Moolenbroek static const struct flags tc_iflags[] = {
177521fa314SDavid van Moolenbroek 	FLAG(IGNBRK),
178521fa314SDavid van Moolenbroek 	FLAG(BRKINT),
179521fa314SDavid van Moolenbroek 	FLAG(IGNPAR),
180521fa314SDavid van Moolenbroek 	FLAG(PARMRK),
181521fa314SDavid van Moolenbroek 	FLAG(INPCK),
182521fa314SDavid van Moolenbroek 	FLAG(ISTRIP),
183521fa314SDavid van Moolenbroek 	FLAG(INLCR),
184521fa314SDavid van Moolenbroek 	FLAG(IGNCR),
185521fa314SDavid van Moolenbroek 	FLAG(ICRNL),
186521fa314SDavid van Moolenbroek 	FLAG(IXON),
187521fa314SDavid van Moolenbroek 	FLAG(IXOFF),
188521fa314SDavid van Moolenbroek 	FLAG(IXANY),
189521fa314SDavid van Moolenbroek 	FLAG(IMAXBEL),
190521fa314SDavid van Moolenbroek };
191521fa314SDavid van Moolenbroek 
192521fa314SDavid van Moolenbroek static const struct flags tc_oflags[] = {
193521fa314SDavid van Moolenbroek 	FLAG(OPOST),
194521fa314SDavid van Moolenbroek 	FLAG(ONLCR),
195521fa314SDavid van Moolenbroek 	FLAG(OXTABS),
196521fa314SDavid van Moolenbroek 	FLAG(ONOEOT),
197521fa314SDavid van Moolenbroek 	FLAG(OCRNL),
198521fa314SDavid van Moolenbroek 	FLAG(ONOCR),
199521fa314SDavid van Moolenbroek 	FLAG(ONLRET),
200521fa314SDavid van Moolenbroek };
201521fa314SDavid van Moolenbroek 
202521fa314SDavid van Moolenbroek static const struct flags tc_cflags[] = {
203521fa314SDavid van Moolenbroek 	FLAG(CIGNORE),
204521fa314SDavid van Moolenbroek 	FLAG_MASK(CSIZE, CS5),
205521fa314SDavid van Moolenbroek 	FLAG_MASK(CSIZE, CS6),
206521fa314SDavid van Moolenbroek 	FLAG_MASK(CSIZE, CS7),
207521fa314SDavid van Moolenbroek 	FLAG_MASK(CSIZE, CS8),
208521fa314SDavid van Moolenbroek 	FLAG(CSTOPB),
209521fa314SDavid van Moolenbroek 	FLAG(CREAD),
210521fa314SDavid van Moolenbroek 	FLAG(PARENB),
211521fa314SDavid van Moolenbroek 	FLAG(PARODD),
212521fa314SDavid van Moolenbroek 	FLAG(HUPCL),
213521fa314SDavid van Moolenbroek 	FLAG(CLOCAL),
214521fa314SDavid van Moolenbroek 	FLAG(CRTSCTS),
215521fa314SDavid van Moolenbroek 	FLAG(CDTRCTS),
216521fa314SDavid van Moolenbroek 	FLAG(MDMBUF),
217521fa314SDavid van Moolenbroek };
218521fa314SDavid van Moolenbroek 
219521fa314SDavid van Moolenbroek static const struct flags tc_lflags[] = {
220521fa314SDavid van Moolenbroek 	FLAG(ECHOKE),
221521fa314SDavid van Moolenbroek 	FLAG(ECHOE),
222521fa314SDavid van Moolenbroek 	FLAG(ECHOK),
223521fa314SDavid van Moolenbroek 	FLAG(ECHO),
224521fa314SDavid van Moolenbroek 	FLAG(ECHONL),
225521fa314SDavid van Moolenbroek 	FLAG(ECHOPRT),
226521fa314SDavid van Moolenbroek 	FLAG(ECHOCTL),
227521fa314SDavid van Moolenbroek 	FLAG(ISIG),
228521fa314SDavid van Moolenbroek 	FLAG(ICANON),
229521fa314SDavid van Moolenbroek 	FLAG(ALTWERASE),
230521fa314SDavid van Moolenbroek 	FLAG(IEXTEN),
231521fa314SDavid van Moolenbroek 	FLAG(EXTPROC),
232521fa314SDavid van Moolenbroek 	FLAG(TOSTOP),
233521fa314SDavid van Moolenbroek 	FLAG(FLUSHO),
234521fa314SDavid van Moolenbroek 	FLAG(NOKERNINFO),
235521fa314SDavid van Moolenbroek 	FLAG(PENDIN),
236521fa314SDavid van Moolenbroek 	FLAG(NOFLSH),
237521fa314SDavid van Moolenbroek };
238521fa314SDavid van Moolenbroek 
239521fa314SDavid van Moolenbroek static void
put_tty_disc(struct trace_proc * proc,const char * name,int disc)240521fa314SDavid van Moolenbroek put_tty_disc(struct trace_proc * proc, const char * name, int disc)
241521fa314SDavid van Moolenbroek {
242521fa314SDavid van Moolenbroek 	const char *text = NULL;
243521fa314SDavid van Moolenbroek 
244521fa314SDavid van Moolenbroek 	if (!valuesonly) {
245521fa314SDavid van Moolenbroek 		switch (disc) {
246521fa314SDavid van Moolenbroek 		TEXT(TTYDISC);
247521fa314SDavid van Moolenbroek 		TEXT(TABLDISC);
248521fa314SDavid van Moolenbroek 		TEXT(SLIPDISC);
249521fa314SDavid van Moolenbroek 		TEXT(PPPDISC);
250521fa314SDavid van Moolenbroek 		TEXT(STRIPDISC);
251521fa314SDavid van Moolenbroek 		TEXT(HDLCDISC);
252521fa314SDavid van Moolenbroek 		}
253521fa314SDavid van Moolenbroek 	}
254521fa314SDavid van Moolenbroek 
255521fa314SDavid van Moolenbroek 	if (text != NULL)
256521fa314SDavid van Moolenbroek 		put_field(proc, name, text);
257521fa314SDavid van Moolenbroek 	else
258521fa314SDavid van Moolenbroek 		put_value(proc, name, "%d", disc);
259521fa314SDavid van Moolenbroek }
260521fa314SDavid van Moolenbroek 
261521fa314SDavid van Moolenbroek static const struct flags kbd_leds[] = {
262521fa314SDavid van Moolenbroek 	FLAG(KBD_LEDS_NUM),
263521fa314SDavid van Moolenbroek 	FLAG(KBD_LEDS_CAPS),
264521fa314SDavid van Moolenbroek 	FLAG(KBD_LEDS_SCROLL),
265521fa314SDavid van Moolenbroek };
266521fa314SDavid van Moolenbroek 
267521fa314SDavid van Moolenbroek int
char_ioctl_arg(struct trace_proc * proc,unsigned long req,void * ptr,int dir)268521fa314SDavid van Moolenbroek char_ioctl_arg(struct trace_proc * proc, unsigned long req, void * ptr,
269521fa314SDavid van Moolenbroek 	int dir)
270521fa314SDavid van Moolenbroek {
271521fa314SDavid van Moolenbroek 	minix_i2c_ioctl_exec_t *iie;
272521fa314SDavid van Moolenbroek 	struct fb_var_screeninfo *fbvs;
273521fa314SDavid van Moolenbroek 	struct volume_level *level;
274521fa314SDavid van Moolenbroek 	struct inout_ctrl *inout;
275521fa314SDavid van Moolenbroek 	struct termios *tc;
276*da21d850SDavid van Moolenbroek 	struct ptmget *pm;
277521fa314SDavid van Moolenbroek 	struct winsize *ws;
278521fa314SDavid van Moolenbroek 	struct kio_bell *bell;
279521fa314SDavid van Moolenbroek 	struct kio_leds *leds;
2805d831176SLionel Sambuc 	struct pciio_cfgreg *pci_cfgreg;
2815d831176SLionel Sambuc 	struct pciio_bdf_cfgreg *pci_bdf_cfgreg;
2825d831176SLionel Sambuc 	struct pciio_businfo *pci_businfo;
2835d831176SLionel Sambuc 	struct pciio_map *pci_iomap;
2845d831176SLionel Sambuc 	struct pciio_acl *pci_acl;
2855d831176SLionel Sambuc 
286521fa314SDavid van Moolenbroek 	switch (req) {
287521fa314SDavid van Moolenbroek 	case MINIX_I2C_IOCTL_EXEC:
288521fa314SDavid van Moolenbroek 		if ((iie = (minix_i2c_ioctl_exec_t *)ptr) == NULL)
289521fa314SDavid van Moolenbroek 			return IF_OUT; /* we print only the request for now */
290521fa314SDavid van Moolenbroek 
291521fa314SDavid van Moolenbroek 		put_i2c_op(proc, "iie_op", iie->iie_op);
292521fa314SDavid van Moolenbroek 		put_value(proc, "iie_addr", "0x%04x", iie->iie_addr);
293521fa314SDavid van Moolenbroek 		return 0; /* TODO: print command/data/result */
294521fa314SDavid van Moolenbroek 
295521fa314SDavid van Moolenbroek 	case FBIOGET_VSCREENINFO:
296521fa314SDavid van Moolenbroek 		if ((fbvs = (struct fb_var_screeninfo *)ptr) == NULL)
297521fa314SDavid van Moolenbroek 			return IF_IN;
298521fa314SDavid van Moolenbroek 
299521fa314SDavid van Moolenbroek 		put_value(proc, "xres", "%"PRIu32, fbvs->xres);
300521fa314SDavid van Moolenbroek 		put_value(proc, "yres", "%"PRIu32, fbvs->yres);
301521fa314SDavid van Moolenbroek 		put_value(proc, "xres_virtual", "%"PRIu32, fbvs->xres_virtual);
302521fa314SDavid van Moolenbroek 		put_value(proc, "yres_virtual", "%"PRIu32, fbvs->yres_virtual);
303521fa314SDavid van Moolenbroek 		put_value(proc, "xoffset", "%"PRIu32, fbvs->xoffset);
304521fa314SDavid van Moolenbroek 		put_value(proc, "yoffset", "%"PRIu32, fbvs->yoffset);
305521fa314SDavid van Moolenbroek 		put_value(proc, "bits_per_pixel", "%"PRIu32,
306521fa314SDavid van Moolenbroek 		    fbvs->bits_per_pixel);
307521fa314SDavid van Moolenbroek 		return 0;
308521fa314SDavid van Moolenbroek 
309521fa314SDavid van Moolenbroek 	case FBIOPUT_VSCREENINFO:
310521fa314SDavid van Moolenbroek 	case FBIOPAN_DISPLAY:
311521fa314SDavid van Moolenbroek 		if ((fbvs = (struct fb_var_screeninfo *)ptr) == NULL)
312521fa314SDavid van Moolenbroek 			return IF_OUT;
313521fa314SDavid van Moolenbroek 
314521fa314SDavid van Moolenbroek 		put_value(proc, "xoffset", "%"PRIu32, fbvs->xoffset);
315521fa314SDavid van Moolenbroek 		put_value(proc, "yoffset", "%"PRIu32, fbvs->yoffset);
316521fa314SDavid van Moolenbroek 		return 0;
317521fa314SDavid van Moolenbroek 
318521fa314SDavid van Moolenbroek 	case DSPIORATE:
319521fa314SDavid van Moolenbroek 	case DSPIOSTEREO:
320521fa314SDavid van Moolenbroek 	case DSPIOSIZE:
321521fa314SDavid van Moolenbroek 	case DSPIOBITS:
322521fa314SDavid van Moolenbroek 	case DSPIOSIGN:
323521fa314SDavid van Moolenbroek 	case DSPIOMAX:
324521fa314SDavid van Moolenbroek 	case DSPIOFREEBUF:
325521fa314SDavid van Moolenbroek 	case DSPIOSAMPLESINBUF:
326521fa314SDavid van Moolenbroek 		if (ptr == NULL)
327521fa314SDavid van Moolenbroek 			return dir;
328521fa314SDavid van Moolenbroek 
329521fa314SDavid van Moolenbroek 		put_value(proc, NULL, "%u", *(unsigned int *)ptr);
330521fa314SDavid van Moolenbroek 		return IF_ALL;
331521fa314SDavid van Moolenbroek 
332521fa314SDavid van Moolenbroek 	case MIXIOGETVOLUME:
333521fa314SDavid van Moolenbroek 		if ((level = (struct volume_level *)ptr) == NULL)
334521fa314SDavid van Moolenbroek 			return dir;
335521fa314SDavid van Moolenbroek 
336521fa314SDavid van Moolenbroek 		if (dir == IF_OUT)
337521fa314SDavid van Moolenbroek 			put_sound_device(proc, "device", level->device);
338521fa314SDavid van Moolenbroek 		else {
339521fa314SDavid van Moolenbroek 			put_value(proc, "left", "%d", level->left);
340521fa314SDavid van Moolenbroek 			put_value(proc, "right", "%d", level->right);
341521fa314SDavid van Moolenbroek 		}
342521fa314SDavid van Moolenbroek 		return IF_ALL;
343521fa314SDavid van Moolenbroek 
344521fa314SDavid van Moolenbroek 	case MIXIOSETVOLUME:
345521fa314SDavid van Moolenbroek 		/* Print the corrected volume levels only with verbosity on. */
346521fa314SDavid van Moolenbroek 		if ((level = (struct volume_level *)ptr) == NULL)
347521fa314SDavid van Moolenbroek 			return IF_OUT | ((verbose > 0) ? IF_IN : 0);
348521fa314SDavid van Moolenbroek 
349521fa314SDavid van Moolenbroek 		if (dir == IF_OUT)
350521fa314SDavid van Moolenbroek 			put_sound_device(proc, "device", level->device);
351521fa314SDavid van Moolenbroek 		put_value(proc, "left", "%d", level->left);
352521fa314SDavid van Moolenbroek 		put_value(proc, "right", "%d", level->right);
353521fa314SDavid van Moolenbroek 		return IF_ALL;
354521fa314SDavid van Moolenbroek 
355521fa314SDavid van Moolenbroek 	case MIXIOGETINPUTLEFT:
356521fa314SDavid van Moolenbroek 	case MIXIOGETINPUTRIGHT:
357521fa314SDavid van Moolenbroek 	case MIXIOGETOUTPUT:
358521fa314SDavid van Moolenbroek 		if ((inout = (struct inout_ctrl *)ptr) == NULL)
359521fa314SDavid van Moolenbroek 			return dir;
360521fa314SDavid van Moolenbroek 
361521fa314SDavid van Moolenbroek 		if (dir == IF_OUT)
362521fa314SDavid van Moolenbroek 			put_sound_device(proc, "device", inout->device);
363521fa314SDavid van Moolenbroek 		else {
364521fa314SDavid van Moolenbroek 			put_sound_state(proc, "left", inout->left);
365521fa314SDavid van Moolenbroek 			put_sound_state(proc, "right", inout->right);
366521fa314SDavid van Moolenbroek 		}
367521fa314SDavid van Moolenbroek 		return IF_ALL;
368521fa314SDavid van Moolenbroek 
369521fa314SDavid van Moolenbroek 	case MIXIOSETINPUTLEFT:
370521fa314SDavid van Moolenbroek 	case MIXIOSETINPUTRIGHT:
371521fa314SDavid van Moolenbroek 	case MIXIOSETOUTPUT:
372521fa314SDavid van Moolenbroek 		if ((inout = (struct inout_ctrl *)ptr) == NULL)
373521fa314SDavid van Moolenbroek 			return IF_OUT;
374521fa314SDavid van Moolenbroek 
375521fa314SDavid van Moolenbroek 		put_sound_device(proc, "device", inout->device);
376521fa314SDavid van Moolenbroek 		put_sound_state(proc, "left", inout->left);
377521fa314SDavid van Moolenbroek 		put_sound_state(proc, "right", inout->right);
378521fa314SDavid van Moolenbroek 		return IF_ALL;
379521fa314SDavid van Moolenbroek 
380521fa314SDavid van Moolenbroek 	case TIOCFLUSH:
381521fa314SDavid van Moolenbroek 		if (ptr == NULL)
382521fa314SDavid van Moolenbroek 			return IF_OUT;
383521fa314SDavid van Moolenbroek 
384521fa314SDavid van Moolenbroek 		put_flags(proc, NULL, flush_flags, COUNT(flush_flags), "0x%x",
385521fa314SDavid van Moolenbroek 		    *(int *)ptr);
386521fa314SDavid van Moolenbroek 		return IF_ALL;
387521fa314SDavid van Moolenbroek 
388521fa314SDavid van Moolenbroek 	case TIOCGETA:
389521fa314SDavid van Moolenbroek 	case TIOCSETA:
390521fa314SDavid van Moolenbroek 	case TIOCSETAW:
391521fa314SDavid van Moolenbroek 	case TIOCSETAF:
392521fa314SDavid van Moolenbroek 		if ((tc = (struct termios *)ptr) == NULL)
393521fa314SDavid van Moolenbroek 			return dir;
394521fa314SDavid van Moolenbroek 
395521fa314SDavid van Moolenbroek 		/*
396521fa314SDavid van Moolenbroek 		 * These are fairly common IOCTLs, so printing everything by
397521fa314SDavid van Moolenbroek 		 * default would create a lot of noise.  By default we limit
398521fa314SDavid van Moolenbroek 		 * ourselves to printing the field that contains what I
399521fa314SDavid van Moolenbroek 		 * consider to be the most important flag: ICANON.
400521fa314SDavid van Moolenbroek 		 * TODO: see if we can come up with a decent format for
401521fa314SDavid van Moolenbroek 		 * selectively printing (relatively important) flags.
402521fa314SDavid van Moolenbroek 		 */
403521fa314SDavid van Moolenbroek 		if (verbose > 0) {
404521fa314SDavid van Moolenbroek 			put_flags(proc, "c_iflag", tc_iflags, COUNT(tc_iflags),
405521fa314SDavid van Moolenbroek 			    "0x%x", tc->c_iflag);
406521fa314SDavid van Moolenbroek 			put_flags(proc, "c_oflag", tc_oflags, COUNT(tc_oflags),
407521fa314SDavid van Moolenbroek 			    "0x%x", tc->c_oflag);
408521fa314SDavid van Moolenbroek 			put_flags(proc, "c_cflag", tc_cflags, COUNT(tc_cflags),
409521fa314SDavid van Moolenbroek 			    "0x%x", tc->c_cflag);
410521fa314SDavid van Moolenbroek 		}
411521fa314SDavid van Moolenbroek 		put_flags(proc, "c_lflag", tc_lflags, COUNT(tc_lflags), "0x%x",
412521fa314SDavid van Moolenbroek 			tc->c_lflag);
413521fa314SDavid van Moolenbroek 		if (verbose > 0) {
414521fa314SDavid van Moolenbroek 			put_value(proc, "c_ispeed", "%d", tc->c_ispeed);
415521fa314SDavid van Moolenbroek 			put_value(proc, "c_ospeed", "%d", tc->c_ospeed);
416521fa314SDavid van Moolenbroek 		}
417521fa314SDavid van Moolenbroek 		return 0; /* TODO: print the c_cc fields */
418521fa314SDavid van Moolenbroek 
419521fa314SDavid van Moolenbroek 	case TIOCGETD:
420521fa314SDavid van Moolenbroek 	case TIOCSETD:
421521fa314SDavid van Moolenbroek 		if (ptr == NULL)
422521fa314SDavid van Moolenbroek 			return dir;
423521fa314SDavid van Moolenbroek 
424521fa314SDavid van Moolenbroek 		put_tty_disc(proc, NULL, *(int *)ptr);
425521fa314SDavid van Moolenbroek 		return IF_ALL;
426521fa314SDavid van Moolenbroek 
427521fa314SDavid van Moolenbroek 	case TIOCGLINED:
428521fa314SDavid van Moolenbroek 	case TIOCSLINED:
429521fa314SDavid van Moolenbroek 		if (ptr == NULL)
430521fa314SDavid van Moolenbroek 			return dir;
431521fa314SDavid van Moolenbroek 
432521fa314SDavid van Moolenbroek 		put_buf(proc, NULL, PF_LOCADDR | PF_STRING, (vir_bytes)ptr,
433521fa314SDavid van Moolenbroek 		    sizeof(linedn_t));
434521fa314SDavid van Moolenbroek 		return IF_ALL;
435521fa314SDavid van Moolenbroek 
436521fa314SDavid van Moolenbroek 	case TIOCGPGRP:
437521fa314SDavid van Moolenbroek 	case TIOCSPGRP:
438521fa314SDavid van Moolenbroek 	case TIOCOUTQ:
439521fa314SDavid van Moolenbroek 	case TIOCPKT:
440521fa314SDavid van Moolenbroek 	case TIOCREMOTE:
441521fa314SDavid van Moolenbroek 	case TIOCUCNTL:
442521fa314SDavid van Moolenbroek 	case TIOCSTAT:		/* argument seems unused? */
443521fa314SDavid van Moolenbroek 	case TIOCGSID:
444521fa314SDavid van Moolenbroek 	case TIOCCONS:		/* argument seems unused? */
445521fa314SDavid van Moolenbroek 	case TIOCEXT:
446521fa314SDavid van Moolenbroek 	case TIOCSQSIZE:
447521fa314SDavid van Moolenbroek 	case TIOCGQSIZE:
448521fa314SDavid van Moolenbroek 		/* Print a simple integer. */
449521fa314SDavid van Moolenbroek 		if (ptr == NULL)
450521fa314SDavid van Moolenbroek 			return dir;
451521fa314SDavid van Moolenbroek 
452521fa314SDavid van Moolenbroek 		put_value(proc, NULL, "%d", *(int *)ptr);
453521fa314SDavid van Moolenbroek 		return IF_ALL;
454521fa314SDavid van Moolenbroek 
455*da21d850SDavid van Moolenbroek 	case TIOCPTSNAME:
456*da21d850SDavid van Moolenbroek 		if ((pm = (struct ptmget *)ptr) == NULL)
457*da21d850SDavid van Moolenbroek 			return IF_IN;
458*da21d850SDavid van Moolenbroek 
459*da21d850SDavid van Moolenbroek 		put_buf(proc, "sn", PF_LOCADDR | PF_STRING, (vir_bytes)pm->sn,
460*da21d850SDavid van Moolenbroek 		    sizeof(pm->sn));
461*da21d850SDavid van Moolenbroek 		return IF_ALL;
462*da21d850SDavid van Moolenbroek 
463521fa314SDavid van Moolenbroek 	case TIOCSTI:
464521fa314SDavid van Moolenbroek 		if (ptr == NULL)
465521fa314SDavid van Moolenbroek 			return dir;
466521fa314SDavid van Moolenbroek 
467521fa314SDavid van Moolenbroek 		if (!valuesonly)
468521fa314SDavid van Moolenbroek 			put_value(proc, NULL, "'%s'",
469521fa314SDavid van Moolenbroek 			    get_escape(*(char *)ptr));
470521fa314SDavid van Moolenbroek 		else
471521fa314SDavid van Moolenbroek 			put_value(proc, NULL, "%u", *(char *)ptr);
472521fa314SDavid van Moolenbroek 		return IF_ALL;
473521fa314SDavid van Moolenbroek 
474521fa314SDavid van Moolenbroek 	case TIOCGWINSZ:
475521fa314SDavid van Moolenbroek 	case TIOCSWINSZ:
476521fa314SDavid van Moolenbroek 		if ((ws = (struct winsize *)ptr) == NULL)
477521fa314SDavid van Moolenbroek 			return dir;
478521fa314SDavid van Moolenbroek 
479521fa314SDavid van Moolenbroek 		/* This is a stupid order, but we follow the struct layout. */
480521fa314SDavid van Moolenbroek 		put_value(proc, "ws_row", "%u", ws->ws_row);
481521fa314SDavid van Moolenbroek 		put_value(proc, "ws_col", "%u", ws->ws_col);
482521fa314SDavid van Moolenbroek 		if (verbose > 0) {
483521fa314SDavid van Moolenbroek 			put_value(proc, "ws_xpixel", "%u", ws->ws_xpixel);
484521fa314SDavid van Moolenbroek 			put_value(proc, "ws_ypixel", "%u", ws->ws_ypixel);
485521fa314SDavid van Moolenbroek 		}
486521fa314SDavid van Moolenbroek 		return (verbose > 0) ? IF_ALL : 0;
487521fa314SDavid van Moolenbroek 
488521fa314SDavid van Moolenbroek 	case KIOCBELL:
489521fa314SDavid van Moolenbroek 		if ((bell = (struct kio_bell *)ptr) == NULL)
490521fa314SDavid van Moolenbroek 			return IF_OUT;
491521fa314SDavid van Moolenbroek 
492521fa314SDavid van Moolenbroek 		put_value(proc, "kb_pitch", "%u", bell->kb_pitch);
493521fa314SDavid van Moolenbroek 		put_value(proc, "kb_volume", "%lu", bell->kb_volume);
494521fa314SDavid van Moolenbroek 		put_struct_timeval(proc, "kb_duration", PF_LOCADDR,
495521fa314SDavid van Moolenbroek 		    (vir_bytes)&bell->kb_duration);
496521fa314SDavid van Moolenbroek 
497521fa314SDavid van Moolenbroek 		return IF_ALL;
498521fa314SDavid van Moolenbroek 
499521fa314SDavid van Moolenbroek 	case KIOCSLEDS:
500521fa314SDavid van Moolenbroek 		if ((leds = (struct kio_leds *)ptr) == NULL)
501521fa314SDavid van Moolenbroek 			return IF_OUT;
502521fa314SDavid van Moolenbroek 
503521fa314SDavid van Moolenbroek 		put_flags(proc, "kl_bits", kbd_leds, COUNT(kbd_leds), "0x%x",
504521fa314SDavid van Moolenbroek 		    leds->kl_bits);
505521fa314SDavid van Moolenbroek 		return IF_ALL;
506521fa314SDavid van Moolenbroek 
5075d831176SLionel Sambuc 	case PCI_IOC_CFGREAD:
5085d831176SLionel Sambuc 		if ((pci_cfgreg = (struct pciio_cfgreg *)ptr) == NULL)
5095d831176SLionel Sambuc 			return IF_IN;
510521fa314SDavid van Moolenbroek 
5115d831176SLionel Sambuc 		put_ptr(proc, "reg", (vir_bytes)pci_cfgreg->reg);
5125d831176SLionel Sambuc 		put_value(proc, "val", "%08x", pci_cfgreg->val);
513521fa314SDavid van Moolenbroek 		return IF_ALL;
514521fa314SDavid van Moolenbroek 
5155d831176SLionel Sambuc 	case PCI_IOC_CFGWRITE:
5165d831176SLionel Sambuc 		if ((pci_cfgreg = (struct pciio_cfgreg *)ptr) == NULL)
517521fa314SDavid van Moolenbroek 			return IF_OUT;
518521fa314SDavid van Moolenbroek 
5195d831176SLionel Sambuc 		put_ptr(proc, "reg", (vir_bytes)pci_cfgreg->reg);
5205d831176SLionel Sambuc 		put_value(proc, "val", "%08x", pci_cfgreg->val);
5215d831176SLionel Sambuc 		return IF_ALL;
5225d831176SLionel Sambuc 
5235d831176SLionel Sambuc 	case PCI_IOC_BDF_CFGREAD:
5245d831176SLionel Sambuc 		if ((pci_bdf_cfgreg = (struct pciio_bdf_cfgreg *)ptr) == NULL)
5255d831176SLionel Sambuc 			return IF_IN;
5265d831176SLionel Sambuc 
5275d831176SLionel Sambuc 		put_value(proc, "bus", "%u", pci_bdf_cfgreg->bus);
5285d831176SLionel Sambuc 		put_value(proc, "device", "%u", pci_bdf_cfgreg->device);
5295d831176SLionel Sambuc 		put_value(proc, "function", "%u", pci_bdf_cfgreg->function);
5305d831176SLionel Sambuc 		put_ptr(proc, "cfgreg.reg", (vir_bytes)pci_bdf_cfgreg->cfgreg.reg);
5315d831176SLionel Sambuc 		put_value(proc, "cfgreg.val", "%08x", pci_bdf_cfgreg->cfgreg.val);
5325d831176SLionel Sambuc 		return IF_ALL;
5335d831176SLionel Sambuc 
5345d831176SLionel Sambuc 	case PCI_IOC_BDF_CFGWRITE:
5355d831176SLionel Sambuc 		if ((pci_bdf_cfgreg = (struct pciio_bdf_cfgreg *)ptr) == NULL)
5365d831176SLionel Sambuc 			return IF_OUT;
5375d831176SLionel Sambuc 
5385d831176SLionel Sambuc 		put_value(proc, "bus", "%u", pci_bdf_cfgreg->bus);
5395d831176SLionel Sambuc 		put_value(proc, "device", "%u", pci_bdf_cfgreg->device);
5405d831176SLionel Sambuc 		put_value(proc, "function", "%u", pci_bdf_cfgreg->function);
5415d831176SLionel Sambuc 		put_ptr(proc, "cfgreg.reg", (vir_bytes)pci_bdf_cfgreg->cfgreg.reg);
5425d831176SLionel Sambuc 		put_value(proc, "cfgreg.val", "%08x", pci_bdf_cfgreg->cfgreg.val);
5435d831176SLionel Sambuc 		return IF_ALL;
5445d831176SLionel Sambuc 
5455d831176SLionel Sambuc 	case PCI_IOC_BUSINFO:
5465d831176SLionel Sambuc 		if ((pci_businfo = (struct pciio_businfo *)ptr) == NULL)
5475d831176SLionel Sambuc 			return IF_IN;
5485d831176SLionel Sambuc 
5495d831176SLionel Sambuc 		put_value(proc, "busno", "%u", pci_businfo->busno);
5505d831176SLionel Sambuc 		put_value(proc, "maxdevs", "%u", pci_businfo->maxdevs);
5515d831176SLionel Sambuc 		return IF_ALL;
5525d831176SLionel Sambuc 
5535d831176SLionel Sambuc 	case PCI_IOC_MAP:
5545d831176SLionel Sambuc 		if ((pci_iomap = (struct pciio_map *)ptr) == NULL)
5555d831176SLionel Sambuc 			return IF_OUT|IF_IN;
5565d831176SLionel Sambuc 
5575d831176SLionel Sambuc 		put_value(proc, "flags", "%x", pci_iomap->flags);
5585d831176SLionel Sambuc 		put_value(proc, "phys_offset", "%08x", pci_iomap->phys_offset);
5595d831176SLionel Sambuc 		put_value(proc, "size", "%zu", pci_iomap->size);
5605d831176SLionel Sambuc 		put_value(proc, "readonly", "%x", pci_iomap->readonly);
5615d831176SLionel Sambuc 
5625d831176SLionel Sambuc 		if (IF_IN == dir)
5635d831176SLionel Sambuc 			put_ptr(proc, "vaddr_ret", (vir_bytes)pci_iomap->vaddr_ret);
5645d831176SLionel Sambuc 
5655d831176SLionel Sambuc 		return IF_ALL;
5665d831176SLionel Sambuc 
5675d831176SLionel Sambuc 	case PCI_IOC_UNMAP:
5685d831176SLionel Sambuc 		if ((pci_iomap = (struct pciio_map *)ptr) == NULL)
5695d831176SLionel Sambuc 			return IF_OUT;
5705d831176SLionel Sambuc 
5715d831176SLionel Sambuc 		put_ptr(proc, "vaddr", (vir_bytes)pci_iomap->vaddr);
5725d831176SLionel Sambuc 
5735d831176SLionel Sambuc 		return IF_ALL;
5745d831176SLionel Sambuc 
5755d831176SLionel Sambuc 	case PCI_IOC_RESERVE:
5765d831176SLionel Sambuc 		if ((pci_acl = (struct pciio_acl *)ptr) == NULL)
5775d831176SLionel Sambuc 			return IF_OUT;
5785d831176SLionel Sambuc 
5795d831176SLionel Sambuc 		put_value(proc, "domain", "%u", pci_acl->domain);
5805d831176SLionel Sambuc 		put_value(proc, "bus", "%u", pci_acl->bus);
5815d831176SLionel Sambuc 		put_value(proc, "device", "%u", pci_acl->device);
5825d831176SLionel Sambuc 		put_value(proc, "function", "%u", pci_acl->function);
5835d831176SLionel Sambuc 
5845d831176SLionel Sambuc 		return IF_ALL;
5855d831176SLionel Sambuc 	case PCI_IOC_RELEASE:
5865d831176SLionel Sambuc 		if ((pci_acl = (struct pciio_acl *)ptr) == NULL)
5875d831176SLionel Sambuc 			return IF_OUT;
5885d831176SLionel Sambuc 
5895d831176SLionel Sambuc 		put_value(proc, "domain", "%u", pci_acl->domain);
5905d831176SLionel Sambuc 		put_value(proc, "bus", "%u", pci_acl->bus);
5915d831176SLionel Sambuc 		put_value(proc, "device", "%u", pci_acl->device);
5925d831176SLionel Sambuc 		put_value(proc, "function", "%u", pci_acl->function);
5935d831176SLionel Sambuc 
594521fa314SDavid van Moolenbroek 		return IF_ALL;
595521fa314SDavid van Moolenbroek 
596521fa314SDavid van Moolenbroek 	default:
597521fa314SDavid van Moolenbroek 		return 0;
598521fa314SDavid van Moolenbroek 	}
599521fa314SDavid van Moolenbroek }
600