xref: /minix3/minix/usr.bin/trace/ioctl/block.c (revision 5d8311761ae7323bec60c9a7a6f7b4c73ec44455)
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