• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Basic ioctl scalar tests. */
2 
3 #define __EXTENSIONS__ 1
4 
5 #include "scalar.h"
6 
7 #include <net/if.h>
8 #include <sys/crypto/ioctl.h>
9 #include <sys/dtrace.h>
10 #include <sys/filio.h>
11 #include <sys/stat.h>		/* for _ST_FSTYPSZ */
12 #include <sys/mntio.h>
13 #include <sys/mnttab.h>
14 #include <sys/pool_impl.h>
15 #include <sys/sockio.h>
16 #include <sys/stropts.h>
17 #include <sys/termios.h>
18 
19 /* pools */
20 __attribute__((noinline))
sys_ioctl_POOL_STATUSQ(void)21 static void sys_ioctl_POOL_STATUSQ(void)
22 {
23    GO(SYS_ioctl, "(POOL_STATUSQ) 3s 1m");
24    SY(SYS_ioctl, x0 - 1, x0 + POOL_STATUSQ, x0); FAIL;
25 }
26 
27 /* mntio */
28 __attribute__((noinline))
sys_ioctl_MNTIOC_GETMNTANY(void)29 static void sys_ioctl_MNTIOC_GETMNTANY(void)
30 {
31    GO(SYS_ioctl, "(MNTIOC_GETMNTANY) 3s 1m");
32    SY(SYS_ioctl, x0 - 1, x0 + MNTIOC_GETMNTANY, x0 + 1); FAIL;
33 }
34 
35 __attribute__((noinline))
sys_ioctl_MNTIOC_GETMNTANY_2(void)36 static void sys_ioctl_MNTIOC_GETMNTANY_2(void)
37 {
38    struct mntentbuf embuf;
39 
40    embuf.mbuf_emp = (void *) (x0 + 1);
41    embuf.mbuf_buf = (void *) (x0 + 1);
42    embuf.mbuf_bufsize = x0 + 1;
43 
44    GO(SYS_ioctl, "(MNTIOC_GETMNTANY) 4s 2m");
45    SY(SYS_ioctl, x0 - 1, x0 + MNTIOC_GETMNTANY, &embuf + x0); FAIL;
46 }
47 
48 __attribute__((noinline))
sys_ioctl_MNTIOC_GETMNTANY_3(void)49 static void sys_ioctl_MNTIOC_GETMNTANY_3(void)
50 {
51    struct mnttab mnt;
52    struct mntentbuf embuf;
53 
54    mnt.mnt_special = (void *) (x0 + 1);
55    mnt.mnt_mountp = (void *) (x0 + 1);
56    mnt.mnt_fstype = (void *) (x0 + 1);
57    mnt.mnt_mntopts = (void *) (x0 + 1);
58    mnt.mnt_time = (void *) (x0 + 1);
59 
60    embuf.mbuf_emp = x0 + (struct extmnttab *) &mnt;
61    embuf.mbuf_buf = (void *) (x0 + 1);
62    embuf.mbuf_bufsize = x0 + 1;
63 
64    GO(SYS_ioctl, "(MNTIOC_GETMNTANY) 5s 6m");
65    SY(SYS_ioctl, x0 - 1, x0 + MNTIOC_GETMNTANY, &embuf + x0); FAIL;
66 }
67 
68 /* termio/termios */
69 __attribute__((noinline))
sys_ioctl_TCGETA(void)70 static void sys_ioctl_TCGETA(void)
71 {
72    GO(SYS_ioctl, "(TCGETA) 3s 1m");
73    SY(SYS_ioctl, x0 - 1, x0 + TCGETA, x0); FAIL;
74 }
75 
76 __attribute__((noinline))
sys_ioctl_TCGETS(void)77 static void sys_ioctl_TCGETS(void)
78 {
79    GO(SYS_ioctl, "(TCGETS) 3s 1m");
80    SY(SYS_ioctl, x0 - 1, x0 + TCGETS, x0); FAIL;
81 }
82 
83 __attribute__((noinline))
sys_ioctl_TCSETS(void)84 static void sys_ioctl_TCSETS(void)
85 {
86    GO(SYS_ioctl, "(TCSETS) 3s 1m");
87    SY(SYS_ioctl, x0 - 1, x0 + TCSETS, x0); FAIL;
88 }
89 
90 __attribute__((noinline))
sys_ioctl_TCSETSW(void)91 static void sys_ioctl_TCSETSW(void)
92 {
93    GO(SYS_ioctl, "(TCSETSW) 3s 1m");
94    SY(SYS_ioctl, x0 - 1, x0 + TCSETSW, x0); FAIL;
95 }
96 
97 __attribute__((noinline))
sys_ioctl_TCSETSF(void)98 static void sys_ioctl_TCSETSF(void)
99 {
100    GO(SYS_ioctl, "(TCSETSF) 3s 1m");
101    SY(SYS_ioctl, x0 - 1, x0 + TCSETSF, x0); FAIL;
102 }
103 
104 __attribute__((noinline))
sys_ioctl_TIOCGWINSZ(void)105 static void sys_ioctl_TIOCGWINSZ(void)
106 {
107    GO(SYS_ioctl, "(TIOCGWINSZ) 3s 1m");
108    SY(SYS_ioctl, x0 - 1, x0 + TIOCGWINSZ, x0); FAIL;
109 }
110 
111 __attribute__((noinline))
sys_ioctl_TIOCSWINSZ(void)112 static void sys_ioctl_TIOCSWINSZ(void)
113 {
114    GO(SYS_ioctl, "(TIOCSWINSZ) 3s 1m");
115    SY(SYS_ioctl, x0 - 1, x0 + TIOCSWINSZ, x0); FAIL;
116 }
117 
118 __attribute__((noinline))
sys_ioctl_TIOCGPGRP(void)119 static void sys_ioctl_TIOCGPGRP(void)
120 {
121    GO(SYS_ioctl, "(TIOCGPGRP) 3s 1m");
122    SY(SYS_ioctl, x0 - 1, x0 + TIOCGPGRP, x0); FAIL;
123 }
124 
125 __attribute__((noinline))
sys_ioctl_TIOCSPGRP(void)126 static void sys_ioctl_TIOCSPGRP(void)
127 {
128    GO(SYS_ioctl, "(TIOCSPGRP) 3s 1m");
129    SY(SYS_ioctl, x0 - 1, x0 + TIOCSPGRP, x0); FAIL;
130 }
131 
132 __attribute__((noinline))
sys_ioctl_TIOCGSID(void)133 static void sys_ioctl_TIOCGSID(void)
134 {
135    GO(SYS_ioctl, "(TIOCGSID) 3s 1m");
136    SY(SYS_ioctl, x0 - 1, x0 + TIOCGSID, x0); FAIL;
137 }
138 
139 __attribute__((noinline))
sys_ioctl_TIOCNOTTY(void)140 static void sys_ioctl_TIOCNOTTY(void)
141 {
142    GO(SYS_ioctl, "(TIOCNOTTY) 2s 0m");
143    SY(SYS_ioctl, x0 - 1, x0 + TIOCNOTTY); FAIL;
144 }
145 
146 __attribute__((noinline))
sys_ioctl_TIOCSCTTY(void)147 static void sys_ioctl_TIOCSCTTY(void)
148 {
149    GO(SYS_ioctl, "(TIOCSCTTY) 2s 0m");
150    SY(SYS_ioctl, x0 - 1, x0 + TIOCSCTTY); FAIL;
151 }
152 
153 /* STREAMS */
154 __attribute__((noinline))
sys_ioctl_I_PUSH(void)155 static void sys_ioctl_I_PUSH(void)
156 {
157    GO(SYS_ioctl, "(I_PUSH) 3s 1m");
158    SY(SYS_ioctl, x0 - 1, x0 + I_PUSH, x0 + 1); FAIL;
159 }
160 
161 __attribute__((noinline))
sys_ioctl_I_STR(void)162 static void sys_ioctl_I_STR(void)
163 {
164    GO(SYS_ioctl, "(I_STR) 3s 1m");
165    SY(SYS_ioctl, x0 - 1, x0 + I_STR, x0 + 1); FAIL;
166 }
167 
168 __attribute__((noinline))
sys_ioctl_I_STR_2(void)169 static void sys_ioctl_I_STR_2(void)
170 {
171    struct strioctl str;
172 
173    str.ic_cmd = x0;
174    str.ic_timout = x0;
175    str.ic_len = x0 + 1;
176    str.ic_dp = (void *) (x0 + 1);
177 
178    GO(SYS_ioctl, "(I_STR) 4s 1m");
179    SY(SYS_ioctl, x0 - 1, x0 + I_STR, &str + x0); FAIL;
180 }
181 
182 __attribute__((noinline))
sys_ioctl_I_PEEK(void)183 static void sys_ioctl_I_PEEK(void)
184 {
185    GO(SYS_ioctl, "(I_PEEK) 3s 7m");
186    SY(SYS_ioctl, x0 - 1, x0 + I_PEEK, x0 + 1); FAIL;
187 }
188 
189 __attribute__((noinline))
sys_ioctl_I_PEEK_2(void)190 static void sys_ioctl_I_PEEK_2(void)
191 {
192    struct strpeek peek;
193 
194    peek.ctlbuf.maxlen = x0 + 1;
195    peek.ctlbuf.len = x0;
196    peek.ctlbuf.buf = (void*)(x0 + 1);
197    peek.databuf.maxlen = x0 + 1;
198    peek.databuf.len = x0;
199    peek.databuf.buf = (void*)(x0 + 1);
200    peek.flags = x0;
201 
202    GO(SYS_ioctl, "(I_PEEK) 3s 7m");
203    SY(SYS_ioctl, x0 - 1, x0 + I_PEEK, &peek + x0); FAIL;
204 }
205 
206 __attribute__((noinline))
sys_ioctl_I_CANPUT(void)207 static void sys_ioctl_I_CANPUT(void)
208 {
209    GO(SYS_ioctl, "(I_CANPUT) 3s 0m");
210    SY(SYS_ioctl, x0 - 1, x0 + I_CANPUT, x0); FAIL;
211 }
212 
213 /* sockio */
214 __attribute__((noinline))
sys_ioctl_SIOCGIFCONF(void)215 static void sys_ioctl_SIOCGIFCONF(void)
216 {
217    GO(SYS_ioctl, "(SIOCGIFCONF), 3s 2m");
218    SY(SYS_ioctl, x0 - 1, x0 + SIOCGIFCONF, x0 - 1); FAIL;
219 }
220 
221 __attribute__((noinline))
sys_ioctl_SIOCGIFCONF_2(void)222 static void sys_ioctl_SIOCGIFCONF_2(void)
223 {
224    struct ifconf ifc;
225    char buf[] = "";
226 
227    ifc.ifc_len = x0 + 1;
228    ifc.ifc_buf = (void *) (x0 + buf);
229 
230    GO(SYS_ioctl, "(SIOCGIFCONF), 5s 0m");
231    SY(SYS_ioctl, x0 - 1, x0 + SIOCGIFCONF, &ifc + x0); FAIL;
232 }
233 
234 __attribute__((noinline))
sys_ioctl_SIOCGIFFLAGS(void)235 static void sys_ioctl_SIOCGIFFLAGS(void)
236 {
237    GO(SYS_ioctl, "(SIOCGIFFLAGS) 3s 2m");
238    SY(SYS_ioctl, x0 - 1, x0 + SIOCGIFFLAGS, x0 - 1); FAIL;
239 }
240 
241 __attribute__((noinline))
sys_ioctl_SIOCGIFFLAGS_2(void)242 static void sys_ioctl_SIOCGIFFLAGS_2(void)
243 {
244    struct ifreq ifr;
245 
246    ifr.ifr_name[0] = x0 + 'l';
247    ifr.ifr_name[1] = x0 + 'o';
248    ifr.ifr_name[2] = x0 + '0';
249    ifr.ifr_name[3] = x0 + '\0';
250 
251    GO(SYS_ioctl, "(SIOCGIFFLAGS), 4s 0m");
252    SY(SYS_ioctl, x0 - 1, x0 + SIOCGIFFLAGS, &ifr + x0); FAIL;
253 }
254 
255 __attribute__((noinline))
sys_ioctl_SIOCGIFNETMASK(void)256 static void sys_ioctl_SIOCGIFNETMASK(void)
257 {
258    GO(SYS_ioctl, "(SIOCGIFNETMASK) 3s 2m");
259    SY(SYS_ioctl, x0 - 1, x0 + SIOCGIFNETMASK, x0 - 1); FAIL;
260 }
261 
262 __attribute__((noinline))
sys_ioctl_SIOCGIFNETMASK_2(void)263 static void sys_ioctl_SIOCGIFNETMASK_2(void)
264 {
265    struct ifreq ifr;
266 
267    ifr.ifr_name[0] = x0 + 'l';
268    ifr.ifr_name[1] = x0 + 'o';
269    ifr.ifr_name[2] = x0 + '0';
270    ifr.ifr_name[3] = x0 + '\0';
271 
272    GO(SYS_ioctl, "(SIOCGIFNETMASK), 4s 0m");
273    SY(SYS_ioctl, x0 - 1, x0 + SIOCGIFNETMASK, &ifr + x0); FAIL;
274 }
275 
276 __attribute__((noinline))
sys_ioctl_SIOCGIFNUM(void)277 static void sys_ioctl_SIOCGIFNUM(void)
278 {
279    int ifnum;
280 
281    GO(SYS_ioctl, "(SIOCGIFNUM) 3s 0m");
282    SY(SYS_ioctl, x0 - 1, x0 + SIOCGIFNUM, &ifnum + x0); FAIL;
283 }
284 
285 __attribute__((noinline))
sys_ioctl_SIOCGIFNUM_2(void)286 static void sys_ioctl_SIOCGIFNUM_2(void)
287 {
288    GO(SYS_ioctl, "(SIOCGIFNUM) 3s 1m");
289    SY(SYS_ioctl, x0 - 1, x0 + SIOCGIFNUM, x0 - 1); FAIL;
290 }
291 
292 __attribute__((noinline))
sys_ioctl_SIOCGLIFBRDADDR(void)293 static void sys_ioctl_SIOCGLIFBRDADDR(void)
294 {
295    GO(SYS_ioctl, "(SIOCGLIFBRDADDR) 3s 2m");
296    SY(SYS_ioctl, x0 - 1, x0 + SIOCGLIFBRDADDR, x0 - 1); FAIL;
297 }
298 
299 __attribute__((noinline))
sys_ioctl_SIOCGLIFBRDADDR_2(void)300 static void sys_ioctl_SIOCGLIFBRDADDR_2(void)
301 {
302    struct lifreq lifr;
303 
304    lifr.lifr_name[0] = x0 + 'l';
305    lifr.lifr_name[1] = x0 + 'o';
306    lifr.lifr_name[2] = x0 + '0';
307    lifr.lifr_name[3] = x0 + '\0';
308 
309    GO(SYS_ioctl, "(SIOCGLIFBRDADDR), 4s 0m");
310    SY(SYS_ioctl, x0 - 1, x0 + SIOCGLIFBRDADDR, &lifr + x0); FAIL;
311 }
312 
313 __attribute__((noinline))
sys_ioctl_SIOCGLIFCONF(void)314 static void sys_ioctl_SIOCGLIFCONF(void)
315 {
316    GO(SYS_ioctl, "(SIOCGLIFCONF), 3s 4m");
317    SY(SYS_ioctl, x0 - 1, x0 + SIOCGLIFCONF, x0 - 1); FAIL;
318 }
319 
320 __attribute__((noinline))
sys_ioctl_SIOCGLIFCONF_2(void)321 static void sys_ioctl_SIOCGLIFCONF_2(void)
322 {
323    struct lifconf lifc;
324    char buf[] = "";
325 
326    lifc.lifc_len = x0 + 1;
327    lifc.lifc_buf = (void *) (x0 + buf);
328    lifc.lifc_family = x0 + 1;
329    lifc.lifc_flags = x0 + 0;
330 
331    GO(SYS_ioctl, "(SIOCGLIFCONF), 7s 0m");
332    SY(SYS_ioctl, x0 - 1, x0 + SIOCGLIFCONF, &lifc + x0); FAIL;
333 }
334 
335 __attribute__((noinline))
sys_ioctl_SIOCGLIFFLAGS(void)336 static void sys_ioctl_SIOCGLIFFLAGS(void)
337 {
338    GO(SYS_ioctl, "(SIOCGLIFFLAGS) 3s 2m");
339    SY(SYS_ioctl, x0 - 1, x0 + SIOCGLIFFLAGS, x0 - 1); FAIL;
340 }
341 
342 __attribute__((noinline))
sys_ioctl_SIOCGLIFFLAGS_2(void)343 static void sys_ioctl_SIOCGLIFFLAGS_2(void)
344 {
345    struct lifreq lifr;
346 
347    lifr.lifr_name[0] = x0 + 'l';
348    lifr.lifr_name[1] = x0 + 'o';
349    lifr.lifr_name[2] = x0 + '0';
350    lifr.lifr_name[3] = x0 + '\0';
351 
352    GO(SYS_ioctl, "(SIOCGLIFFLAGS), 4s 0m");
353    SY(SYS_ioctl, x0 - 1, x0 + SIOCGLIFFLAGS, &lifr + x0); FAIL;
354 }
355 
356 __attribute__((noinline))
sys_ioctl_SIOCGLIFNETMASK(void)357 static void sys_ioctl_SIOCGLIFNETMASK(void)
358 {
359    GO(SYS_ioctl, "(SIOCGLIFNETMASK) 3s 2m");
360    SY(SYS_ioctl, x0 - 1, x0 + SIOCGLIFNETMASK, x0 - 1); FAIL;
361 }
362 
363 __attribute__((noinline))
sys_ioctl_SIOCGLIFNETMASK_2(void)364 static void sys_ioctl_SIOCGLIFNETMASK_2(void)
365 {
366    struct lifreq lifr;
367 
368    lifr.lifr_name[0] = x0 + 'l';
369    lifr.lifr_name[1] = x0 + 'o';
370    lifr.lifr_name[2] = x0 + '0';
371    lifr.lifr_name[3] = x0 + '\0';
372 
373    GO(SYS_ioctl, "(SIOCGLIFNETMASK), 4s 0m");
374    SY(SYS_ioctl, x0 - 1, x0 + SIOCGLIFNETMASK, &lifr + x0); FAIL;
375 }
376 
377 __attribute__((noinline))
sys_ioctl_SIOCGLIFNUM(void)378 static void sys_ioctl_SIOCGLIFNUM(void)
379 {
380    struct lifnum lifn;
381 
382    lifn.lifn_family = x0;
383    lifn.lifn_flags = x0;
384 
385    GO(SYS_ioctl, "(SIOCGLIFNUM) 4s 0m");
386    SY(SYS_ioctl, x0 - 1, x0 + SIOCGLIFNUM, &lifn + x0); FAIL;
387 }
388 
389 /* filio */
390 __attribute__((noinline))
sys_ioctl_FIOSETOWN(void)391 static void sys_ioctl_FIOSETOWN(void)
392 {
393    pid_t pid;
394 
395    GO(SYS_ioctl, "(FIOSETOWN) 4s 0m");
396    SY(SYS_ioctl, x0 - 1, x0 + FIOSETOWN, &pid + x0); FAIL;
397 }
398 
399 __attribute__((noinline))
sys_ioctl_FIOGETOWN(void)400 static void sys_ioctl_FIOGETOWN(void)
401 {
402    GO(SYS_ioctl, "(FIOGETOWN) 3s 1m");
403    SY(SYS_ioctl, x0 - 1, x0 + FIOGETOWN, x0 + 1); FAIL;
404 }
405 
406 /* crypto */
407 __attribute__((noinline))
sys_ioctl_CRYPTO_GET_PROVIDER_LIST(void)408 static void sys_ioctl_CRYPTO_GET_PROVIDER_LIST(void)
409 {
410    GO(SYS_ioctl, "(CRYPTO_GET_PROVIDER_LIST) 3s 1m");
411    SY(SYS_ioctl, x0 - 1, x0 + CRYPTO_GET_PROVIDER_LIST, x0 + 1); FAIL;
412 }
413 
414 __attribute__((noinline))
sys_ioctl_CRYPTO_GET_PROVIDER_LIST_2(void)415 static void sys_ioctl_CRYPTO_GET_PROVIDER_LIST_2(void)
416 {
417    crypto_get_provider_list_t pl;
418 
419    pl.pl_count = x0 + 1;
420 
421    GO(SYS_ioctl, "(CRYPTO_GET_PROVIDER_LIST) 4s 0m");
422    SY(SYS_ioctl, x0 - 1, x0 + CRYPTO_GET_PROVIDER_LIST, &pl + x0); FAIL;
423 }
424 
425 /* dtrace */
426 __attribute__((noinline))
sys_ioctl_DTRACEHIOC_REMOVE(void)427 static void sys_ioctl_DTRACEHIOC_REMOVE(void)
428 {
429    GO(SYS_ioctl, "(DTRACEHIOC_REMOVE) 3s 0m");
430    SY(SYS_ioctl, x0 - 1, x0 + DTRACEHIOC_REMOVE, x0); FAIL;
431 }
432 
433 __attribute__((noinline))
sys_ioctl_DTRACEHIOC_ADDDOF(void)434 static void sys_ioctl_DTRACEHIOC_ADDDOF(void)
435 {
436    dof_helper_t dh;
437 
438    dh.dofhp_mod[0] = x0 + 'D';
439    dh.dofhp_mod[1] = x0 + '\0';
440    dh.dofhp_addr = x0;
441    dh.dofhp_dof = x0;
442 
443    GO(SYS_ioctl, "(DTRACEHIOC_ADDDOF) 6s 0m");
444    SY(SYS_ioctl, x0 - 1, x0 + DTRACEHIOC_ADDDOF, x0 + &dh); FAIL;
445 }
446 
main(void)447 int main(void)
448 {
449    /* Uninitialised, but we know px[0] is 0x0. */
450    long *px = malloc(sizeof(long));
451    x0 = px[0];
452 
453    /* pools */
454    sys_ioctl_POOL_STATUSQ();
455 
456    /* mntio */
457    sys_ioctl_MNTIOC_GETMNTANY();
458    sys_ioctl_MNTIOC_GETMNTANY_2();
459    sys_ioctl_MNTIOC_GETMNTANY_3();
460 
461    /* termio/termios */
462    sys_ioctl_TCGETA();
463    sys_ioctl_TCGETS();
464    sys_ioctl_TCSETS();
465    sys_ioctl_TCSETSW();
466    sys_ioctl_TCSETSF();
467    sys_ioctl_TIOCGWINSZ();
468    sys_ioctl_TIOCSWINSZ();
469    sys_ioctl_TIOCGPGRP();
470    sys_ioctl_TIOCSPGRP();
471    sys_ioctl_TIOCGSID();
472    sys_ioctl_TIOCNOTTY();
473    sys_ioctl_TIOCSCTTY();
474 
475    /* STREAMS */
476    sys_ioctl_I_PUSH();
477    sys_ioctl_I_STR();
478    sys_ioctl_I_STR_2();
479    sys_ioctl_I_PEEK();
480    sys_ioctl_I_PEEK_2();
481    sys_ioctl_I_CANPUT();
482 
483    /* sockio */
484    sys_ioctl_SIOCGIFCONF();
485    sys_ioctl_SIOCGIFCONF_2();
486    sys_ioctl_SIOCGIFFLAGS();
487    sys_ioctl_SIOCGIFFLAGS_2();
488    sys_ioctl_SIOCGIFNETMASK();
489    sys_ioctl_SIOCGIFNETMASK_2();
490    sys_ioctl_SIOCGIFNUM();
491    sys_ioctl_SIOCGIFNUM_2();
492    sys_ioctl_SIOCGLIFBRDADDR();
493    sys_ioctl_SIOCGLIFBRDADDR_2();
494    sys_ioctl_SIOCGLIFCONF();
495    sys_ioctl_SIOCGLIFCONF_2();
496    sys_ioctl_SIOCGLIFFLAGS();
497    sys_ioctl_SIOCGLIFFLAGS_2();
498    sys_ioctl_SIOCGLIFNETMASK();
499    sys_ioctl_SIOCGLIFNETMASK_2();
500    sys_ioctl_SIOCGLIFNUM();
501 
502    /* filio */
503    sys_ioctl_FIOSETOWN();
504    sys_ioctl_FIOGETOWN();
505 
506    /* crypto */
507    sys_ioctl_CRYPTO_GET_PROVIDER_LIST();
508    sys_ioctl_CRYPTO_GET_PROVIDER_LIST_2();
509 
510    /* dtrace */
511    sys_ioctl_DTRACEHIOC_REMOVE();
512    sys_ioctl_DTRACEHIOC_ADDDOF();
513 
514    return 0;
515 }
516 
517