3 #===-- generate_netbsd_ioctls.awk ------------------------------------------===#
5 # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
6 # See https://llvm.org/LICENSE.txt for license information.
7 # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
9 #===------------------------------------------------------------------------===#
11 # This file is a generator of:
12 # - include/sanitizer/sanitizer_interceptors_ioctl_netbsd.inc
14 # This script reads public headers from a NetBSD host.
16 # This script shall be executed only on the newest NetBSD version.
17 # This script will emit compat code for the older releases.
19 # NetBSD minimal version supported 9.0.
20 # NetBSD current version supported 9.99.26.
22 #===------------------------------------------------------------------------===#
25 # hardcode the script name
26 script_name =
"generate_netbsd_ioctls.awk"
27 outputinc =
"../lib/sanitizer_common/sanitizer_interceptors_ioctl_netbsd.inc"
29 # assert that we are in the directory with scripts
30 in_utils =
system("test -f " script_name
" && exit 1 || exit 0")
35 # assert 0 argument passed
40 # accept overloading CLANGFORMAT from environment
41 clangformat =
"clang-format"
42 if ("CLANGFORMAT" in
ENVIRON) {
43 clangformat =
ENVIRON["CLANGFORMAT"]
46 # accept overloading ROOTDIR from environment
47 rootdir =
"/usr/include/"
48 if ("ROOTDIR" in
ENVIRON) {
49 rootdir =
ENVIRON["ROOTDIR"]
52 # detect and register files to detect ioctl() definitions
54 cmd =
"find " rootdir
" -type f -name '*.h'"
55 while (cmd
| getline) {
65 fname
[ioctl_table_max
] =
substr(FILENAME, length(rootdir
) + 1)
69 /[^a
-zA
-Z0
-9_
]_IO
[W
]*[R
]*[ ]*\
(/ && $
2 ~
/^
[A
-Z_
]+$
/ {
70 if ($
0 ~
/RAIDFRAME_GET_ACCTOTALS
/ ||
77 $
0 ~
/ALTQADDCLASS
/ ||
78 $
0 ~
/ALTQMODCLASS
/ ||
79 $
0 ~
/ALTQDELCLASS
/ ||
80 $
0 ~
/ALTQADDFILTER
/ ||
81 $
0 ~
/ALTQDELFILTER
/ ||
82 $
0 ~
/ALTQGETSTATS
/ ||
84 $
0 ~
/HFSC_IF_ATTACH
/ ||
85 $
0 ~
/HFSC_MOD_CLASS
/ ||
86 $
0 ~
/HLCD_DISPCTL
/ ||
89 $
0 ~
/HLCD_CURSOR_LEFT
/ ||
90 $
0 ~
/HLCD_CURSOR_RIGHT
/ ||
91 $
0 ~
/HLCD_GET_CURSOR_POS
/ ||
92 $
0 ~
/HLCD_SET_CURSOR_POS
/ ||
95 $
0 ~
/HLCD_SHIFT_LEFT
/ ||
96 $
0 ~
/HLCD_SHIFT_RIGHT
/ ||
100 $
0 ~
/HLCD_REDRAW
/ ||
101 $
0 ~
/HLCD_WRITE_INST
/ ||
102 $
0 ~
/HLCD_WRITE_DATA
/ ||
103 $
0 ~
/HLCD_GET_INFO
/ ||
104 $
0 ~
/HLCD_GET_CHIPNO
/ ||
105 $
0 ~
/HLCD_SET_CHIPNO
/ ||
106 $
0 ~
/RAIDFRAME_TEST_ACC
/ ||
111 $
0 ~
/BIOCSORTIMEOUT
/ ||
112 $
0 ~
/BIOCGORTIMEOUT
/ ||
113 $
0 ~
/PPPIOCSPASS
/ ||
114 $
0 ~
/PPPIOCSACTIVE
/ ||
115 $
0 ~
/PPPIOCSIPASS
/ ||
116 $
0 ~
/PPPIOCSOPASS
/ ||
117 $
0 ~
/PPPIOCSIACTIVE
/ ||
118 $
0 ~
/PPPIOCSOACTIVE
/ ||
120 $
0 ~
/SIOCXRAWATM
/ ||
121 $
0 ~
/AGPIOC_RESERVE
/ ||
122 $
0 ~
/AGPIOC_PROTECT
/ ||
123 $
0 ~
/CDIOCREADSUBCHANNEL_BUF
/ ||
124 $
0 ~
/CDIOREADTOCENTRIES_BUF
/ ||
125 $
0 ~
/MMCGETDISCINFO
/ ||
126 $
0 ~
/MMCGETTRACKINFO
/ ||
128 $
0 ~
/MMCSETUPWRITEPARAMS
/ ||
129 $
0 ~
/DIOCGPARTINFO
/ ||
130 $
0 ~
/ODIOCGDINFO
/ ||
131 $
0 ~
/ODIOCSDINFO
/ ||
132 $
0 ~
/ODIOCWDINFO
/ ||
133 $
0 ~
/ODIOCGDEFLABEL
/ ||
134 $
0 ~
/GPIOPINREAD
/ ||
135 $
0 ~
/GPIOPINWRITE
/ ||
136 $
0 ~
/GPIOPINTOGGLE
/ ||
139 $
0 ~
/SEQUENCER_PERCMODE
/ ||
140 $
0 ~
/SEQUENCER_TESTMIDI
/ ||
141 $
0 ~
/SEQUENCER_MIDI_INFO
/ ||
142 $
0 ~
/SEQUENCER_ID
/ ||
143 $
0 ~
/SEQUENCER_CONTROL
/ ||
144 $
0 ~
/SEQUENCER_REMOVESAMPLE
/ ||
145 $
0 ~
/EVTCHN_RESET
/ ||
146 $
0 ~
/EVTCHN_BIND
/ ||
147 $
0 ~
/EVTCHN_UNBIND
/) {
148 # broken entry, incomplete definition of the 3rd parameterm etc
152 if ($
0 ~
/APM_IOC_STANDBY
/ ||
153 $
0 ~
/APM_IOC_SUSPEND
/ ||
154 $
0 ~
/SCIOC_USE_ADF
/ ||
155 $
0 ~
/SCBUSIOLLSCAN
/ ||
156 $
0 ~
/UTOPPYIOCANCEL
/ ||
157 $
0 ~
/JOY_GET_X_OFFSET
/ ||
158 $
0 ~
/CHIOGPICKER
/ ||
161 $
0 ~
/CBQ_IF_ATTACH
/ ||
162 $
0 ~
/CDNR_IF_ATTACH
/ ||
163 $
0 ~
/RIO_IF_ATTACH
/ ||
164 $
0 ~
/CBQ_IF_DETACH
/ ||
165 $
0 ~
/HFSC_IF_DETACH
/ ||
166 $
0 ~
/WFQ_IF_DETACH
/ ||
167 $
0 ~
/RIO_IF_DETACH
/ ||
168 $
0 ~
/FIFOQ_IF_DETACH
/ ||
169 $
0 ~
/RED_IF_DETACH
/ ||
170 $
0 ~
/CDNR_ENABLE
/ ||
171 $
0 ~
/HFSC_ENABLE
/ ||
174 $
0 ~
/FIFOQ_ENABLE
/ ||
176 $
0 ~
/BLUE_ENABLE
/ ||
177 $
0 ~
/CDNR_DISABLE
/ ||
178 $
0 ~
/HFSC_DISABLE
/ ||
179 $
0 ~
/WFQ_DISABLE
/ ||
180 $
0 ~
/RIO_DISABLE
/ ||
181 $
0 ~
/FIFOQ_DISABLE
/ ||
182 $
0 ~
/PRIQ_DISABLE
/ ||
183 $
0 ~
/CDNR_DEL_FILTER
/ ||
184 $
0 ~
/JOBS_DEL_CLASS
/ ||
185 $
0 ~
/JOBS_DEL_FILTER
/ ||
186 $
0 ~
/JOBS_GETSTATS
/ ||
187 $
0 ~
/WFQ_GET_STATS
/ ||
188 $
0 ~
/CBQ_ADD_FILTER
/ ||
189 $
0 ~
/HFSC_ADD_FILTER
/ ||
190 $
0 ~
/JOBS_ADD_FILTER
/ ||
191 $
0 ~
/RED_IF_ATTACH
/ ||
192 $
0 ~
/FIFOQ_IF_ATTACH
/ ||
193 $
0 ~
/BLUE_IF_DETACH
/ ||
194 $
0 ~
/CBQ_DISABLE
/ ||
195 $
0 ~
/RED_DISABLE
/ ||
196 $
0 ~
/CBQ_CLEAR_HIERARCHY
/ ||
197 $
0 ~
/HFSC_DEL_CLASS
/ ||
198 $
0 ~
/PRIQ_IF_DETACH
/ ||
199 $
0 ~
/PRIQ_ENABLE
/ ||
200 $
0 ~
/WFQ_IF_ATTACH
/ ||
201 $
0 ~
/POWER_IOC_GET_TYPE_WITH_LOSSAGE
/ ||
202 $
0 ~
/HFSC_DEL_FILTER
/) {
203 # There are entries with duplicate codes.. disable the less used ones
209 # There are entries compatible with K&R and ANSI preprocessor
215 ioctl_name
[ioctl_table_max
] = $
2
219 if (a3 ~
/_IO
[ ]*$
/) {
220 ioctl_mode
[ioctl_table_max
] =
"NONE"
221 } else if (a3 ~
/_IOR
[ ]*$
/) {
222 ioctl_mode
[ioctl_table_max
] =
"WRITE"
223 } else if (a3 ~
/_IOW
[ ]*$
/) {
224 ioctl_mode
[ioctl_table_max
] =
"READ"
225 } else if (a3 ~
/_IOWR
[ ]*$
/) {
226 ioctl_mode
[ioctl_table_max
] =
"READWRITE"
228 print "Unknown mode, cannot parse: '" $
3 "'"
231 # This !NONE check allows to skip some unparsable entries
232 if (ioctl_mode
[ioctl_table_max
] != "NONE") {
233 n =
split($
0, a
, ",")
235 gsub(/^
[ ]+/, "", a
[3])
236 match(a
[3], /[a
-zA
-Z0
-9_
* ]+/)
237 type = get_type
(substr(a
[3], 0, RLENGTH))
238 ioctl_type
[ioctl_table_max
] = type
247 if (NR < 1 && !abnormal_exit
) {
251 # Handle abnormal exit
257 add_compat
("dev/filemon/filemon.h (compat <= 9.99.26)", "FILEMON_SET_FD", "READWRITE", "sizeof(int)")
258 add_compat
("", "FILEMON_SET_PID", "READWRITE", "sizeof(int)")
259 add_compat
("dev/usb/urio.h (compat <= 9.99.43)", "URIO_SEND_COMMAND", "READWRITE", "struct_urio_command_sz")
260 add_compat
("", "URIO_RECV_COMMAND", "READWRITE", "struct_urio_command_sz")
262 # Generate sanitizer_interceptors_ioctl_netbsd.inc
265 cmd = clangformat
" > " outputinc
267 pcmd
("//===-- sanitizer_interceptors_ioctl_netbsd.inc -----------------*- C++ -*-===//")
269 pcmd
("// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.")
270 pcmd
("// See https://llvm.org/LICENSE.txt for license information.")
271 pcmd
("// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception")
273 pcmd
("//===----------------------------------------------------------------------===//")
275 pcmd
("// Ioctl handling in common sanitizer interceptors.")
276 pcmd
("//===----------------------------------------------------------------------===//")
278 pcmd
("#if SANITIZER_NETBSD")
280 pcmd
("#include \"sanitizer_flags.h\"")
282 pcmd
("struct ioctl_desc {")
283 pcmd
(" unsigned req;")
284 pcmd
(" // FIXME: support read+write arguments. Currently READWRITE and WRITE do the")
285 pcmd
(" // same thing.")
286 pcmd
(" // XXX: The declarations below may use WRITE instead of READWRITE, unless")
287 pcmd
(" // explicitly noted.")
295 pcmd
(" unsigned size : 29;")
296 pcmd
(" const char* name;")
299 pcmd
("const unsigned ioctl_table_max = " ioctl_table_max
";")
300 pcmd
("static ioctl_desc ioctl_table[ioctl_table_max];")
301 pcmd
("static unsigned ioctl_table_size = 0;")
303 pcmd
("// This can not be declared as a global, because references to struct_*_sz")
304 pcmd
("// require a global initializer. And this table must be available before global")
305 pcmd
("// initializers are run.")
306 pcmd
("static void ioctl_table_fill() {")
307 pcmd
("#define _(rq, tp, sz) \\")
308 pcmd
(" if (IOCTL_##rq != IOCTL_NOT_PRESENT) { \\")
309 pcmd
(" CHECK(ioctl_table_size < ioctl_table_max); \\")
310 pcmd
(" ioctl_table[ioctl_table_size].req = IOCTL_##rq; \\")
311 pcmd
(" ioctl_table[ioctl_table_size].type = ioctl_desc::tp; \\")
312 pcmd
(" ioctl_table[ioctl_table_size].size = sz; \\")
313 pcmd
(" ioctl_table[ioctl_table_size].name = #rq; \\")
314 pcmd
(" ++ioctl_table_size; \\")
318 for (i =
0; i
< ioctl_table_max
; i
++) {
319 if (i in fname
&& fname
[i
] ==
"dev/nvmm/nvmm_ioctl.h") {
320 pcmd
("#if defined(__x86_64__)")
323 pcmd
(" /* Entries from file: " fname
[i
] " */")
326 if (i in ioctl_type
) {
332 pcmd
(" _(" ioctl_name
[i
] ", " ioctl_mode
[i
] "," type
");")
334 if (ioctl_name
[i
] ==
"NVMM_IOC_CTL") {
342 pcmd
("static bool ioctl_initialized = false;")
344 pcmd
("struct ioctl_desc_compare {")
345 pcmd
(" bool operator()(const ioctl_desc& left, const ioctl_desc& right) const {")
346 pcmd
(" return left.req < right.req;")
350 pcmd
("static void ioctl_init() {")
351 pcmd
(" ioctl_table_fill();")
352 pcmd
(" Sort(ioctl_table, ioctl_table_size, ioctl_desc_compare());")
354 pcmd
(" bool bad = false;")
355 pcmd
(" for (unsigned i = 0; i < ioctl_table_size - 1; ++i) {")
356 pcmd
(" if (ioctl_table[i].req >= ioctl_table[i + 1].req) {")
357 pcmd
(" Printf(\"Duplicate or unsorted ioctl request id %x >= %x (%s vs %s)\\n\",")
358 pcmd
(" ioctl_table[i].req, ioctl_table[i + 1].req, ioctl_table[i].name,")
359 pcmd
(" ioctl_table[i + 1].name);")
364 pcmd
(" if (bad) Die();")
366 pcmd
(" ioctl_initialized = true;")
369 pcmd
("static const ioctl_desc *ioctl_table_lookup(unsigned req) {")
370 pcmd
(" int left = 0;")
371 pcmd
(" int right = ioctl_table_size;")
372 pcmd
(" while (left < right) {")
373 pcmd
(" int mid = (left + right) / 2;")
374 pcmd
(" if (ioctl_table[mid].req < req)")
375 pcmd
(" left = mid + 1;")
377 pcmd
(" right = mid;")
379 pcmd
(" if (left == right && ioctl_table[left].req == req)")
380 pcmd
(" return ioctl_table + left;")
382 pcmd
(" return nullptr;")
385 pcmd
("static bool ioctl_decode(unsigned req, ioctl_desc *desc) {")
386 pcmd
(" CHECK(desc);")
387 pcmd
(" desc->req = req;")
388 pcmd
(" desc->name = \"<DECODED_IOCTL>\";")
389 pcmd
(" desc->size = IOC_SIZE(req);")
390 pcmd
(" // Sanity check.")
391 pcmd
(" if (desc->size > 0xFFFF) return false;")
392 pcmd
(" unsigned dir = IOC_DIR(req);")
393 pcmd
(" switch (dir) {")
394 pcmd
(" case IOC_NONE:")
395 pcmd
(" desc->type = ioctl_desc::NONE;")
397 pcmd
(" case IOC_READ | IOC_WRITE:")
398 pcmd
(" desc->type = ioctl_desc::READWRITE;")
400 pcmd
(" case IOC_READ:")
401 pcmd
(" desc->type = ioctl_desc::WRITE;")
403 pcmd
(" case IOC_WRITE:")
404 pcmd
(" desc->type = ioctl_desc::READ;")
407 pcmd
(" return false;")
409 pcmd
(" // Size can be 0 iff type is NONE.")
410 pcmd
(" if ((desc->type == IOC_NONE) != (desc->size == 0)) return false;")
411 pcmd
(" // Sanity check.")
412 pcmd
(" if (IOC_TYPE(req) == 0) return false;")
413 pcmd
(" return true;")
416 pcmd
("static const ioctl_desc *ioctl_lookup(unsigned req) {")
417 pcmd
(" const ioctl_desc *desc = ioctl_table_lookup(req);")
418 pcmd
(" if (desc) return desc;")
420 pcmd
(" // Try stripping access size from the request id.")
421 pcmd
(" desc = ioctl_table_lookup(req & ~(IOC_SIZEMASK << IOC_SIZESHIFT));")
422 pcmd
(" // Sanity check: requests that encode access size are either read or write and")
423 pcmd
(" // have size of 0 in the table.")
424 pcmd
(" if (desc && desc->size == 0 &&")
425 pcmd
(" (desc->type == ioctl_desc::READWRITE || desc->type == ioctl_desc::WRITE ||")
426 pcmd
(" desc->type == ioctl_desc::READ))")
427 pcmd
(" return desc;")
428 pcmd
(" return nullptr;")
431 pcmd
("static void ioctl_common_pre(void *ctx, const ioctl_desc *desc, int d,")
432 pcmd
(" unsigned request, void *arg) {")
433 pcmd
(" if (desc->type == ioctl_desc::READ || desc->type == ioctl_desc::READWRITE) {")
434 pcmd
(" unsigned size = desc->size ? desc->size : IOC_SIZE(request);")
435 pcmd
(" COMMON_INTERCEPTOR_READ_RANGE(ctx, arg, size);")
437 pcmd
(" if (desc->type != ioctl_desc::CUSTOM)")
439 pcmd
(" if (request == IOCTL_SIOCGIFCONF) {")
440 pcmd
(" struct __sanitizer_ifconf *ifc = (__sanitizer_ifconf *)arg;")
441 pcmd
(" COMMON_INTERCEPTOR_READ_RANGE(ctx, (char*)&ifc->ifc_len,")
442 pcmd
(" sizeof(ifc->ifc_len));")
446 pcmd
("static void ioctl_common_post(void *ctx, const ioctl_desc *desc, int res, int d,")
447 pcmd
(" unsigned request, void *arg) {")
448 pcmd
(" if (desc->type == ioctl_desc::WRITE || desc->type == ioctl_desc::READWRITE) {")
449 pcmd
(" // FIXME: add verbose output")
450 pcmd
(" unsigned size = desc->size ? desc->size : IOC_SIZE(request);")
451 pcmd
(" COMMON_INTERCEPTOR_WRITE_RANGE(ctx, arg, size);")
453 pcmd
(" if (desc->type != ioctl_desc::CUSTOM)")
455 pcmd
(" if (request == IOCTL_SIOCGIFCONF) {")
456 pcmd
(" struct __sanitizer_ifconf *ifc = (__sanitizer_ifconf *)arg;")
457 pcmd
(" COMMON_INTERCEPTOR_WRITE_RANGE(ctx, ifc->ifc_ifcu.ifcu_req, ifc->ifc_len);")
461 pcmd
("#endif // SANITIZER_NETBSD")
468 print "Usage: " script_name
473 function pcmd
(string
)
478 function get_type
(string
)
480 if (string ==
"int") {
482 } else if (string ==
"unsigned int" || string ==
"u_int" || string ==
"uint") {
483 return "sizeof(unsigned int)"
484 } else if (string ==
"long") {
485 return "sizeof(long)"
486 } else if (string ==
"unsigned long" || string ==
"u_long") {
487 return "sizeof(unsigned long)"
488 } else if (string ==
"short") {
489 return "sizeof(short)"
490 } else if (string ==
"unsigned short") {
491 return "sizeof(unsigned short)"
492 } else if (string ==
"char") {
493 return "sizeof(char)"
494 } else if (string ==
"signed char") {
495 return "sizeof(signed char)"
496 } else if (string ==
"unsigned char") {
497 return "sizeof(unsigned char)"
498 } else if (string ==
"uint8_t") {
500 } else if (string ==
"uint16_t") {
502 } else if (string ==
"u_int32_t" || string ==
"uint32_t") {
504 } else if (string ==
"u_int64_t" || string ==
"uint64_t") {
506 } else if (string ~
/\
*$
/) {
507 return "sizeof(uptr)"
508 } else if (string ==
"off_t") {
509 return "sizeof(uptr)"
510 } else if (string ==
"pid_t" || string ==
"kbd_t") {
512 } else if (string ==
"daddr_t" || string ==
"dev_t") {
514 } else if (substr(string
, 0, 7) ==
"struct " ) {
515 gsub(/ /, "", string
)
516 return "struct_" substr(string
, 7) "_sz"
517 } else if (string ==
"scsireq_t") {
518 return "struct_scsireq_sz"
519 } else if (string ==
"tone_t") {
520 return "struct_tone_sz"
521 } else if (string ==
"union twe_statrequest") {
522 return "union_twe_statrequest_sz"
523 } else if (string ==
"usb_device_descriptor_t") {
524 return "struct_usb_device_descriptor_sz"
525 } else if (string ==
"v4l2_std_id") {
527 } else if (string ==
"vtmode_t") {
528 return "struct_vt_mode_sz"
529 } else if (string ==
"_old_mixer_info") {
530 return "struct__old_mixer_info_sz"
531 } else if (string ==
"agp_allocate") {
532 return "struct__agp_allocate_sz"
533 } else if (string ==
"agp_bind") {
534 return "struct__agp_bind_sz"
535 } else if (string ==
"agp_info") {
536 return "struct__agp_info_sz"
537 } else if (string ==
"agp_region") {
538 return "struct__agp_region_sz"
539 } else if (string ==
"agp_setup") {
540 return "struct__agp_setup_sz"
541 } else if (string ==
"agp_unbind") {
542 return "struct__agp_unbind_sz"
543 } else if (string ==
"atareq_t") {
544 return "struct_atareq_sz"
545 } else if (string ==
"cpustate_t") {
546 return "struct_cpustate_sz"
547 } else if (string ==
"dmx_caps_t") {
548 return "struct_dmx_caps_sz"
549 } else if (string ==
"dmx_source_t") {
550 return "enum_dmx_source_sz"
551 } else if (string ==
"dvd_authinfo") {
552 return "union_dvd_authinfo_sz"
553 } else if (string ==
"dvd_struct") {
554 return "union_dvd_struct_sz"
555 } else if (string ==
"enum v4l2_priority") {
556 return "enum_v4l2_priority_sz"
557 } else if (string ==
"envsys_basic_info_t") {
558 return "struct_envsys_basic_info_sz"
559 } else if (string ==
"envsys_tre_data_t") {
560 return "struct_envsys_tre_data_sz"
561 } else if (string ==
"ext_accm") {
562 return "(8 * sizeof(u32))"
563 } else if (string ==
"fe_sec_mini_cmd_t") {
564 return "enum_fe_sec_mini_cmd_sz"
565 } else if (string ==
"fe_sec_tone_mode_t") {
566 return "enum_fe_sec_tone_mode_sz"
567 } else if (string ==
"fe_sec_voltage_t") {
568 return "enum_fe_sec_voltage_sz"
569 } else if (string ==
"fe_status_t") {
570 return "enum_fe_status_sz"
571 } else if (string ==
"gdt_ctrt_t") {
572 return "struct_gdt_ctrt_sz"
573 } else if (string ==
"gdt_event_t") {
574 return "struct_gdt_event_sz"
575 } else if (string ==
"gdt_osv_t") {
576 return "struct_gdt_osv_sz"
577 } else if (string ==
"gdt_rescan_t") {
578 return "struct_gdt_rescan_sz"
579 } else if (string ==
"gdt_statist_t") {
580 return "struct_gdt_statist_sz"
581 } else if (string ==
"gdt_ucmd_t") {
582 return "struct_gdt_ucmd_sz"
583 } else if (string ==
"iscsi_conn_status_parameters_t") {
584 return "struct_iscsi_conn_status_parameters_sz"
585 } else if (string ==
"iscsi_get_version_parameters_t") {
586 return "struct_iscsi_get_version_parameters_sz"
587 } else if (string ==
"iscsi_iocommand_parameters_t") {
588 return "struct_iscsi_iocommand_parameters_sz"
589 } else if (string ==
"iscsi_login_parameters_t") {
590 return "struct_iscsi_login_parameters_sz"
591 } else if (string ==
"iscsi_logout_parameters_t") {
592 return "struct_iscsi_logout_parameters_sz"
593 } else if (string ==
"iscsi_register_event_parameters_t") {
594 return "struct_iscsi_register_event_parameters_sz"
595 } else if (string ==
"iscsi_remove_parameters_t") {
596 return "struct_iscsi_remove_parameters_sz"
597 } else if (string ==
"iscsi_send_targets_parameters_t") {
598 return "struct_iscsi_send_targets_parameters_sz"
599 } else if (string ==
"iscsi_set_node_name_parameters_t") {
600 return "struct_iscsi_set_node_name_parameters_sz"
601 } else if (string ==
"iscsi_wait_event_parameters_t") {
602 return "struct_iscsi_wait_event_parameters_sz"
603 } else if (string ==
"isp_stats_t") {
604 return "struct_isp_stats_sz"
605 } else if (string ==
"lsenable_t") {
606 return "struct_lsenable_sz"
607 } else if (string ==
"lsdisable_t") {
608 return "struct_lsdisable_sz"
609 } else if (string ==
"mixer_ctrl_t") {
610 return "struct_mixer_ctrl_sz"
611 } else if (string ==
"mixer_devinfo_t") {
612 return "struct_mixer_devinfo_sz"
613 } else if (string ==
"mpu_command_rec") {
614 return "struct_mpu_command_rec_sz"
615 } else if (string ==
"rndstat_t") {
616 return "struct_rndstat_sz"
617 } else if (string ==
"rndstat_name_t") {
618 return "struct_rndstat_name_sz"
619 } else if (string ==
"rndctl_t") {
620 return "struct_rndctl_sz"
621 } else if (string ==
"rnddata_t") {
622 return "struct_rnddata_sz"
623 } else if (string ==
"rndpoolstat_t") {
624 return "struct_rndpoolstat_sz"
625 } else if (string ==
"rndstat_est_t") {
626 return "struct_rndstat_est_sz"
627 } else if (string ==
"rndstat_est_name_t") {
628 return "struct_rndstat_est_name_sz"
629 } else if (string ==
"pps_params_t") {
630 return "struct_pps_params_sz"
631 } else if (string ==
"pps_info_t") {
632 return "struct_pps_info_sz"
633 } else if (string ==
"linedn_t") {
634 return "(32 * sizeof(char))"
635 } else if (string ==
"mixer_info") {
636 return "struct_mixer_info_sz"
637 } else if (string ==
"RF_SparetWait_t") {
638 return "struct_RF_SparetWait_sz"
639 } else if (string ==
"RF_ComponentLabel_t") {
640 return "struct_RF_ComponentLabel_sz"
641 } else if (string ==
"RF_SingleComponent_t") {
642 return "struct_RF_SingleComponent_sz"
643 } else if (string ==
"RF_ProgressInfo_t") {
644 return "struct_RF_ProgressInfo_sz"
645 } else if (string ==
"nvlist_ref_t") {
646 return "struct_nvlist_ref_sz"
647 } else if (string ==
"spi_ioctl_transfer_t") {
648 return "struct_spi_ioctl_transfer_sz"
649 } else if (string ==
"spi_ioctl_configure_t") {
650 return "struct_spi_ioctl_configure_sz"
652 print "Unrecognized entry: " string
661 function add_compat
(path
, name
, mode
, type
)
664 fname
[ioctl_table_max
] = path
666 ioctl_name
[ioctl_table_max
] = name
667 ioctl_mode
[ioctl_table_max
] = mode
668 ioctl_type
[ioctl_table_max
] = type