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