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