makesyscalls.sh revision 14331
11541Srgrimes#! /bin/sh - 21541Srgrimes# @(#)makesyscalls.sh 8.1 (Berkeley) 6/10/93 314331Speter# $Id: makesyscalls.sh,v 1.16 1995/10/07 23:56:18 swallace Exp $ 41541Srgrimes 51541Srgrimesset -e 61541Srgrimes 71541Srgrimes# name of compat option: 81541Srgrimescompat=COMPAT_43 91541Srgrimes 101541Srgrimes# output files: 111541Srgrimessysnames="syscalls.c" 1210905Sbdesysproto="../sys/sysproto.h" 1310905Sbdesysproto_h=_SYS_SYSPROTO_H_ 141541Srgrimessyshdr="../sys/syscall.h" 151541Srgrimessyssw="init_sysent.c" 162700Swollmansyshide="../sys/syscall-hide.h" 1711294Sswallacesyscallprefix="SYS_" 1811294Sswallaceswitchname="sysent" 1911294Sswallacenamesname="syscallnames" 201541Srgrimes 211541Srgrimes# tmp files: 221541Srgrimessysdcl="sysent.dcl" 231541Srgrimessyscompat="sysent.compat" 2411294Sswallacesyscompatdcl="sysent.compatdcl" 251541Srgrimessysent="sysent.switch" 2611294Sswallacesysinc="sysinc.switch" 2711294Sswallacesysarg="sysarg.switch" 281541Srgrimes 2911294Sswallacetrap "rm $sysdcl $syscompat $syscompatdcl $sysent $sysinc $sysarg" 0 301541Srgrimes 311541Srgrimescase $# in 3211294Sswallace 0) echo "Usage: $0 input-file <config-file>" 1>&2 331541Srgrimes exit 1 341541Srgrimes ;; 351541Srgrimesesac 361541Srgrimes 3711294Sswallaceif [ -f $2 ]; then 3811294Sswallace . $2 3911294Sswallacefi 4011294Sswallace 4111294Sswallacesed -e ' 4211294Sswallaces/\$//g 4311294Sswallace:join 4411294Sswallace /\\$/{a\ 4511294Sswallace 4611294Sswallace N 4711294Sswallace s/\\\n// 4811294Sswallace b join 4911294Sswallace } 5011294Sswallace2,${ 5111294Sswallace /^#/!s/\([{}()*,]\)/ \1 /g 5211294Sswallace} 5311294Sswallace' < $1 | awk " 541541Srgrimes BEGIN { 551541Srgrimes sysdcl = \"$sysdcl\" 5610905Sbde sysproto = \"$sysproto\" 5710905Sbde sysproto_h = \"$sysproto_h\" 581541Srgrimes syscompat = \"$syscompat\" 5911294Sswallace syscompatdcl = \"$syscompatdcl\" 601541Srgrimes sysent = \"$sysent\" 6111294Sswallace sysinc = \"$sysinc\" 6211294Sswallace sysarg = \"$sysarg\" 631541Srgrimes sysnames = \"$sysnames\" 641541Srgrimes syshdr = \"$syshdr\" 651541Srgrimes compat = \"$compat\" 662700Swollman syshide = \"$syshide\" 6711294Sswallace syscallprefix = \"$syscallprefix\" 6811294Sswallace switchname = \"$switchname\" 6911294Sswallace namesname = \"$namesname\" 701541Srgrimes infile = \"$1\" 711541Srgrimes "' 721541Srgrimes 7311294Sswallace printf "/*\n * System call switch table.\n *\n" > sysinc 7411294Sswallace printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysinc 7510905Sbde 7611294Sswallace printf "/*\n * System call prototypes.\n *\n" > sysarg 7711294Sswallace printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysarg 781541Srgrimes 7910905Sbde printf "\n#ifdef %s\n\n", compat > syscompat 801541Srgrimes 811541Srgrimes printf "/*\n * System call names.\n *\n" > sysnames 821541Srgrimes printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysnames 831541Srgrimes 841541Srgrimes printf "/*\n * System call numbers.\n *\n" > syshdr 851541Srgrimes printf " * DO NOT EDIT-- this file is automatically generated.\n" > syshdr 862700Swollman printf "/*\n * System call hiders.\n *\n" > syshide 872700Swollman printf " * DO NOT EDIT-- this file is automatically generated.\n" > syshide 881541Srgrimes } 891541Srgrimes NR == 1 { 9010906Sbde gsub("[$]Id: ", "", $0) 9110906Sbde gsub(" [$]", "", $0) 9211294Sswallace 9311294Sswallace printf " * created from%s\n */\n\n", $0 > sysinc 9411294Sswallace 9511294Sswallace printf "\n#ifdef %s\n", compat > sysent 9610905Sbde printf "#define compat(n, name) n, (sy_call_t *)__CONCAT(o,name)\n" > sysent 9710905Sbde printf("#else\n") > sysent 9810905Sbde printf("#define compat(n, name) 0, (sy_call_t *)nosys\n") > sysent 9910905Sbde printf("#endif\n\n") > sysent 10010905Sbde printf("/* The casts are bogus but will do for now. */\n") > sysent 10111294Sswallace printf "struct sysent %s[] = {\n",switchname > sysent 10210905Sbde 10311294Sswallace printf " * created from%s\n */\n\n", $0 > sysarg 10411294Sswallace printf("#ifndef %s\n", sysproto_h) > sysarg 10511294Sswallace printf("#define\t%s\n\n", sysproto_h) > sysarg 10611294Sswallace printf "#include <sys/types.h>\n", $0 > sysarg 10711294Sswallace printf "#include <sys/param.h>\n", $0 > sysarg 10811294Sswallace printf "#include <sys/mount.h>\n\n", $0 > sysarg 1091541Srgrimes 1101541Srgrimes printf " * created from%s\n */\n\n", $0 > sysnames 11111294Sswallace printf "char *%s[] = {\n", namesname > sysnames 1121541Srgrimes 1131541Srgrimes printf " * created from%s\n */\n\n", $0 > syshdr 1142700Swollman 1152700Swollman printf " * created from%s\n */\n\n", $0 > syshide 1161541Srgrimes next 1171541Srgrimes } 1181541Srgrimes NF == 0 || $1 ~ /^;/ { 1191541Srgrimes next 1201541Srgrimes } 12111294Sswallace $1 ~ /^#[ ]*include/ { 12211294Sswallace print > sysinc 12311294Sswallace next 12411294Sswallace } 1251541Srgrimes $1 ~ /^#[ ]*if/ { 1261541Srgrimes print > sysent 1271541Srgrimes print > sysdcl 12811294Sswallace print > sysarg 1291541Srgrimes print > syscompat 1301541Srgrimes print > sysnames 1312700Swollman print > syshide 1321541Srgrimes savesyscall = syscall 1331541Srgrimes next 1341541Srgrimes } 1351541Srgrimes $1 ~ /^#[ ]*else/ { 1361541Srgrimes print > sysent 1371541Srgrimes print > sysdcl 13811294Sswallace print > sysarg 1391541Srgrimes print > syscompat 1401541Srgrimes print > sysnames 1412700Swollman print > syshide 1421541Srgrimes syscall = savesyscall 1431541Srgrimes next 1441541Srgrimes } 1451541Srgrimes $1 ~ /^#/ { 1461541Srgrimes print > sysent 1471541Srgrimes print > sysdcl 14811294Sswallace print > sysarg 1491541Srgrimes print > syscompat 1501541Srgrimes print > sysnames 1512700Swollman print > syshide 1521541Srgrimes next 1531541Srgrimes } 1541541Srgrimes syscall != $1 { 1551541Srgrimes printf "%s: line %d: syscall number out of sync at %d\n", \ 1561541Srgrimes infile, NR, syscall 1571541Srgrimes printf "line is:\n" 1581541Srgrimes print 1591541Srgrimes exit 1 1601541Srgrimes } 16111294Sswallace function parserr(was, wanted) { 16211294Sswallace printf "%s: line %d: unexpected %s (expected %s)\n", \ 16311294Sswallace infile, NR, was, wanted 16411294Sswallace exit 1 16511294Sswallace } 16611294Sswallace function parseline() { 16711294Sswallace f=4 # toss number and type 16811294Sswallace argc= 0; 16911294Sswallace bigargc = 0; 17011294Sswallace if ($NF != "}") { 17111294Sswallace funcalias=$(NF-2) 17211294Sswallace argalias=$(NF-1) 17311294Sswallace rettype=$NF 17411294Sswallace end=NF-3 17511294Sswallace } else { 17611294Sswallace funcalias="" 17711294Sswallace argalias="" 17811294Sswallace rettype="int" 17911294Sswallace end=NF 18010905Sbde } 18111294Sswallace if ($2 == "NODEF") { 18211294Sswallace funcname=$4 18311294Sswallace return 18411294Sswallace } 18511294Sswallace if ($f != "{") 18611294Sswallace parserr($f, "{") 18711294Sswallace f++ 18811294Sswallace if ($end != "}") 18911294Sswallace parserr($end, "}") 19011294Sswallace end-- 19111294Sswallace if ($end != ";") 19211294Sswallace parserr($end, ";") 19311294Sswallace end-- 19411294Sswallace if ($end != ")") 19511294Sswallace parserr($end, ")") 19611294Sswallace end-- 19711294Sswallace 19811294Sswallace f++ #function return type 19911294Sswallace 20011294Sswallace funcname=$f 20111294Sswallace if (funcalias == "") 20211294Sswallace funcalias = funcname 20311294Sswallace if (argalias == "") { 20411294Sswallace argalias = funcname "_args" 20511330Sswallace if ($2 == "COMPAT") 20611330Sswallace argalias = "o" argalias 20711294Sswallace } 20811294Sswallace f++ 20911294Sswallace 21011294Sswallace if ($f != "(") 21111294Sswallace parserr($f, ")") 21211294Sswallace f++ 21311294Sswallace 21411294Sswallace if (f == end) { 21511294Sswallace if ($f != "void") 21611294Sswallace parserr($f, "argument definition") 21711294Sswallace return 21811294Sswallace } 21911294Sswallace 22011294Sswallace while (f <= end) { 22111294Sswallace argc++ 22211294Sswallace argtype[argc]="" 22311294Sswallace oldf="" 22411294Sswallace while (f < end && $(f+1) != ",") { 22511294Sswallace if (argtype[argc] != "" && oldf != "*") 22611294Sswallace argtype[argc] = argtype[argc]" "; 22711294Sswallace argtype[argc] = argtype[argc]$f; 22811294Sswallace oldf = $f; 22911294Sswallace f++ 23011294Sswallace } 23111294Sswallace if (argtype[argc] == "") 23211294Sswallace parserr($f, "argument definition") 23311294Sswallace if (argtype[argc] == "off_t") 23411294Sswallace bigargc++ 23511294Sswallace argname[argc]=$f; 23611294Sswallace f += 2; # skip name, and any comma 23711294Sswallace } 2381541Srgrimes } 23911294Sswallace { comment = $4 24011294Sswallace if (NF < 7) 24111294Sswallace for (i = 5; i <= NF; i++) 24211294Sswallace comment = comment " " $i 24311294Sswallace } 24411294Sswallace $2 == "STD" || $2 == "NODEF" || $2 == "NOARGS" || $2 == "NOPROTO" { 24511294Sswallace parseline() 24611330Sswallace if ((!nosys || funcname != "nosys") && \ 24711330Sswallace (funcname != "lkmnosys")) { 24811294Sswallace if (argc != 0 && $2 != "NOARGS" && $2 != "NOPROTO") { 24911294Sswallace printf("struct\t%s {\n", argalias) > sysarg 25011294Sswallace for (i = 1; i <= argc; i++) 25111294Sswallace printf("\t%s %s;\n", argtype[i], 25211294Sswallace argname[i]) > sysarg 25311294Sswallace printf("};\n") > sysarg 25411294Sswallace } 25511330Sswallace else if($2 != "NOARGS" && $2 != "NOPROTO") 25611330Sswallace printf("struct\t%s {\n\tint dummy;\n};\n", \ 25711330Sswallace argalias) > sysarg 25810905Sbde } 25911330Sswallace if ($2 != "NOPROTO" && (!nosys || funcname != "nosys") && \ 26011330Sswallace (!lkmnosys || funcname != "lkmnosys")) { 26111330Sswallace if (funcname == "exit") 26211330Sswallace printf("__dead ") > sysdcl 26311330Sswallace printf("%s\t%s __P((struct proc *, struct %s *, int []));\n", \ 26411330Sswallace rettype, funcname, argalias) > sysdcl 26511330Sswallace } 26611294Sswallace if (funcname == "nosys") 2672671Sats nosys = 1 26811294Sswallace if (funcname == "lkmnosys") 2694216Sats lkmnosys = 1 27011294Sswallace printf("\t{ %d, (sy_call_t *)%s },\t\t", \ 27111294Sswallace argc+bigargc, funcname) > sysent 27211294Sswallace if(length(funcname) < 11) 27311294Sswallace printf("\t") > sysent 27411294Sswallace printf("/* %d = %s */\n", syscall, funcalias) > sysent 2751541Srgrimes printf("\t\"%s\",\t\t\t/* %d = %s */\n", \ 27611294Sswallace funcalias, syscall, funcalias) > sysnames 27711294Sswallace if ($2 != "NODEF") 27811294Sswallace printf("#define\t%s%s\t%d\n", syscallprefix, \ 27911294Sswallace funcalias, syscall) > syshdr 28011294Sswallace if ($3 != "NOHIDE") 28111294Sswallace printf("HIDE_%s(%s)\n", $3, funcname) > syshide 2821541Srgrimes syscall++ 2831541Srgrimes next 2841541Srgrimes } 28511330Sswallace $2 == "COMPAT" || $2 == "CPT_NOA" { 28611294Sswallace parseline() 28711330Sswallace if (argc != 0 && $2 != "CPT_NOA") { 28811294Sswallace printf("struct\t%s {\n", argalias) > syscompat 28911294Sswallace for (i = 1; i <= argc; i++) 29011294Sswallace printf("\t%s %s;\n", argtype[i], 29111294Sswallace argname[i]) > syscompat 29211294Sswallace printf("};\n") > syscompat 29311294Sswallace } 29411330Sswallace else if($2 != "CPT_NOA") 29511330Sswallace printf("struct\t%s {\n\tint dummy;\n};\n", \ 29611330Sswallace argalias) > sysarg 29710905Sbde printf("%s\to%s __P((struct proc *, struct %s *, int []));\n", \ 29811294Sswallace rettype, funcname, argalias) > syscompatdcl 2991541Srgrimes printf("\t{ compat(%d,%s) },\t\t/* %d = old %s */\n", \ 30011294Sswallace argc+bigargc, funcname, syscall, funcalias) > sysent 3011541Srgrimes printf("\t\"old.%s\",\t\t/* %d = old %s */\n", \ 30211294Sswallace funcalias, syscall, funcalias) > sysnames 3031541Srgrimes printf("\t\t\t\t/* %d is old %s */\n", \ 30411294Sswallace syscall, funcalias) > syshdr 30511294Sswallace if ($3 != "NOHIDE") 30611294Sswallace printf("HIDE_%s(%s)\n", $3, funcname) > syshide 3071541Srgrimes syscall++ 3081541Srgrimes next 3091541Srgrimes } 3101541Srgrimes $2 == "LIBCOMPAT" { 31111294Sswallace parseline() 31211294Sswallace printf("%s\to%s();\n", rettype, funcname) > syscompatdcl 3131541Srgrimes printf("\t{ compat(%d,%s) },\t\t/* %d = old %s */\n", \ 31411294Sswallace argc+bigargc, funcname, syscall, funcalias) > sysent 3151541Srgrimes printf("\t\"old.%s\",\t\t/* %d = old %s */\n", \ 31611294Sswallace funcalias, syscall, funcalias) > sysnames 31711294Sswallace printf("#define\t%s%s\t%d\t/* compatibility; still used by libc */\n", \ 31811294Sswallace syscallprefix, funcalias, syscall) > syshdr 31911294Sswallace if ($3 != "NOHIDE") 32011294Sswallace printf("HIDE_%s(%s)\n", $3, funcname) > syshide 3211541Srgrimes syscall++ 3221541Srgrimes next 3231541Srgrimes } 3241541Srgrimes $2 == "OBSOL" { 32510905Sbde printf("\t{ 0, (sy_call_t *)nosys },\t\t\t/* %d = obsolete %s */\n", \ 3261541Srgrimes syscall, comment) > sysent 3271541Srgrimes printf("\t\"obs_%s\",\t\t\t/* %d = obsolete %s */\n", \ 32811294Sswallace $4, syscall, comment) > sysnames 3291541Srgrimes printf("\t\t\t\t/* %d is obsolete %s */\n", \ 3301541Srgrimes syscall, comment) > syshdr 33111294Sswallace if ($3 != "NOHIDE") 33211294Sswallace printf("HIDE_%s(%s)\n", $3, $4) > syshide 3331541Srgrimes syscall++ 3341541Srgrimes next 3351541Srgrimes } 3361541Srgrimes $2 == "UNIMPL" { 33710905Sbde printf("\t{ 0, (sy_call_t *)nosys },\t\t\t/* %d = %s */\n", \ 3381541Srgrimes syscall, comment) > sysent 3391541Srgrimes printf("\t\"#%d\",\t\t\t/* %d = %s */\n", \ 3401541Srgrimes syscall, syscall, comment) > sysnames 34111294Sswallace if ($3 != "NOHIDE") 34211294Sswallace printf("HIDE_%s(%s)\n", $3, $4) > syshide 3431541Srgrimes syscall++ 3441541Srgrimes next 3451541Srgrimes } 3461541Srgrimes { 3471541Srgrimes printf "%s: line %d: unrecognized keyword %s\n", infile, NR, $2 3481541Srgrimes exit 1 3491541Srgrimes } 3501541Srgrimes END { 35111294Sswallace printf("\n#endif /* %s */\n", compat) > syscompatdcl 35211294Sswallace printf("\n#endif /* !%s */\n", sysproto_h) > syscompatdcl 3531541Srgrimes 35414331Speter printf("};\n") > sysent 3551541Srgrimes printf("};\n") > sysnames 35611294Sswallace printf("#define\t%sMAXSYSCALL\t%d\n", syscallprefix, syscall) \ 35711294Sswallace > syshdr 3581541Srgrimes } ' 3591541Srgrimes 36011294Sswallacecat $sysinc $sysent >$syssw 36111294Sswallacecat $sysarg $sysdcl $syscompat $syscompatdcl > $sysproto 362