1#! /bin/sh - 2# @(#)makesyscalls.sh 8.1 (Berkeley) 6/10/93 3# $FreeBSD$ 4 5set -e 6 7# name of compat options: 8compat=COMPAT_43 9compat4=COMPAT_FREEBSD4 10compat6=COMPAT_FREEBSD6 11compat7=COMPAT_FREEBSD7 12compat10=COMPAT_FREEBSD10 13compat11=COMPAT_FREEBSD11 14compat12=COMPAT_FREEBSD12 15 16# output files: 17sysnames="syscalls.c" 18sysproto="../sys/sysproto.h" 19sysproto_h=_SYS_SYSPROTO_H_ 20syshdr="../sys/syscall.h" 21sysmk="../sys/syscall.mk" 22syssw="init_sysent.c" 23syscallprefix="SYS_" 24switchname="sysent" 25namesname="syscallnames" 26systrace="systrace_args.c" 27 28# tmp files: 29sysaue="sysent.aue.$$" 30sysdcl="sysent.dcl.$$" 31syscompat="sysent.compat.$$" 32syscompatdcl="sysent.compatdcl.$$" 33syscompat4="sysent.compat4.$$" 34syscompat4dcl="sysent.compat4dcl.$$" 35syscompat6="sysent.compat6.$$" 36syscompat6dcl="sysent.compat6dcl.$$" 37syscompat7="sysent.compat7.$$" 38syscompat7dcl="sysent.compat7dcl.$$" 39syscompat10="sysent.compat10.$$" 40syscompat10dcl="sysent.compat10dcl.$$" 41syscompat11="sysent.compat11.$$" 42syscompat11dcl="sysent.compat11dcl.$$" 43syscompat12="sysent.compat12.$$" 44syscompat12dcl="sysent.compat12dcl.$$" 45sysent="sysent.switch.$$" 46sysinc="sysinc.switch.$$" 47sysarg="sysarg.switch.$$" 48sysprotoend="sysprotoend.$$" 49systracetmp="systrace.$$" 50systraceret="systraceret.$$" 51capabilities_conf="capabilities.conf" 52 53trap "rm $sysaue $sysdcl $syscompat $syscompatdcl $syscompat4 $syscompat4dcl $syscompat6 $syscompat6dcl $syscompat7 $syscompat7dcl $syscompat10 $syscompat10dcl $syscompat11 $syscompat11dcl $syscompat12 $syscompat12dcl $sysent $sysinc $sysarg $sysprotoend $systracetmp $systraceret" 0 54 55touch $sysaue $sysdcl $syscompat $syscompatdcl $syscompat4 $syscompat4dcl $syscompat6 $syscompat6dcl $syscompat7 $syscompat7dcl $syscompat10 $syscompat10dcl $syscompat11 $syscompat11dcl $syscompat12 $syscompat12dcl $sysent $sysinc $sysarg $sysprotoend $systracetmp $systraceret 56 57case $# in 58 0) echo "usage: $0 input-file <config-file>" 1>&2 59 exit 1 60 ;; 61esac 62 631>&2 echo "$0: This script has been replaced by sys/tools/makesyscalls.lua and" 641>&2 echo "$0: will be removed before FreeBSD 13. See also: sys/conf/sysent.mk" 65 66if [ -n "$2" ]; then 67 . "$2" 68fi 69 70if [ -n "$capenabled" ]; then 71 # do nothing 72elif [ -r $capabilities_conf ]; then 73 capenabled=`egrep -v '^#|^$' $capabilities_conf` 74 capenabled=`echo $capenabled | sed 's/ /,/g'` 75else 76 capenabled="" 77fi 78 79sed -e ' 80 # FreeBSD ID, includes, comments, and blank lines 81 /.*\$FreeBSD/b done_joining 82 /^[#;]/b done_joining 83 /^$/b done_joining 84 85 # Join lines ending in backslash 86:joining 87 /\\$/{a\ 88 89 N 90 s/\\\n// 91 b joining 92 } 93 94 # OBSOL, etc lines without function signatures 95 /^[0-9][^{]*$/b done_joining 96 97 # Join incomplete signatures. The { must appear on the first line 98 # and the } must appear on the last line (modulo lines joined by 99 # backslashes). 100 /^[^}]*$/{a\ 101 102 N 103 s/\n// 104 b joining 105 } 106:done_joining 1072,${ 108 /^#/!s/\([{}()*,]\)/ \1 /g 109} 110' < $1 | awk " 111 BEGIN { 112 sysaue = \"$sysaue\" 113 sysdcl = \"$sysdcl\" 114 sysproto = \"$sysproto\" 115 sysprotoend = \"$sysprotoend\" 116 sysproto_h = \"$sysproto_h\" 117 syscompat = \"$syscompat\" 118 syscompatdcl = \"$syscompatdcl\" 119 syscompat4 = \"$syscompat4\" 120 syscompat4dcl = \"$syscompat4dcl\" 121 syscompat6 = \"$syscompat6\" 122 syscompat6dcl = \"$syscompat6dcl\" 123 syscompat7 = \"$syscompat7\" 124 syscompat7dcl = \"$syscompat7dcl\" 125 syscompat10 = \"$syscompat10\" 126 syscompat10dcl = \"$syscompat10dcl\" 127 syscompat11 = \"$syscompat11\" 128 syscompat11dcl = \"$syscompat11dcl\" 129 syscompat12 = \"$syscompat12\" 130 syscompat12dcl = \"$syscompat12dcl\" 131 sysent = \"$sysent\" 132 syssw = \"$syssw\" 133 sysinc = \"$sysinc\" 134 sysarg = \"$sysarg\" 135 sysnames = \"$sysnames\" 136 syshdr = \"$syshdr\" 137 sysmk = \"$sysmk\" 138 systrace = \"$systrace\" 139 systracetmp = \"$systracetmp\" 140 systraceret = \"$systraceret\" 141 compat = \"$compat\" 142 compat4 = \"$compat4\" 143 compat6 = \"$compat6\" 144 compat7 = \"$compat7\" 145 compat10 = \"$compat10\" 146 compat11 = \"$compat11\" 147 compat12 = \"$compat12\" 148 syscallprefix = \"$syscallprefix\" 149 switchname = \"$switchname\" 150 namesname = \"$namesname\" 151 infile = \"$1\" 152 abi_func_prefix = \"$abi_func_prefix\" 153 capenabled_string = \"$capenabled\" 154 "' 155 156 # Avoid a literal generated file tag here. 157 generated = "@" "generated"; 158 159 split(capenabled_string, capenabled, ","); 160 161 printf "\n/* The casts are bogus but will do for now. */\n" > sysent 162 printf "struct sysent %s[] = {\n",switchname > sysent 163 164 printf "/*\n * System call switch table.\n *\n" > syssw 165 printf " * DO NOT EDIT-- this file is automatically " generated ".\n" > syssw 166 printf " * $%s$\n", "FreeBSD" > syssw 167 printf " */\n\n" > syssw 168 169 printf "/*\n * System call prototypes.\n *\n" > sysarg 170 printf " * DO NOT EDIT-- this file is automatically " generated ".\n" > sysarg 171 printf " * $%s$\n", "FreeBSD" > sysarg 172 printf " */\n\n" > sysarg 173 printf "#ifndef %s\n", sysproto_h > sysarg 174 printf "#define\t%s\n\n", sysproto_h > sysarg 175 printf "#include <sys/signal.h>\n" > sysarg 176 printf "#include <sys/acl.h>\n" > sysarg 177 printf "#include <sys/cpuset.h>\n" > sysarg 178 printf "#include <sys/domainset.h>\n" > sysarg 179 printf "#include <sys/_ffcounter.h>\n" > sysarg 180 printf "#include <sys/_semaphore.h>\n" > sysarg 181 printf "#include <sys/ucontext.h>\n" > sysarg 182 printf "#include <sys/wait.h>\n\n" > sysarg 183 printf "#include <bsm/audit_kevents.h>\n\n" > sysarg 184 printf "struct proc;\n\n" > sysarg 185 printf "struct thread;\n\n" > sysarg 186 printf "#define\tPAD_(t)\t(sizeof(register_t) <= sizeof(t) ? \\\n" > sysarg 187 printf "\t\t0 : sizeof(register_t) - sizeof(t))\n\n" > sysarg 188 printf "#if BYTE_ORDER == LITTLE_ENDIAN\n"> sysarg 189 printf "#define\tPADL_(t)\t0\n" > sysarg 190 printf "#define\tPADR_(t)\tPAD_(t)\n" > sysarg 191 printf "#else\n" > sysarg 192 printf "#define\tPADL_(t)\tPAD_(t)\n" > sysarg 193 printf "#define\tPADR_(t)\t0\n" > sysarg 194 printf "#endif\n\n" > sysarg 195 196 printf "\n#ifdef %s\n\n", compat > syscompat 197 printf "\n#ifdef %s\n\n", compat4 > syscompat4 198 printf "\n#ifdef %s\n\n", compat6 > syscompat6 199 printf "\n#ifdef %s\n\n", compat7 > syscompat7 200 printf "\n#ifdef %s\n\n", compat10 > syscompat10 201 printf "\n#ifdef %s\n\n", compat11 > syscompat11 202 printf "\n#ifdef %s\n\n", compat12 > syscompat12 203 204 printf "/*\n * System call names.\n *\n" > sysnames 205 printf " * DO NOT EDIT-- this file is automatically " generated ".\n" > sysnames 206 printf " * $%s$\n", "FreeBSD" > sysnames 207 printf " */\n\n" > sysnames 208 printf "const char *%s[] = {\n", namesname > sysnames 209 210 printf "/*\n * System call numbers.\n *\n" > syshdr 211 printf " * DO NOT EDIT-- this file is automatically " generated ".\n" > syshdr 212 printf " * $%s$\n", "FreeBSD" > syshdr 213 printf " */\n\n" > syshdr 214 215 printf "# FreeBSD system call object files.\n" > sysmk 216 printf "# DO NOT EDIT-- this file is automatically " generated ".\n" > sysmk 217 printf "# $%s$\n", "FreeBSD" > sysmk 218 printf "MIASM = " > sysmk 219 220 printf "/*\n * System call argument to DTrace register array converstion.\n *\n" > systrace 221 printf " * DO NOT EDIT-- this file is automatically " generated ".\n" > systrace 222 printf " * $%s$\n", "FreeBSD" > systrace 223 printf " * This file is part of the DTrace syscall provider.\n */\n\n" > systrace 224 printf "static void\nsystrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args)\n{\n" > systrace 225 printf "\tint64_t *iarg = (int64_t *) uarg;\n" > systrace 226 printf "\tswitch (sysnum) {\n" > systrace 227 228 printf "static void\nsystrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)\n{\n\tconst char *p = NULL;\n" > systracetmp 229 printf "\tswitch (sysnum) {\n" > systracetmp 230 231 printf "static void\nsystrace_return_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)\n{\n\tconst char *p = NULL;\n" > systraceret 232 printf "\tswitch (sysnum) {\n" > systraceret 233 } 234 NR == 1 { 235 next 236 } 237 NF == 0 || $1 ~ /^;/ { 238 next 239 } 240 $1 ~ /^#[ ]*include/ { 241 print > sysinc 242 next 243 } 244 $1 ~ /^#[ ]*if/ { 245 print > sysent 246 print > sysdcl 247 print > sysarg 248 print > syscompat 249 print > syscompat4 250 print > syscompat6 251 print > syscompat7 252 print > syscompat10 253 print > syscompat11 254 print > syscompat12 255 print > sysnames 256 print > systrace 257 print > systracetmp 258 print > systraceret 259 savesyscall = syscall 260 next 261 } 262 $1 ~ /^#[ ]*else/ { 263 print > sysent 264 print > sysdcl 265 print > sysarg 266 print > syscompat 267 print > syscompat4 268 print > syscompat6 269 print > syscompat7 270 print > syscompat10 271 print > syscompat11 272 print > syscompat12 273 print > sysnames 274 print > systrace 275 print > systracetmp 276 print > systraceret 277 syscall = savesyscall 278 next 279 } 280 $1 ~ /^#/ { 281 print > sysent 282 print > sysdcl 283 print > sysarg 284 print > syscompat 285 print > syscompat4 286 print > syscompat6 287 print > syscompat7 288 print > syscompat10 289 print > syscompat11 290 print > syscompat12 291 print > sysnames 292 print > systrace 293 print > systracetmp 294 print > systraceret 295 next 296 } 297 # Returns true if the type "name" is the first flag in the type field 298 function type(name, flags, n) { 299 n = split($3, flags, /\|/) 300 return (n > 0 && flags[1] == name) 301 } 302 # Returns true if the flag "name" is set in the type field 303 function flag(name, flags, i, n) { 304 n = split($3, flags, /\|/) 305 for (i = 1; i <= n; i++) 306 if (flags[i] == name) 307 return 1 308 return 0 309 } 310 { 311 n = split($1, syscall_range, /-/) 312 if (n == 1) { 313 syscall_range[2] = syscall_range[1] 314 } else if (n == 2) { 315 if (!type("UNIMPL")) { 316 printf "%s: line %d: range permitted only with UNIMPL\n", 317 infile, NR 318 exit 1 319 } 320 } else { 321 printf "%s: line %d: invalid syscall number or range %s\n", 322 infile, NR, $1 323 exit 1 324 } 325 } 326 syscall != syscall_range[1] { 327 printf "%s: line %d: syscall number out of sync at %d\n", 328 infile, NR, syscall 329 printf "line is:\n" 330 print 331 exit 1 332 } 333 function align_sysent_comment(column) { 334 printf("\t") > sysent 335 column = column + 8 - column % 8 336 while (column < 56) { 337 printf("\t") > sysent 338 column = column + 8 339 } 340 } 341 function parserr(was, wanted) { 342 printf "%s: line %d: unexpected %s (expected %s)\n", 343 infile, NR, was, wanted 344 exit 1 345 } 346 function parseline() { 347 f=4 # toss number, type, audit event 348 ret_inc = 0 349 argc= 0; 350 argssize = "0" 351 thr_flag = "SY_THR_STATIC" 352 if (flag("NOTSTATIC")) { 353 thr_flag = "SY_THR_ABSENT" 354 } 355 if ($NF != "}") { 356 funcalias=$(NF-2) 357 argalias=$(NF-1) 358 rettype=$NF 359 end=NF-3 360 } else { 361 funcalias="" 362 argalias="" 363 rettype="int" 364 if ($(f+2) == "*") { 365 ret_inc = 1 366 } 367 end=NF 368 } 369 if (flag("NODEF")) { 370 auditev="AUE_NULL" 371 funcname=$(4 + ret_inc) 372 argssize = "AS(" $(6 + ret_inc) ")" 373 return 374 } 375 if ($f != "{") 376 parserr($f, "{") 377 f++ 378 if ($end != "}") 379 parserr($end, "}") 380 end-- 381 if ($end != ";") 382 parserr($end, ";") 383 end-- 384 if ($end != ")") 385 parserr($end, ")") 386 end-- 387 388 syscallret=$f 389 f++ 390 while (ret_inc > 0) { 391 syscallret=syscallret " " $f 392 f++ 393 ret_inc-- 394 } 395 396 funcname=$f 397 398 # 399 # We now know the func name, so define a flags field for it. 400 # Do this before any other processing as we may return early 401 # from it. 402 # 403 for (cap in capenabled) { 404 if (funcname == capenabled[cap] || 405 funcname == abi_func_prefix capenabled[cap]) { 406 flags = "SYF_CAPENABLED"; 407 break; 408 } 409 } 410 411 if (funcalias == "") 412 funcalias = funcname 413 if (argalias == "") { 414 argalias = funcname "_args" 415 if (flag("COMPAT")) 416 argalias = "o" argalias 417 if (flag("COMPAT4")) 418 argalias = "freebsd4_" argalias 419 if (flag("COMPAT6")) 420 argalias = "freebsd6_" argalias 421 if (flag("COMPAT7")) 422 argalias = "freebsd7_" argalias 423 if (flag("COMPAT10")) 424 argalias = "freebsd10_" argalias 425 if (flag("COMPAT11")) 426 argalias = "freebsd11_" argalias 427 if (flag("COMPAT12")) 428 argalias = "freebsd12_" argalias 429 } 430 f++ 431 432 if ($f != "(") 433 parserr($f, ")") 434 f++ 435 436 if (f == end) { 437 if ($f != "void") 438 parserr($f, "argument definition") 439 return 440 } 441 442 while (f <= end) { 443 argc++ 444 argtype[argc]="" 445 oldf="" 446 while (f < end && $(f+1) != ",") { 447 if (argtype[argc] != "" && oldf != "*") 448 argtype[argc] = argtype[argc]" "; 449 argtype[argc] = argtype[argc]$f; 450 oldf = $f; 451 f++ 452 } 453 if (argtype[argc] == "") 454 parserr($f, "argument definition") 455 456 # The parser adds space around parens. 457 # Remove it from annotations. 458 gsub(/ \( /, "(", argtype[argc]); 459 gsub(/ \)/, ")", argtype[argc]); 460 461 #remove annotations 462 gsub(/_In[^ ]*[_)] /, "", argtype[argc]); 463 gsub(/_Out[^ ]*[_)] /, "", argtype[argc]); 464 465 argname[argc]=$f; 466 f += 2; # skip name, and any comma 467 } 468 if (argc != 0) 469 argssize = "AS(" argalias ")" 470 } 471 { comment = $4 472 if (NF < 7) 473 for (i = 5; i <= NF; i++) 474 comment = comment " " $i 475 } 476 477 # 478 # The AUE_ audit event identifier. 479 # 480 { 481 auditev = $2; 482 } 483 484 # 485 # The flags, if any. 486 # 487 { 488 flags = "0"; 489 } 490 491 type("STD") || type("NODEF") || type("NOARGS") || type("NOPROTO") \ 492 || type("NOSTD") { 493 parseline() 494 printf("\t/* %s */\n\tcase %d: {\n", funcname, syscall) > systrace 495 printf("\t/* %s */\n\tcase %d:\n", funcname, syscall) > systracetmp 496 printf("\t/* %s */\n\tcase %d:\n", funcname, syscall) > systraceret 497 if (argc > 0) { 498 printf("\t\tswitch(ndx) {\n") > systracetmp 499 printf("\t\tstruct %s *p = params;\n", argalias) > systrace 500 for (i = 1; i <= argc; i++) { 501 arg = argtype[i] 502 sub("__restrict$", "", arg) 503 if (index(arg, "*") > 0) 504 printf("\t\tcase %d:\n\t\t\tp = \"userland %s\";\n\t\t\tbreak;\n", i - 1, arg) > systracetmp 505 else 506 printf("\t\tcase %d:\n\t\t\tp = \"%s\";\n\t\t\tbreak;\n", i - 1, arg) > systracetmp 507 if (index(arg, "*") > 0 || arg == "caddr_t") 508 printf("\t\tuarg[%d] = (intptr_t) p->%s; /* %s */\n", \ 509 i - 1, \ 510 argname[i], arg) > systrace 511 else if (arg == "union l_semun") 512 printf("\t\tuarg[%d] = p->%s.buf; /* %s */\n", \ 513 i - 1, \ 514 argname[i], arg) > systrace 515 else if (substr(arg, 1, 1) == "u" || arg == "size_t") 516 printf("\t\tuarg[%d] = p->%s; /* %s */\n", \ 517 i - 1, \ 518 argname[i], arg) > systrace 519 else 520 printf("\t\tiarg[%d] = p->%s; /* %s */\n", \ 521 i - 1, \ 522 argname[i], arg) > systrace 523 } 524 printf("\t\tdefault:\n\t\t\tbreak;\n\t\t};\n") > systracetmp 525 526 printf("\t\tif (ndx == 0 || ndx == 1)\n") > systraceret 527 printf("\t\t\tp = \"%s\";\n", syscallret) > systraceret 528 printf("\t\tbreak;\n") > systraceret 529 } 530 printf("\t\t*n_args = %d;\n\t\tbreak;\n\t}\n", argc) > systrace 531 printf("\t\tbreak;\n") > systracetmp 532 if (!flag("NOARGS") && !flag("NOPROTO") && !flag("NODEF")) { 533 if (argc != 0) { 534 printf("struct %s {\n", argalias) > sysarg 535 for (i = 1; i <= argc; i++) 536 printf("\tchar %s_l_[PADL_(%s)]; " \ 537 "%s %s; char %s_r_[PADR_(%s)];\n", 538 argname[i], argtype[i], 539 argtype[i], argname[i], 540 argname[i], argtype[i]) > sysarg 541 printf("};\n") > sysarg 542 } else 543 printf("struct %s {\n\tregister_t dummy;\n};\n", 544 argalias) > sysarg 545 } 546 if (!flag("NOPROTO") && !flag("NODEF")) { 547 if (funcname == "nosys" || funcname == "lkmnosys" || 548 funcname == "sysarch" || funcname ~ /^freebsd/ || 549 funcname ~ /^linux/ || funcname ~ /^cloudabi/) { 550 printf("%s\t%s(struct thread *, struct %s *)", 551 rettype, funcname, argalias) > sysdcl 552 } else { 553 printf("%s\tsys_%s(struct thread *, struct %s *)", 554 rettype, funcname, argalias) > sysdcl 555 } 556 printf(";\n") > sysdcl 557 printf("#define\t%sAUE_%s\t%s\n", syscallprefix, 558 funcalias, auditev) > sysaue 559 } 560 printf("\t{ %s, (sy_call_t *)", argssize) > sysent 561 column = 8 + 2 + length(argssize) + 15 562 if (flag("NOSTD")) { 563 printf("lkmressys, AUE_NULL, NULL, 0, 0, %s, SY_THR_ABSENT },", flags) > sysent 564 column = column + length("lkmressys") + length("AUE_NULL") + 3 565 } else { 566 if (funcname == "nosys" || funcname == "sysarch" || 567 funcname == "lkmnosys" || funcname ~ /^freebsd/ || 568 funcname ~ /^linux/ || funcname ~ /^cloudabi/) { 569 printf("%s, %s, NULL, 0, 0, %s, %s },", funcname, auditev, flags, thr_flag) > sysent 570 column = column + length(funcname) + length(auditev) + length(flags) + 3 571 } else { 572 printf("sys_%s, %s, NULL, 0, 0, %s, %s },", funcname, auditev, flags, thr_flag) > sysent 573 column = column + length(funcname) + length(auditev) + length(flags) + 3 + 4 574 } 575 } 576 align_sysent_comment(column) 577 printf("/* %d = %s */\n", syscall, funcalias) > sysent 578 printf("\t\"%s\",\t\t\t/* %d = %s */\n", 579 funcalias, syscall, funcalias) > sysnames 580 if (!flag("NODEF")) { 581 printf("#define\t%s%s\t%d\n", syscallprefix, 582 funcalias, syscall) > syshdr 583 printf(" \\\n\t%s.o", funcalias) > sysmk 584 } 585 syscall++ 586 next 587 } 588 type("COMPAT") || type("COMPAT4") || type("COMPAT6") || \ 589 type("COMPAT7") || type("COMPAT10") || type("COMPAT11") || \ 590 type("COMPAT12") { 591 if (flag("COMPAT")) { 592 ncompat++ 593 out = syscompat 594 outdcl = syscompatdcl 595 wrap = "compat" 596 prefix = "o" 597 descr = "old" 598 } else if (flag("COMPAT4")) { 599 ncompat4++ 600 out = syscompat4 601 outdcl = syscompat4dcl 602 wrap = "compat4" 603 prefix = "freebsd4_" 604 descr = "freebsd4" 605 } else if (flag("COMPAT6")) { 606 ncompat6++ 607 out = syscompat6 608 outdcl = syscompat6dcl 609 wrap = "compat6" 610 prefix = "freebsd6_" 611 descr = "freebsd6" 612 } else if (flag("COMPAT7")) { 613 ncompat7++ 614 out = syscompat7 615 outdcl = syscompat7dcl 616 wrap = "compat7" 617 prefix = "freebsd7_" 618 descr = "freebsd7" 619 } else if (flag("COMPAT10")) { 620 ncompat10++ 621 out = syscompat10 622 outdcl = syscompat10dcl 623 wrap = "compat10" 624 prefix = "freebsd10_" 625 descr = "freebsd10" 626 } else if (flag("COMPAT11")) { 627 ncompat11++ 628 out = syscompat11 629 outdcl = syscompat11dcl 630 wrap = "compat11" 631 prefix = "freebsd11_" 632 descr = "freebsd11" 633 } else if (flag("COMPAT12")) { 634 ncompat12++ 635 out = syscompat12 636 outdcl = syscompat12dcl 637 wrap = "compat12" 638 prefix = "freebsd12_" 639 descr = "freebsd12" 640 } 641 parseline() 642 if (argc != 0 && !flag("NOARGS") && !flag("NOPROTO") && \ 643 !flag("NODEF")) { 644 printf("struct %s {\n", argalias) > out 645 for (i = 1; i <= argc; i++) 646 printf("\tchar %s_l_[PADL_(%s)]; %s %s; " \ 647 "char %s_r_[PADR_(%s)];\n", 648 argname[i], argtype[i], 649 argtype[i], argname[i], 650 argname[i], argtype[i]) > out 651 printf("};\n") > out 652 } 653 else if (!flag("NOARGS") && !flag("NOPROTO") && !flag("NODEF")) 654 printf("struct %s {\n\tregister_t dummy;\n};\n", 655 argalias) > sysarg 656 if (!flag("NOPROTO") && !flag("NODEF")) { 657 printf("%s\t%s%s(struct thread *, struct %s *);\n", 658 rettype, prefix, funcname, argalias) > outdcl 659 printf("#define\t%sAUE_%s%s\t%s\n", syscallprefix, 660 prefix, funcname, auditev) > sysaue 661 } 662 if (flag("NOSTD")) { 663 printf("\t{ %s, (sy_call_t *)%s, %s, NULL, 0, 0, 0, SY_THR_ABSENT },", 664 "0", "lkmressys", "AUE_NULL") > sysent 665 align_sysent_comment(8 + 2 + length("0") + 15 + \ 666 length("lkmressys") + length("AUE_NULL") + 3) 667 } else { 668 printf("\t{ %s(%s,%s), %s, NULL, 0, 0, %s, %s },", 669 wrap, argssize, funcname, auditev, flags, thr_flag) > sysent 670 align_sysent_comment(8 + 9 + length(argssize) + 1 + \ 671 length(funcname) + length(auditev) + \ 672 length(flags) + 4) 673 } 674 printf("/* %d = %s %s */\n", syscall, descr, funcalias) > sysent 675 printf("\t\"%s.%s\",\t\t/* %d = %s %s */\n", 676 wrap, funcalias, syscall, descr, funcalias) > sysnames 677 # Do not provide freebsdN_* symbols in libc for < FreeBSD 7 678 if (flag("COMPAT") || flag("COMPAT4") || flag("COMPAT6")) { 679 printf("\t\t\t\t/* %d is %s %s */\n", 680 syscall, descr, funcalias) > syshdr 681 } else if (!flag("NODEF")) { 682 printf("#define\t%s%s%s\t%d\n", syscallprefix, 683 prefix, funcalias, syscall) > syshdr 684 printf(" \\\n\t%s%s.o", prefix, funcalias) > sysmk 685 } 686 syscall++ 687 next 688 } 689 type("OBSOL") { 690 printf("\t{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT },") > sysent 691 align_sysent_comment(34) 692 printf("/* %d = obsolete %s */\n", syscall, comment) > sysent 693 printf("\t\"obs_%s\",\t\t\t/* %d = obsolete %s */\n", 694 $4, syscall, comment) > sysnames 695 printf("\t\t\t\t/* %d is obsolete %s */\n", 696 syscall, comment) > syshdr 697 syscall++ 698 next 699 } 700 type("UNIMPL") { 701 while (syscall <= syscall_range[2]) { 702 printf("\t{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT },\t\t\t/* %d = %s */\n", 703 syscall, comment) > sysent 704 printf("\t\"#%d\",\t\t\t/* %d = %s */\n", 705 syscall, syscall, comment) > sysnames 706 syscall++ 707 } 708 next 709 } 710 { 711 printf "%s: line %d: unrecognized keyword %s\n", infile, NR, $3 712 exit 1 713 } 714 END { 715 printf "\n#define AS(name) (sizeof(struct name) / sizeof(register_t))\n" > sysinc 716 717 if (ncompat != 0) { 718 printf "\n#ifdef %s\n", compat > sysinc 719 printf "#define compat(n, name) n, (sy_call_t *)__CONCAT(o,name)\n" > sysinc 720 printf "#else\n" > sysinc 721 printf "#define compat(n, name) 0, (sy_call_t *)nosys\n" > sysinc 722 printf "#endif\n" > sysinc 723 } 724 725 if (ncompat4 != 0) { 726 printf "\n#ifdef %s\n", compat4 > sysinc 727 printf "#define compat4(n, name) n, (sy_call_t *)__CONCAT(freebsd4_,name)\n" > sysinc 728 printf "#else\n" > sysinc 729 printf "#define compat4(n, name) 0, (sy_call_t *)nosys\n" > sysinc 730 printf "#endif\n" > sysinc 731 } 732 733 if (ncompat6 != 0) { 734 printf "\n#ifdef %s\n", compat6 > sysinc 735 printf "#define compat6(n, name) n, (sy_call_t *)__CONCAT(freebsd6_,name)\n" > sysinc 736 printf "#else\n" > sysinc 737 printf "#define compat6(n, name) 0, (sy_call_t *)nosys\n" > sysinc 738 printf "#endif\n" > sysinc 739 } 740 741 if (ncompat7 != 0) { 742 printf "\n#ifdef %s\n", compat7 > sysinc 743 printf "#define compat7(n, name) n, (sy_call_t *)__CONCAT(freebsd7_,name)\n" > sysinc 744 printf "#else\n" > sysinc 745 printf "#define compat7(n, name) 0, (sy_call_t *)nosys\n" > sysinc 746 printf "#endif\n" > sysinc 747 } 748 if (ncompat10 != 0) { 749 printf "\n#ifdef %s\n", compat10 > sysinc 750 printf "#define compat10(n, name) n, (sy_call_t *)__CONCAT(freebsd10_,name)\n" > sysinc 751 printf "#else\n" > sysinc 752 printf "#define compat10(n, name) 0, (sy_call_t *)nosys\n" > sysinc 753 printf "#endif\n" > sysinc 754 } 755 if (ncompat11 != 0) { 756 printf "\n#ifdef %s\n", compat11 > sysinc 757 printf "#define compat11(n, name) n, (sy_call_t *)__CONCAT(freebsd11_,name)\n" > sysinc 758 printf "#else\n" > sysinc 759 printf "#define compat11(n, name) 0, (sy_call_t *)nosys\n" > sysinc 760 printf "#endif\n" > sysinc 761 } 762 if (ncompat12 != 0) { 763 printf "\n#ifdef %s\n", compat12 > sysinc 764 printf "#define compat12(n, name) n, (sy_call_t *)__CONCAT(freebsd12_,name)\n" > sysinc 765 printf "#else\n" > sysinc 766 printf "#define compat12(n, name) 0, (sy_call_t *)nosys\n" > sysinc 767 printf "#endif\n" > sysinc 768 } 769 770 printf("\n#endif /* %s */\n\n", compat) > syscompatdcl 771 printf("\n#endif /* %s */\n\n", compat4) > syscompat4dcl 772 printf("\n#endif /* %s */\n\n", compat6) > syscompat6dcl 773 printf("\n#endif /* %s */\n\n", compat7) > syscompat7dcl 774 printf("\n#endif /* %s */\n\n", compat10) > syscompat10dcl 775 printf("\n#endif /* %s */\n\n", compat11) > syscompat11dcl 776 printf("\n#endif /* %s */\n\n", compat12) > syscompat12dcl 777 778 printf("\n#undef PAD_\n") > sysprotoend 779 printf("#undef PADL_\n") > sysprotoend 780 printf("#undef PADR_\n") > sysprotoend 781 printf("\n#endif /* !%s */\n", sysproto_h) > sysprotoend 782 783 printf("\n") > sysmk 784 printf("};\n") > sysent 785 printf("};\n") > sysnames 786 printf("#define\t%sMAXSYSCALL\t%d\n", syscallprefix, syscall) \ 787 > syshdr 788 printf "\tdefault:\n\t\t*n_args = 0;\n\t\tbreak;\n\t};\n}\n" > systrace 789 printf "\tdefault:\n\t\tbreak;\n\t};\n\tif (p != NULL)\n\t\tstrlcpy(desc, p, descsz);\n}\n" > systracetmp 790 printf "\tdefault:\n\t\tbreak;\n\t};\n\tif (p != NULL)\n\t\tstrlcpy(desc, p, descsz);\n}\n" > systraceret 791 } ' 792 793cat $sysinc $sysent >> $syssw 794cat $sysarg $sysdcl \ 795 $syscompat $syscompatdcl \ 796 $syscompat4 $syscompat4dcl \ 797 $syscompat6 $syscompat6dcl \ 798 $syscompat7 $syscompat7dcl \ 799 $syscompat10 $syscompat10dcl \ 800 $syscompat11 $syscompat11dcl \ 801 $syscompat12 $syscompat12dcl \ 802 $sysaue $sysprotoend > $sysproto 803cat $systracetmp >> $systrace 804cat $systraceret >> $systrace 805 806