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