671 lines · plain
1#!/usr/bin/awk -f2 3#===-- generate_netbsd_ioctls.awk ------------------------------------------===#4#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-exception8#9#===------------------------------------------------------------------------===#10#11# This file is a generator of:12# - include/sanitizer/sanitizer_interceptors_ioctl_netbsd.inc13#14# This script reads public headers from a NetBSD host.15#16# This script shall be executed only on the newest NetBSD version.17# This script will emit compat code for the older releases.18#19# NetBSD minimal version supported 9.0.20# NetBSD current version supported 9.99.26.21#22#===------------------------------------------------------------------------===#23 24BEGIN {25 # hardcode the script name26 script_name = "generate_netbsd_ioctls.awk"27 outputinc = "../lib/sanitizer_common/sanitizer_interceptors_ioctl_netbsd.inc"28 29 # assert that we are in the directory with scripts30 in_utils = system("test -f " script_name " && exit 1 || exit 0")31 if (in_utils == 0) {32 usage()33 }34 35 # assert 0 argument passed36 if (ARGC != 1) {37 usage()38 }39 40 # accept overloading CLANGFORMAT from environment41 clangformat = "clang-format"42 if ("CLANGFORMAT" in ENVIRON) {43 clangformat = ENVIRON["CLANGFORMAT"]44 }45 46 # accept overloading ROOTDIR from environment47 rootdir = "/usr/include/"48 if ("ROOTDIR" in ENVIRON) {49 rootdir = ENVIRON["ROOTDIR"]50 }51 52 # detect and register files to detect ioctl() definitions53 ARGC = 154 cmd = "find " rootdir " -type f -name '*.h'"55 while (cmd | getline) {56 ARGV[ARGC++] = $057 }58 close(cmd)59 60 ioctl_table_max = 061}62 63# Scan RCS ID64FNR == 1 {65 fname[ioctl_table_max] = substr(FILENAME, length(rootdir) + 1)66}67 68# _IO69/[^a-zA-Z0-9_]_IO[W]*[R]*[ ]*\(/ && $2 ~ /^[A-Z_]+$/ {70 if ($0 ~ /RAIDFRAME_GET_ACCTOTALS/ ||71 $0 ~ /ALTQATTACH/ ||72 $0 ~ /ALTQDETACH/ ||73 $0 ~ /ALTQENABLE/ ||74 $0 ~ /ALTQDISABLE/ ||75 $0 ~ /ALTQCLEAR/ ||76 $0 ~ /ALTQCONFIG/ ||77 $0 ~ /ALTQADDCLASS/ ||78 $0 ~ /ALTQMODCLASS/ ||79 $0 ~ /ALTQDELCLASS/ ||80 $0 ~ /ALTQADDFILTER/ ||81 $0 ~ /ALTQDELFILTER/ ||82 $0 ~ /ALTQGETSTATS/ ||83 $0 ~ /ALTQGETCNTR/ ||84 $0 ~ /HFSC_IF_ATTACH/ ||85 $0 ~ /HFSC_MOD_CLASS/ ||86 $0 ~ /HLCD_DISPCTL/ ||87 $0 ~ /HLCD_RESET/ ||88 $0 ~ /HLCD_CLEAR/ ||89 $0 ~ /HLCD_CURSOR_LEFT/ ||90 $0 ~ /HLCD_CURSOR_RIGHT/ ||91 $0 ~ /HLCD_GET_CURSOR_POS/ ||92 $0 ~ /HLCD_SET_CURSOR_POS/ ||93 $0 ~ /HLCD_GETC/ ||94 $0 ~ /HLCD_PUTC/ ||95 $0 ~ /HLCD_SHIFT_LEFT/ ||96 $0 ~ /HLCD_SHIFT_RIGHT/ ||97 $0 ~ /HLCD_HOME/ ||98 $0 ~ /HLCD_WRITE/ ||99 $0 ~ /HLCD_READ/ ||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/ ||107 $0 ~ /FBIOGINFO/ ||108 $0 ~ /FBIOSATTR/ ||109 $0 ~ /OBIOCDISK/ ||110 $0 ~ /OBIOCVOL/ ||111 $0 ~ /BIOCSORTIMEOUT/ ||112 $0 ~ /BIOCGORTIMEOUT/ ||113 $0 ~ /PPPIOCSPASS/ ||114 $0 ~ /PPPIOCSACTIVE/ ||115 $0 ~ /PPPIOCSIPASS/ ||116 $0 ~ /PPPIOCSOPASS/ ||117 $0 ~ /PPPIOCSIACTIVE/ ||118 $0 ~ /PPPIOCSOACTIVE/ ||119 $0 ~ /SIOCPROXY/ ||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/ ||127 $0 ~ /MMCOP/ ||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/ ||137 $0 ~ /GPIOPINCTL/ ||138 $0 ~ /GPIODETACH/ ||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 etc149 next150 }151 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/ ||159 $0 ~ /SLIOCGUNIT/ ||160 $0 ~ /TUNSLMODE/ ||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/ ||172 $0 ~ /WFQ_ENABLE/ ||173 $0 ~ /RIO_ENABLE/ ||174 $0 ~ /FIFOQ_ENABLE/ ||175 $0 ~ /RED_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 ones204 next205 }206 207 if ($2 in known) {208 # Avoid duplicates209 # There are entries compatible with K&R and ANSI preprocessor210 next211 }212 213 known[$2] = 1214 215 ioctl_name[ioctl_table_max] = $2216 217 split($3, a, "(")218 a3 = a[1]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"227 } else {228 print "Unknown mode, cannot parse: '" $3 "'"229 }230 231 # This !NONE check allows to skip some unparsable entries232 if (ioctl_mode[ioctl_table_max] != "NONE") {233 n = split($0, a, ",")234 if (n == 3) {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] = type239 }240 }241 242 ioctl_table_max++243}244 245END {246 # empty files?247 if (NR < 1 && !abnormal_exit) {248 usage()249 }250 251 # Handle abnormal exit252 if (abnormal_exit) {253 exit(abnormal_exit)254 }255 256 # Add compat entries257 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")261 262 # Generate sanitizer_interceptors_ioctl_netbsd.inc263 264 # open pipe265 cmd = clangformat " > " outputinc266 267 pcmd("//===-- sanitizer_interceptors_ioctl_netbsd.inc -----------------*- C++ -*-===//")268 pcmd("//")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")272 pcmd("//")273 pcmd("//===----------------------------------------------------------------------===//")274 pcmd("//")275 pcmd("// Ioctl handling in common sanitizer interceptors.")276 pcmd("//===----------------------------------------------------------------------===//")277 pcmd("")278 pcmd("#if SANITIZER_NETBSD")279 pcmd("")280 pcmd("#include \"sanitizer_flags.h\"")281 pcmd("")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.")288 pcmd(" enum {")289 pcmd(" NONE,")290 pcmd(" READ,")291 pcmd(" WRITE,")292 pcmd(" READWRITE,")293 pcmd(" CUSTOM")294 pcmd(" } type : 3;")295 pcmd(" unsigned size : 29;")296 pcmd(" const char* name;")297 pcmd("};")298 pcmd("")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;")302 pcmd("")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; \\")315 pcmd(" }")316 pcmd("")317 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__)")321 }322 if (i in fname) {323 pcmd(" /* Entries from file: " fname[i] " */")324 }325 326 if (i in ioctl_type) {327 type = ioctl_type[i]328 } else {329 type = "0"330 }331 332 pcmd(" _(" ioctl_name[i] ", " ioctl_mode[i] "," type ");")333 334 if (ioctl_name[i] == "NVMM_IOC_CTL") {335 pcmd("#endif")336 }337 }338 339 pcmd("#undef _")340 pcmd("}")341 pcmd("")342 pcmd("static bool ioctl_initialized = false;")343 pcmd("")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;")347 pcmd(" }")348 pcmd("};")349 pcmd("")350 pcmd("static void ioctl_init() {")351 pcmd(" ioctl_table_fill();")352 pcmd(" Sort(ioctl_table, ioctl_table_size, ioctl_desc_compare());")353 pcmd("")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);")360 pcmd(" bad = true;")361 pcmd(" }")362 pcmd(" }")363 pcmd("")364 pcmd(" if (bad) Die();")365 pcmd("")366 pcmd(" ioctl_initialized = true;")367 pcmd("}")368 pcmd("")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;")376 pcmd(" else")377 pcmd(" right = mid;")378 pcmd(" }")379 pcmd(" if (left == right && ioctl_table[left].req == req)")380 pcmd(" return ioctl_table + left;")381 pcmd(" else")382 pcmd(" return nullptr;")383 pcmd("}")384 pcmd("")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;")396 pcmd(" break;")397 pcmd(" case IOC_READ | IOC_WRITE:")398 pcmd(" desc->type = ioctl_desc::READWRITE;")399 pcmd(" break;")400 pcmd(" case IOC_READ:")401 pcmd(" desc->type = ioctl_desc::WRITE;")402 pcmd(" break;")403 pcmd(" case IOC_WRITE:")404 pcmd(" desc->type = ioctl_desc::READ;")405 pcmd(" break;")406 pcmd(" default:")407 pcmd(" return false;")408 pcmd(" }")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;")414 pcmd("}")415 pcmd("")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;")419 pcmd("")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;")429 pcmd("}")430 pcmd("")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);")436 pcmd(" }")437 pcmd(" if (desc->type != ioctl_desc::CUSTOM)")438 pcmd(" return;")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));")443 pcmd(" }")444 pcmd("}")445 pcmd("")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);")452 pcmd(" }")453 pcmd(" if (desc->type != ioctl_desc::CUSTOM)")454 pcmd(" return;")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);")458 pcmd(" }")459 pcmd("}")460 pcmd("")461 pcmd("#endif // SANITIZER_NETBSD")462 463 close(cmd)464}465 466function usage()467{468 print "Usage: " script_name469 abnormal_exit = 1470 exit 1471}472 473function pcmd(string)474{475 print string | cmd476}477 478function get_type(string)479{480 if (string == "int") {481 return "sizeof(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") {499 return "sizeof(u8)"500 } else if (string == "uint16_t") {501 return "sizeof(u16)"502 } else if (string == "u_int32_t" || string == "uint32_t") {503 return "sizeof(u32)"504 } else if (string == "u_int64_t" || string == "uint64_t") {505 return "sizeof(u64)"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") {511 return "sizeof(int)"512 } else if (string == "daddr_t" || string == "dev_t") {513 return "sizeof(u64)"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") {526 return "sizeof(u64)"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"651 } else {652 print "Unrecognized entry: " string653 print "Aborting"654 abnormal_exit = 1655 exit 1656 }657 658 return string659}660 661function add_compat(path, name, mode, type)662{663 if (path != "") {664 fname[ioctl_table_max] = path665 }666 ioctl_name[ioctl_table_max] = name667 ioctl_mode[ioctl_table_max] = mode668 ioctl_type[ioctl_table_max] = type669 ioctl_table_max++670}671