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/partition.h>
6*521fa314SDavid van Moolenbroek #include <sys/mtio.h>
7*521fa314SDavid van Moolenbroek
8*521fa314SDavid van Moolenbroek const char *
block_ioctl_name(unsigned long req)9*521fa314SDavid van Moolenbroek block_ioctl_name(unsigned long req)
10*521fa314SDavid van Moolenbroek {
11*521fa314SDavid van Moolenbroek
12*521fa314SDavid van Moolenbroek switch (req) {
13*521fa314SDavid van Moolenbroek NAME(BIOCTRACEBUF);
14*521fa314SDavid van Moolenbroek NAME(BIOCTRACECTL);
15*521fa314SDavid van Moolenbroek NAME(BIOCTRACEGET); /* big IOCTL, not printing argument */
16*521fa314SDavid van Moolenbroek NAME(DIOCSETP);
17*521fa314SDavid van Moolenbroek NAME(DIOCGETP);
18*521fa314SDavid van Moolenbroek NAME(DIOCEJECT); /* no argument */
19*521fa314SDavid van Moolenbroek NAME(DIOCTIMEOUT);
20*521fa314SDavid van Moolenbroek NAME(DIOCOPENCT);
21*521fa314SDavid van Moolenbroek NAME(DIOCFLUSH); /* no argument */
22*521fa314SDavid van Moolenbroek NAME(DIOCGETWC);
23*521fa314SDavid van Moolenbroek NAME(DIOCSETWC);
24*521fa314SDavid van Moolenbroek NAME(FBDCADDRULE);
25*521fa314SDavid van Moolenbroek NAME(FBDCDELRULE);
26*521fa314SDavid van Moolenbroek NAME(FBDCGETRULE);
27*521fa314SDavid van Moolenbroek NAME(MIOCRAMSIZE);
28*521fa314SDavid van Moolenbroek NAME(MTIOCGET); /* TODO: print argument */
29*521fa314SDavid van Moolenbroek NAME(MTIOCTOP); /* TODO: print argument */
30*521fa314SDavid van Moolenbroek NAME(VNDIOCCLR);
31*521fa314SDavid van Moolenbroek NAME(VNDIOCGET);
32*521fa314SDavid van Moolenbroek NAME(VNDIOCSET);
33*521fa314SDavid van Moolenbroek }
34*521fa314SDavid van Moolenbroek
35*521fa314SDavid van Moolenbroek return NULL;
36*521fa314SDavid van Moolenbroek }
37*521fa314SDavid van Moolenbroek
38*521fa314SDavid van Moolenbroek static const struct flags fbd_flags[] = {
39*521fa314SDavid van Moolenbroek FLAG(FBD_FLAG_READ),
40*521fa314SDavid van Moolenbroek FLAG(FBD_FLAG_WRITE),
41*521fa314SDavid van Moolenbroek };
42*521fa314SDavid van Moolenbroek
43*521fa314SDavid van Moolenbroek static void
put_fbd_action(struct trace_proc * proc,const char * name,int action)44*521fa314SDavid van Moolenbroek put_fbd_action(struct trace_proc * proc, const char * name, int action)
45*521fa314SDavid van Moolenbroek {
46*521fa314SDavid van Moolenbroek const char *text = NULL;
47*521fa314SDavid van Moolenbroek
48*521fa314SDavid van Moolenbroek if (!valuesonly) {
49*521fa314SDavid van Moolenbroek switch (action) {
50*521fa314SDavid van Moolenbroek TEXT(FBD_ACTION_CORRUPT);
51*521fa314SDavid van Moolenbroek TEXT(FBD_ACTION_ERROR);
52*521fa314SDavid van Moolenbroek TEXT(FBD_ACTION_MISDIR);
53*521fa314SDavid van Moolenbroek TEXT(FBD_ACTION_LOSTTORN);
54*521fa314SDavid van Moolenbroek }
55*521fa314SDavid van Moolenbroek }
56*521fa314SDavid van Moolenbroek
57*521fa314SDavid van Moolenbroek if (text != NULL)
58*521fa314SDavid van Moolenbroek put_field(proc, name, text);
59*521fa314SDavid van Moolenbroek else
60*521fa314SDavid van Moolenbroek put_value(proc, name, "%d", action);
61*521fa314SDavid van Moolenbroek }
62*521fa314SDavid van Moolenbroek
63*521fa314SDavid van Moolenbroek static const struct flags vnd_flags[] = {
64*521fa314SDavid van Moolenbroek FLAG(VNDIOF_HASGEOM),
65*521fa314SDavid van Moolenbroek FLAG(VNDIOF_READONLY),
66*521fa314SDavid van Moolenbroek FLAG(VNDIOF_FORCE),
67*521fa314SDavid van Moolenbroek };
68*521fa314SDavid van Moolenbroek
69*521fa314SDavid van Moolenbroek int
block_ioctl_arg(struct trace_proc * proc,unsigned long req,void * ptr,int dir)70*521fa314SDavid van Moolenbroek block_ioctl_arg(struct trace_proc * proc, unsigned long req, void * ptr,
71*521fa314SDavid van Moolenbroek int dir)
72*521fa314SDavid van Moolenbroek {
73*521fa314SDavid van Moolenbroek struct part_geom *part;
74*521fa314SDavid van Moolenbroek struct fbd_rule *rule;
75*521fa314SDavid van Moolenbroek struct vnd_ioctl *vnd;
76*521fa314SDavid van Moolenbroek struct vnd_user *vnu;
77*521fa314SDavid van Moolenbroek int i;
78*521fa314SDavid van Moolenbroek
79*521fa314SDavid van Moolenbroek switch (req) {
80*521fa314SDavid van Moolenbroek case BIOCTRACEBUF:
81*521fa314SDavid van Moolenbroek if (ptr == NULL)
82*521fa314SDavid van Moolenbroek return IF_OUT;
83*521fa314SDavid van Moolenbroek
84*521fa314SDavid van Moolenbroek put_value(proc, NULL, "%zu", *(size_t *)ptr);
85*521fa314SDavid van Moolenbroek return IF_ALL;
86*521fa314SDavid van Moolenbroek
87*521fa314SDavid van Moolenbroek case BIOCTRACECTL:
88*521fa314SDavid van Moolenbroek if (ptr == NULL)
89*521fa314SDavid van Moolenbroek return IF_OUT;
90*521fa314SDavid van Moolenbroek
91*521fa314SDavid van Moolenbroek i = *(int *)ptr;
92*521fa314SDavid van Moolenbroek if (!valuesonly && i == BTCTL_START)
93*521fa314SDavid van Moolenbroek put_field(proc, NULL, "BTCTL_START");
94*521fa314SDavid van Moolenbroek else if (!valuesonly && i == BTCTL_STOP)
95*521fa314SDavid van Moolenbroek put_field(proc, NULL, "BTCTL_STOP");
96*521fa314SDavid van Moolenbroek else
97*521fa314SDavid van Moolenbroek put_value(proc, NULL, "%d", i);
98*521fa314SDavid van Moolenbroek return IF_ALL;
99*521fa314SDavid van Moolenbroek
100*521fa314SDavid van Moolenbroek case DIOCSETP:
101*521fa314SDavid van Moolenbroek if ((part = (struct part_geom *)ptr) == NULL)
102*521fa314SDavid van Moolenbroek return IF_OUT;
103*521fa314SDavid van Moolenbroek
104*521fa314SDavid van Moolenbroek put_value(proc, "base", "%"PRIu64, part->base);
105*521fa314SDavid van Moolenbroek put_value(proc, "size", "%"PRIu64, part->size);
106*521fa314SDavid van Moolenbroek return IF_ALL;
107*521fa314SDavid van Moolenbroek
108*521fa314SDavid van Moolenbroek case DIOCGETP:
109*521fa314SDavid van Moolenbroek if ((part = (struct part_geom *)ptr) == NULL)
110*521fa314SDavid van Moolenbroek return IF_IN;
111*521fa314SDavid van Moolenbroek
112*521fa314SDavid van Moolenbroek put_value(proc, "base", "%"PRIu64, part->base);
113*521fa314SDavid van Moolenbroek put_value(proc, "size", "%"PRIu64, part->size);
114*521fa314SDavid van Moolenbroek if (verbose > 0) {
115*521fa314SDavid van Moolenbroek put_value(proc, "cylinders", "%u", part->cylinders);
116*521fa314SDavid van Moolenbroek put_value(proc, "heads", "%u", part->heads);
117*521fa314SDavid van Moolenbroek put_value(proc, "sectors", "%u", part->sectors);
118*521fa314SDavid van Moolenbroek return IF_ALL;
119*521fa314SDavid van Moolenbroek } else
120*521fa314SDavid van Moolenbroek return 0;
121*521fa314SDavid van Moolenbroek
122*521fa314SDavid van Moolenbroek case DIOCTIMEOUT:
123*521fa314SDavid van Moolenbroek /* Print the old timeout only if verbosity is high enough. */
124*521fa314SDavid van Moolenbroek if (ptr == NULL)
125*521fa314SDavid van Moolenbroek return IF_OUT | ((verbose > 0) ? IF_IN : 0);
126*521fa314SDavid van Moolenbroek
127*521fa314SDavid van Moolenbroek /* Same action for out and in. */
128*521fa314SDavid van Moolenbroek put_value(proc, NULL, "%d", *(int *)ptr);
129*521fa314SDavid van Moolenbroek return IF_ALL;
130*521fa314SDavid van Moolenbroek
131*521fa314SDavid van Moolenbroek case DIOCOPENCT:
132*521fa314SDavid van Moolenbroek if (ptr == NULL)
133*521fa314SDavid van Moolenbroek return IF_IN;
134*521fa314SDavid van Moolenbroek
135*521fa314SDavid van Moolenbroek put_value(proc, NULL, "%d", *(int *)ptr);
136*521fa314SDavid van Moolenbroek return IF_ALL;
137*521fa314SDavid van Moolenbroek
138*521fa314SDavid van Moolenbroek case DIOCSETWC:
139*521fa314SDavid van Moolenbroek case DIOCGETWC:
140*521fa314SDavid van Moolenbroek if (ptr == NULL)
141*521fa314SDavid van Moolenbroek return dir; /* out or in, depending on the request */
142*521fa314SDavid van Moolenbroek
143*521fa314SDavid van Moolenbroek put_value(proc, NULL, "%d", *(int *)ptr);
144*521fa314SDavid van Moolenbroek return IF_ALL;
145*521fa314SDavid van Moolenbroek
146*521fa314SDavid van Moolenbroek case FBDCDELRULE:
147*521fa314SDavid van Moolenbroek if (ptr == NULL)
148*521fa314SDavid van Moolenbroek return IF_OUT;
149*521fa314SDavid van Moolenbroek
150*521fa314SDavid van Moolenbroek put_value(proc, NULL, "%d", *(fbd_rulenum_t *)ptr);
151*521fa314SDavid van Moolenbroek return IF_ALL;
152*521fa314SDavid van Moolenbroek
153*521fa314SDavid van Moolenbroek case FBDCGETRULE:
154*521fa314SDavid van Moolenbroek if ((rule = (struct fbd_rule *)ptr) == NULL)
155*521fa314SDavid van Moolenbroek return IF_OUT | IF_IN;
156*521fa314SDavid van Moolenbroek
157*521fa314SDavid van Moolenbroek if (dir == IF_OUT) {
158*521fa314SDavid van Moolenbroek put_value(proc, "num", "%d", rule->num);
159*521fa314SDavid van Moolenbroek return IF_ALL;
160*521fa314SDavid van Moolenbroek }
161*521fa314SDavid van Moolenbroek
162*521fa314SDavid van Moolenbroek /*
163*521fa314SDavid van Moolenbroek * The returned result is the same as what is passed to the
164*521fa314SDavid van Moolenbroek * add request, so we can use the same code to print both.
165*521fa314SDavid van Moolenbroek */
166*521fa314SDavid van Moolenbroek /* FALLTHROUGH */
167*521fa314SDavid van Moolenbroek case FBDCADDRULE:
168*521fa314SDavid van Moolenbroek if ((rule = (struct fbd_rule *)ptr) == NULL)
169*521fa314SDavid van Moolenbroek return IF_OUT;
170*521fa314SDavid van Moolenbroek
171*521fa314SDavid van Moolenbroek if (rule->start != 0 || rule->end != 0 || verbose > 0) {
172*521fa314SDavid van Moolenbroek put_value(proc, "start", "%"PRIu64, rule->start);
173*521fa314SDavid van Moolenbroek put_value(proc, "end", "%"PRIu64, rule->end);
174*521fa314SDavid van Moolenbroek }
175*521fa314SDavid van Moolenbroek if (rule->flags != (FBD_FLAG_READ | FBD_FLAG_WRITE) ||
176*521fa314SDavid van Moolenbroek verbose > 0)
177*521fa314SDavid van Moolenbroek put_flags(proc, "flags", fbd_flags, COUNT(fbd_flags),
178*521fa314SDavid van Moolenbroek "0x%x", rule->flags);
179*521fa314SDavid van Moolenbroek if (rule->skip != 0 || verbose > 0)
180*521fa314SDavid van Moolenbroek put_value(proc, "skip", "%u", rule->skip);
181*521fa314SDavid van Moolenbroek if (rule->count != 0 || verbose > 0)
182*521fa314SDavid van Moolenbroek put_value(proc, "count", "%u", rule->count);
183*521fa314SDavid van Moolenbroek put_fbd_action(proc, "action", rule->action);
184*521fa314SDavid van Moolenbroek
185*521fa314SDavid van Moolenbroek return 0; /* TODO: optionally print the union fields */
186*521fa314SDavid van Moolenbroek
187*521fa314SDavid van Moolenbroek case MIOCRAMSIZE:
188*521fa314SDavid van Moolenbroek if (ptr == NULL)
189*521fa314SDavid van Moolenbroek return IF_OUT;
190*521fa314SDavid van Moolenbroek
191*521fa314SDavid van Moolenbroek put_value(proc, NULL, "%"PRIu32, *(u32_t *)ptr);
192*521fa314SDavid van Moolenbroek return IF_ALL;
193*521fa314SDavid van Moolenbroek
194*521fa314SDavid van Moolenbroek case VNDIOCSET:
195*521fa314SDavid van Moolenbroek if ((vnd = (struct vnd_ioctl *)ptr) == NULL)
196*521fa314SDavid van Moolenbroek return IF_OUT | IF_IN;
197*521fa314SDavid van Moolenbroek
198*521fa314SDavid van Moolenbroek if (dir == IF_OUT) {
199*521fa314SDavid van Moolenbroek put_value(proc, "vnd_fildes", "%d", vnd->vnd_fildes);
200*521fa314SDavid van Moolenbroek put_flags(proc, "vnd_flags", vnd_flags,
201*521fa314SDavid van Moolenbroek COUNT(vnd_flags), "0x%x", vnd->vnd_flags);
202*521fa314SDavid van Moolenbroek return 0; /* TODO: print geometry if given */
203*521fa314SDavid van Moolenbroek } else {
204*521fa314SDavid van Moolenbroek put_value(proc, "vnd_size", "%"PRIu64, vnd->vnd_size);
205*521fa314SDavid van Moolenbroek return IF_ALL;
206*521fa314SDavid van Moolenbroek }
207*521fa314SDavid van Moolenbroek
208*521fa314SDavid van Moolenbroek case VNDIOCCLR:
209*521fa314SDavid van Moolenbroek if ((vnd = (struct vnd_ioctl *)ptr) == NULL)
210*521fa314SDavid van Moolenbroek return IF_OUT;
211*521fa314SDavid van Moolenbroek
212*521fa314SDavid van Moolenbroek put_flags(proc, "vnd_flags", vnd_flags, COUNT(vnd_flags),
213*521fa314SDavid van Moolenbroek "0x%x", vnd->vnd_flags);
214*521fa314SDavid van Moolenbroek return IF_ALL;
215*521fa314SDavid van Moolenbroek
216*521fa314SDavid van Moolenbroek case VNDIOCGET:
217*521fa314SDavid van Moolenbroek if ((vnu = (struct vnd_user *)ptr) == NULL)
218*521fa314SDavid van Moolenbroek return IF_IN;
219*521fa314SDavid van Moolenbroek
220*521fa314SDavid van Moolenbroek put_value(proc, "vnu_unit", "%d", vnu->vnu_unit);
221*521fa314SDavid van Moolenbroek put_dev(proc, "vnu_dev", vnu->vnu_dev);
222*521fa314SDavid van Moolenbroek put_value(proc, "vnu_ino", "%"PRId64, vnu->vnu_ino);
223*521fa314SDavid van Moolenbroek return IF_ALL;
224*521fa314SDavid van Moolenbroek
225*521fa314SDavid van Moolenbroek default:
226*521fa314SDavid van Moolenbroek return 0;
227*521fa314SDavid van Moolenbroek }
228*521fa314SDavid van Moolenbroek }
229