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