1#! /bin/sh - 2# @(#)makesyscalls.sh 8.1 (Berkeley) 6/10/93 3# $FreeBSD: src/sys/kern/makesyscalls.sh,v 1.39.2.4 2001/10/20 09:01:24 marcel Exp $ 4 5set -e 6 7# name of compat option: 8compat=COMPAT_43 9# name of DragonFly 1.2 compat option 10compatdf12=COMPAT_DF12 11 12# output files: 13sysnames="syscalls.c" 14sysproto="../sys/sysproto.h" 15sysunion="../sys/sysunion.h" 16sysproto_h=_SYS_SYSPROTO_H_ 17syshdr="../sys/syscall.h" 18sysmk="../sys/syscall.mk" 19syssw="init_sysent.c" 20syshide="../sys/syscall-hide.h" 21syscallprefix="SYS_" 22switchname="sysent" 23namesname="syscallnames" 24 25# tmp files: 26sysdcl="sysent.dcl.$$" 27syscompat="sysent.compat.$$" 28syscompatdf12="sysent.compatdf12.$$" 29syscompatdcl="sysent.compatdcl.$$" 30syscompatdcldf12="sysent.compatdcldf12.$$" 31sysent="sysent.switch.$$" 32sysinc="sysinc.switch.$$" 33sysarg="sysarg.switch.$$" 34sysun="sysunion.switch.$$" 35 36trap "rm $sysdcl $syscompat $syscompatdf12 $syscompatdcl $syscompatdcldf12 $sysent $sysinc $sysarg $sysun" 0 37 38touch $sysdcl $syscompat $syscompatdf12 $syscompatdcl $syscompatdcldf12 $sysent $sysinc $sysarg $sysun 39 40case $# in 41 0) echo "Usage: $0 input-file <config-file>" 1>&2 42 exit 1 43 ;; 44esac 45 46if [ -n "$2" -a -f "$2" ]; then 47 . $2 48fi 49 50sed -e ' 51s/\$//g 52:join 53 /\\$/{a\ 54 55 N 56 s/\\\n// 57 b join 58 } 592,${ 60 /^#/!s/\([{}()*,]\)/ \1 /g 61} 62' < $1 | awk " 63 BEGIN { 64 sysdcl = \"$sysdcl\" 65 sysproto = \"$sysproto\" 66 sysproto_h = \"$sysproto_h\" 67 syscompat = \"$syscompat\" 68 syscompatdf12 = \"$syscompatdf12\" 69 syscompatdcl = \"$syscompatdcl\" 70 syscompatdcldf12 = \"$syscompatdcldf12\" 71 sysent = \"$sysent\" 72 syssw = \"$syssw\" 73 sysinc = \"$sysinc\" 74 sysarg = \"$sysarg\" 75 sysun = \"$sysun\" 76 sysnames = \"$sysnames\" 77 syshdr = \"$syshdr\" 78 sysmk = \"$sysmk\" 79 compat = \"$compat\" 80 compatdf12 = \"$compatdf12\" 81 syshide = \"$syshide\" 82 syscallprefix = \"$syscallprefix\" 83 switchname = \"$switchname\" 84 namesname = \"$namesname\" 85 infile = \"$1\" 86 "' 87 88 printf "/*\n * System call switch table.\n *\n" > syssw 89 printf " * DO NOT EDIT-- To regenerate this file, edit syscalls.master followed\n" > syssw 90 printf " * by running make sysent in the same directory.\n" > syssw 91 printf " */\n\n" > syssw 92 93 printf "/*\n * System call prototypes.\n *\n" > sysarg 94 printf " * DO NOT EDIT-- To regenerate this file, edit syscalls.master followed\n" > sysarg 95 printf " * by running make sysent in the same directory.\n" > sysarg 96 printf " */\n\n" > sysarg 97 printf "#ifndef %s\n", sysproto_h > sysarg 98 printf "#define\t%s\n\n", sysproto_h > sysarg 99 printf "#include <sys/select.h>\n\n" > sysarg 100 printf "#include <sys/signal.h>\n\n" > sysarg 101 printf "#include <sys/acl.h>\n\n" > sysarg 102 printf "#include <sys/msgport.h>\n\n" > sysarg 103 printf "#include <sys/sysmsg.h>\n\n" > sysarg 104 printf "#include <sys/syslink.h>\n\n" > sysarg 105 printf "#define\tPAD_(t)\t(sizeof(register_t) <= sizeof(t) ? \\\n" > sysarg 106 printf "\t\t0 : sizeof(register_t) - sizeof(t))\n\n" > sysarg 107 108 printf "\n#ifdef %s\n\n", compat > syscompat 109 printf "\n#ifdef %s\n\n", compatdf12 > syscompatdf12 110 111 printf "/*\n * System call names.\n *\n" > sysnames 112 printf " * DO NOT EDIT-- To regenerate this file, edit syscalls.master followed\n" > sysnames 113 printf " * by running make sysent in the same directory.\n" > sysnames 114 printf " */\n\n" > sysnames 115 printf "const char *%s[] = {\n", namesname > sysnames 116 117 printf "/*\n * System call numbers.\n *\n" > syshdr 118 printf " * DO NOT EDIT-- To regenerate this file, edit syscalls.master followed\n" > syshdr 119 printf " * by running make sysent in the same directory.\n" > syshdr 120 printf " */\n\n" > syshdr 121 122 printf "# DragonFly system call names.\n" > sysmk 123 printf "# DO NOT EDIT-- To regenerate this file, edit syscalls.master followed\n" > sysmk 124 printf "# by running make sysent in the same directory.\n" > sysmk 125 printf "MIASM = " > sysmk 126 127 printf "/*\n * System call hiders.\n *\n" > syshide 128 printf " * DO NOT EDIT-- To regenerate this file, edit syscalls.master followed\n" > syshide 129 printf " * by running make sysent in the same directory.\n" > syshide 130 printf " */\n\n" > syshide 131 132 printf "/*\n * Union of syscall args for messaging.\n *\n" > sysun 133 printf " * DO NOT EDIT-- To regenerate this file, edit syscalls.master followed\n" > sysun 134 printf " * by running make sysent in the same directory.\n" > sysun 135 printf " */\n\n" > sysun 136 printf "union sysunion {\n" > sysun 137 printf "#ifdef _KERNEL /* header only applies in kernel */\n" > sysun 138 printf "\tstruct\tlwkt_msg lmsg;\n" > sysun 139 printf "\tstruct\tsysmsg sysmsg;\n" > sysun 140 printf "#endif\n" > sysun 141 142 printf "\n/* The casts are bogus but will do for now. */\n" > sysent 143 printf "struct sysent %s[] = {\n",switchname > sysent 144 145 printf "\n#ifdef _KERNEL\n\n" > sysdcl 146 printf "\n#ifdef _KERNEL\n\n" > syscompatdcl 147 printf "\n#ifdef _KERNEL\n\n" > syscompatdcldf12 148 } 149 NF == 0 || $1 ~ /^;/ { 150 next 151 } 152 $1 ~ /^#[ ]*include/ { 153 print > sysinc 154 next 155 } 156 $1 ~ /^#[ ]*if/ { 157 print > sysent 158 print > sysdcl 159 print > sysarg 160 print > syscompat 161 print > syscompatdf12 162 print > sysnames 163 print > syshide 164 print > sysun 165 savesyscall = syscall 166 next 167 } 168 $1 ~ /^#[ ]*else/ { 169 print > sysent 170 print > sysdcl 171 print > sysarg 172 print > sysun 173 print > syscompat 174 print > syscompatdf12 175 print > sysnames 176 print > syshide 177 syscall = savesyscall 178 next 179 } 180 $1 ~ /^#/ { 181 print > sysent 182 print > sysdcl 183 print > sysarg 184 print > sysun 185 print > syscompat 186 print > syscompatdf12 187 print > sysnames 188 print > syshide 189 next 190 } 191 syscall != $1 { 192 printf "%s: line %d: syscall number out of sync at %d\n", 193 infile, NR, syscall 194 printf "line is:\n" 195 print 196 exit 1 197 } 198 function align_sysent_comment(column) { 199 printf("\t") > sysent 200 column = column + 8 - column % 8 201 while (column < 56) { 202 printf("\t") > sysent 203 column = column + 8 204 } 205 } 206 function parserr(was, wanted) { 207 printf "%s: line %d: unexpected %s (expected %s)\n", 208 infile, NR, was, wanted 209 exit 1 210 } 211 function parseline() { 212 f=4 # toss number and type 213 argc= 0; 214 argssize = "0" 215 if ($NF != "}") { 216 funcalias=$(NF-2) 217 argalias=$(NF-1) 218 rettype=$NF 219 end=NF-3 220 } else { 221 funcalias="" 222 argalias="" 223 rettype="int" 224 end=NF 225 } 226 if ($2 == "NODEF") { 227 funcname=$4 228 argssize = "AS(" $6 ")" 229 return 230 } 231 if ($f != "{") 232 parserr($f, "{") 233 f++ 234 if ($end != "}") 235 parserr($end, "}") 236 end-- 237 if ($end != ";") 238 parserr($end, ";") 239 end-- 240 if ($end != ")") 241 parserr($end, ")") 242 end-- 243 244 f++ #function return type 245 246 funcname=$f 247 usefuncname=$f 248 if (funcalias == "") 249 funcalias = funcname 250 if (argalias == "") { 251 argalias = funcname "_args" 252 if ($2 == "COMPAT") { 253 argalias = "o" argalias 254 usefuncname = "sys_o" funcname 255 } 256 if ($2 == "COMPAT_DF12") { 257 argalias = "dfbsd12_" argalias 258 usefuncname = "sys_dfbsd12_" funcname 259 } 260 } 261 f++ 262 263 if ($f != "(") 264 parserr($f, ")") 265 f++ 266 267 if (f == end) { 268 if ($f != "void") 269 parserr($f, "argument definition") 270 return 271 } 272 273 while (f <= end) { 274 argc++ 275 argtype[argc]="" 276 oldf="" 277 while (f < end && $(f+1) != ",") { 278 if (argtype[argc] != "" && oldf != "*") 279 argtype[argc] = argtype[argc]" "; 280 argtype[argc] = argtype[argc]$f; 281 oldf = $f; 282 f++ 283 } 284 if (argtype[argc] == "") 285 parserr($f, "argument definition") 286 argname[argc]=$f; 287 f += 2; # skip name, and any comma 288 } 289 if (argc != 0) 290 argssize = "AS(" argalias ")" 291 } 292 { comment = $4 293 if (NF < 7) 294 for (i = 5; i <= NF; i++) 295 comment = comment " " $i 296 } 297 $2 == "STD" || $2 == "NODEF" || $2 == "NOARGS" || $2 == "NOPROTO" \ 298 || $2 == "NOIMPL" { 299 parseline() 300 if ((!nosys || funcname != "nosys") && \ 301 (funcname != "lkmnosys")) { 302 if (argc != 0 && $2 != "NOARGS" && $2 != "NOPROTO") { 303 printf("\tstruct\t%s %s;\n", argalias, usefuncname) > sysun 304 printf("struct\t%s {\n", argalias) > sysarg 305 printf("#ifdef _KERNEL\n") > sysarg 306 printf("\tstruct sysmsg sysmsg;\n") > sysarg 307 printf("#endif\n") > sysarg 308 for (i = 1; i <= argc; i++) 309 printf("\t%s\t%s;\tchar %s_[PAD_(%s)];\n", 310 argtype[i], argname[i], 311 argname[i], argtype[i]) > sysarg 312 printf("};\n") > sysarg 313 } 314 else if ($2 != "NOARGS" && $2 != "NOPROTO" && \ 315 $2 != "NODEF") { 316 printf("\tstruct\t%s %s;\n", argalias, usefuncname) > sysun 317 printf("struct\t%s {\n", argalias) > sysarg 318 printf("#ifdef _KERNEL\n") > sysarg 319 printf("\tstruct sysmsg sysmsg;\n") > sysarg 320 printf("#endif\n") > sysarg 321 printf("\tregister_t dummy;\n") > sysarg 322 printf("};\n") > sysarg 323 } 324 } 325 if (($2 != "NOPROTO" && $2 != "NODEF" && \ 326 (funcname != "nosys" || !nosys)) || \ 327 (funcname == "lkmnosys" && !lkmnosys) || \ 328 funcname == "lkmressys") { 329 printf("%s\tsys_%s (struct %s *)", 330 rettype, funcname, argalias) > sysdcl 331 printf(";\n") > sysdcl 332 } 333 if (funcname == "nosys") 334 nosys = 1 335 if (funcname == "lkmnosys") 336 lkmnosys = 1 337 printf("\t{ %s, (sy_call_t *)", argssize) > sysent 338 column = 8 + 2 + length(argssize) + 15 339 if ($2 != "NOIMPL") { 340 printf("sys_%s },", funcname) > sysent 341 column = column + length(funcname) + 7 342 } else { 343 printf("sys_%s },", "nosys") > sysent 344 column = column + length("nosys") + 7 345 } 346 align_sysent_comment(column) 347 printf("/* %d = %s */\n", syscall, funcalias) > sysent 348 printf("\t\"%s\",\t\t\t/* %d = %s */\n", 349 funcalias, syscall, funcalias) > sysnames 350 if ($2 != "NODEF") { 351 printf("#define\t%s%s\t%d\n", syscallprefix, 352 funcalias, syscall) > syshdr 353 printf(" \\\n\t%s.o", funcalias) > sysmk 354 } 355 if ($3 != "NOHIDE") 356 printf("HIDE_%s(%s)\n", $3, funcname) > syshide 357 syscall++ 358 next 359 } 360 $2 == "COMPAT" || $2 == "CPT_NOA" { 361 ncompat++ 362 parseline() 363 if (argc != 0 && $2 != "CPT_NOA") { 364 printf("#ifdef %s\n", compat) > sysun 365 printf("\tstruct\t%s %s;\n", argalias, usefuncname) > sysun 366 printf("#endif\n") > sysun 367 printf("struct\t%s {\n", argalias) > syscompat 368 printf("#ifdef _KERNEL\n") > syscompat 369 printf("\tstruct sysmsg sysmsg;\n") > syscompat 370 printf("#endif\n") > syscompat 371 for (i = 1; i <= argc; i++) 372 printf("\t%s\t%s;\tchar %s_[PAD_(%s)];\n", 373 argtype[i], argname[i], 374 argname[i], argtype[i]) > syscompat 375 printf("};\n") > syscompat 376 } 377 else if($2 != "CPT_NOA") { 378 printf("\tstruct\t%s %s;\n", argalias, usefuncname) > sysun 379 printf("struct\t%s {\n", argalias) > sysarg 380 printf("#ifdef _KERNEL\n") > sysarg 381 printf("\tstruct sysmsg sysmsg;\n") > sysarg 382 printf("#endif\n") > sysarg 383 printf("\tregister_t dummy;\n") > sysarg 384 printf("};\n") > sysarg 385 } 386 printf("%s\tsys_o%s (struct %s *);\n", 387 rettype, funcname, argalias) > syscompatdcl 388 printf("\t{ compat(%s,%s) },", 389 argssize, funcname) > sysent 390 align_sysent_comment(8 + 9 + \ 391 length(argssize) + 1 + length(funcname) + 4) 392 printf("/* %d = old %s */\n", syscall, funcalias) > sysent 393 printf("\t\"old.%s\",\t\t/* %d = old %s */\n", 394 funcalias, syscall, funcalias) > sysnames 395 printf("\t\t\t\t/* %d is old %s */\n", 396 syscall, funcalias) > syshdr 397 if ($3 != "NOHIDE") 398 printf("HIDE_%s(%s)\n", $3, funcname) > syshide 399 syscall++ 400 next 401 } 402 $2 == "COMPAT_DF12" { 403 ncompatdf12++ 404 parseline() 405 if (argc != 0) { 406 printf("#ifdef %s\n", compatdf12) > sysun 407 printf("\tstruct\t%s %s;\n", argalias, usefuncname) > sysun 408 printf("#endif\n") > sysun 409 printf("struct\t%s {\n", argalias) > syscompatdf12 410 printf("#ifdef _KERNEL\n") > syscompatdf12 411 printf("\tstruct sysmsg sysmsg;\n") > syscompatdf12 412 printf("#endif\n") > syscompatdf12 413 for (i = 1; i <= argc; i++) 414 printf("\t%s\t%s;\tchar %s_[PAD_(%s)];\n", 415 argtype[i], argname[i], 416 argname[i], argtype[i]) > syscompatdf12 417 printf("};\n") > syscompatdf12 418 } 419 else { 420 printf("\tstruct\t%s %s;\n", argalias, usefuncname) > sysun 421 printf("struct\t%s {\n", argalias) > sysarg 422 printf("#ifdef _KERNEL\n") > sysarg 423 printf("\tstruct sysmsg sysmsg;\n") > sysarg 424 printf("#endif\n") > sysarg 425 printf("\tregister_t dummy;\n") > sysarg 426 printf("};\n") > sysarg 427 } 428 printf("%s\tsys_dfbsd12_%s (struct %s *);\n", 429 rettype, funcname, argalias) > syscompatdcldf12 430 printf("\t{ compatdf12(%s,%s) },", 431 argssize, funcname) > sysent 432 align_sysent_comment(8 + 9 + \ 433 length(argssize) + 1 + length(funcname) + 4) 434 printf("/* %d = old %s */\n", syscall, funcalias) > sysent 435 printf("\t\"old.%s\",\t\t/* %d = old %s */\n", 436 funcalias, syscall, funcalias) > sysnames 437 printf("\t\t\t\t/* %d is old %s */\n", 438 syscall, funcalias) > syshdr 439 if ($3 != "NOHIDE") 440 printf("HIDE_%s(%s)\n", $3, funcname) > syshide 441 syscall++ 442 next 443 } 444 $2 == "LIBCOMPAT" { 445 ncompat++ 446 parseline() 447 printf("%s\tsys_o%s();\n", rettype, funcname) > syscompatdcl 448 printf("\t{ compat(%s,%s) },", 449 argssize, funcname) > sysent 450 align_sysent_comment(8 + 9 + \ 451 length(argssize) + 1 + length(funcname) + 4) 452 printf("/* %d = old %s */\n", syscall, funcalias) > sysent 453 printf("\t\"old.%s\",\t\t/* %d = old %s */\n", 454 funcalias, syscall, funcalias) > sysnames 455 printf("#define\t%s%s\t%d\t/* compatibility; still used by libc */\n", 456 syscallprefix, funcalias, syscall) > syshdr 457 printf(" \\\n\t%s.o", funcalias) > sysmk 458 if ($3 != "NOHIDE") 459 printf("HIDE_%s(%s)\n", $3, funcname) > syshide 460 syscall++ 461 next 462 } 463 $2 == "OBSOL" { 464 printf("\t{ 0, (sy_call_t *)sys_nosys },") > sysent 465 align_sysent_comment(37) 466 printf("/* %d = obsolete %s */\n", syscall, comment) > sysent 467 printf("\t\"obs_%s\",\t\t\t/* %d = obsolete %s */\n", 468 $4, syscall, comment) > sysnames 469 printf("\t\t\t\t/* %d is obsolete %s */\n", 470 syscall, comment) > syshdr 471 if ($3 != "NOHIDE") 472 printf("HIDE_%s(%s)\n", $3, $4) > syshide 473 syscall++ 474 next 475 } 476 $2 == "UNIMPL" { 477 printf("\t{ 0, (sy_call_t *)sys_nosys },\t\t\t/* %d = %s */\n", 478 syscall, comment) > sysent 479 printf("\t\"#%d\",\t\t\t/* %d = %s */\n", 480 syscall, syscall, comment) > sysnames 481 if ($3 != "NOHIDE") 482 printf("HIDE_%s(%s)\n", $3, $4) > syshide 483 syscall++ 484 next 485 } 486 { 487 printf "%s: line %d: unrecognized keyword %s\n", infile, NR, $2 488 exit 1 489 } 490 END { 491 printf "\n#define AS(name) ((sizeof(struct name) - sizeof(struct sysmsg)) / sizeof(register_t))\n" > sysinc 492 if (ncompat != 0) { 493 printf "#include \"opt_compat.h\"\n\n" > syssw 494 printf "\n#ifdef %s\n", compat > sysinc 495 printf "#define compat(n, name) n, (sy_call_t *)__CONCAT(sys_,__CONCAT(o,name))\n" > sysinc 496 printf "#else\n" > sysinc 497 printf "#define compat(n, name) 0, (sy_call_t *)sys_nosys\n" > sysinc 498 printf "#endif\n" > sysinc 499 } 500 501 if (ncompatdf12 != 0) { 502 printf "#ifdef __i386__\n" > syssw 503 printf "#include \"opt_compatdf12.h\"\n" > syssw 504 printf "#endif\n\n" > syssw 505 printf "\n#ifdef %s\n", compatdf12 > sysinc 506 printf "#define compatdf12(n, name) n, (sy_call_t *)__CONCAT(sys_,__CONCAT(dfbsd12_,name))\n" > sysinc 507 printf "#else\n" > sysinc 508 printf "#define compatdf12(n, name) 0, (sy_call_t *)sys_nosys\n" > sysinc 509 printf "#endif\n" > sysinc 510 } 511 512 printf("\n#endif /* _KERNEL */\n") > syscompatdcl 513 printf("\n#endif /* _KERNEL */\n") > syscompatdcldf12 514 printf("\n#endif /* %s */\n\n", compat) > syscompatdcl 515 printf("\n#endif /* %s */\n\n", compatdf12) > syscompatdcldf12 516 517 printf("\n") > sysmk 518 printf("};\n") > sysent 519 printf("};\n") > sysnames 520 printf("};\n") > sysun 521 printf("\n#endif /* !%s */\n", sysproto_h) > sysdcl 522 printf("#undef PAD_\n") > sysdcl 523 printf("\n#endif /* _KERNEL */\n") > sysdcl 524 printf("#define\t%sMAXSYSCALL\t%d\n", syscallprefix, syscall) \ 525 > syshdr 526 } ' 527 528cat $sysinc $sysent >> $syssw 529cat $sysarg $syscompat $syscompatdcl $syscompatdf12 $syscompatdcldf12 $sysdcl > $sysproto 530cat $sysun > $sysunion 531