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