makesyscalls.sh revision 54803
11541Srgrimes#! /bin/sh - 21541Srgrimes# @(#)makesyscalls.sh 8.1 (Berkeley) 6/10/93 350477Speter# $FreeBSD: head/sys/kern/makesyscalls.sh 54803 1999-12-19 06:08:07Z rwatson $ 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" 1534354Sjbsysmk="../sys/syscall.mk" 161541Srgrimessyssw="init_sysent.c" 172700Swollmansyshide="../sys/syscall-hide.h" 1811294Sswallacesyscallprefix="SYS_" 1911294Sswallaceswitchname="sysent" 2011294Sswallacenamesname="syscallnames" 211541Srgrimes 221541Srgrimes# tmp files: 2331627Sjmgsysdcl="sysent.dcl.$$" 2431627Sjmgsyscompat="sysent.compat.$$" 2531627Sjmgsyscompatdcl="sysent.compatdcl.$$" 2631627Sjmgsysent="sysent.switch.$$" 2731627Sjmgsysinc="sysinc.switch.$$" 2831627Sjmgsysarg="sysarg.switch.$$" 291541Srgrimes 3011294Sswallacetrap "rm $sysdcl $syscompat $syscompatdcl $sysent $sysinc $sysarg" 0 311541Srgrimes 3224373Spetertouch $sysdcl $syscompat $syscompatdcl $sysent $sysinc $sysarg 3324373Speter 341541Srgrimescase $# in 3511294Sswallace 0) echo "Usage: $0 input-file <config-file>" 1>&2 361541Srgrimes exit 1 371541Srgrimes ;; 381541Srgrimesesac 391541Srgrimes 4036735Sdfrif [ -n "$2" -a -f "$2" ]; then 4111294Sswallace . $2 4211294Sswallacefi 4311294Sswallace 4411294Sswallacesed -e ' 4511294Sswallaces/\$//g 4611294Sswallace:join 4711294Sswallace /\\$/{a\ 4811294Sswallace 4911294Sswallace N 5011294Sswallace s/\\\n// 5111294Sswallace b join 5211294Sswallace } 5311294Sswallace2,${ 5411294Sswallace /^#/!s/\([{}()*,]\)/ \1 /g 5511294Sswallace} 5611294Sswallace' < $1 | awk " 571541Srgrimes BEGIN { 581541Srgrimes sysdcl = \"$sysdcl\" 5910905Sbde sysproto = \"$sysproto\" 6010905Sbde sysproto_h = \"$sysproto_h\" 611541Srgrimes syscompat = \"$syscompat\" 6211294Sswallace syscompatdcl = \"$syscompatdcl\" 631541Srgrimes sysent = \"$sysent\" 6436782Sbde syssw = \"$syssw\" 6511294Sswallace sysinc = \"$sysinc\" 6611294Sswallace sysarg = \"$sysarg\" 671541Srgrimes sysnames = \"$sysnames\" 681541Srgrimes syshdr = \"$syshdr\" 6934354Sjb sysmk = \"$sysmk\" 701541Srgrimes compat = \"$compat\" 712700Swollman syshide = \"$syshide\" 7211294Sswallace syscallprefix = \"$syscallprefix\" 7311294Sswallace switchname = \"$switchname\" 7411294Sswallace namesname = \"$namesname\" 751541Srgrimes infile = \"$1\" 761541Srgrimes "' 771541Srgrimes 7836782Sbde printf "/*\n * System call switch table.\n *\n" > syssw 7936782Sbde printf " * DO NOT EDIT-- this file is automatically generated.\n" > syssw 8051135Speter printf " * \$\FreeBSD\$\n" > syssw 8110905Sbde 8211294Sswallace printf "/*\n * System call prototypes.\n *\n" > sysarg 8311294Sswallace printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysarg 8451135Speter printf " * \$\FreeBSD\$\n" > sysarg 851541Srgrimes 8631785Seivind printf "\n#ifdef %s\n\n", compat > syscompat 871541Srgrimes 881541Srgrimes printf "/*\n * System call names.\n *\n" > sysnames 891541Srgrimes printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysnames 9051135Speter printf " * \$\FreeBSD\$\n" > sysnames 911541Srgrimes 921541Srgrimes printf "/*\n * System call numbers.\n *\n" > syshdr 931541Srgrimes printf " * DO NOT EDIT-- this file is automatically generated.\n" > syshdr 9451135Speter printf " * \$\FreeBSD\$\n" > syshdr 9534354Sjb printf "# FreeBSD system call names.\n" > sysmk 9634354Sjb printf "# DO NOT EDIT-- this file is automatically generated.\n" > sysmk 9751135Speter printf "# \$\FreeBSD\$\n" > sysmk 982700Swollman printf "/*\n * System call hiders.\n *\n" > syshide 992700Swollman printf " * DO NOT EDIT-- this file is automatically generated.\n" > syshide 10051135Speter printf " * \$\FreeBSD\$\n" > syshide 1011541Srgrimes } 1021541Srgrimes NR == 1 { 10350478Speter gsub("[$]FreeBSD: ", "", $0) 10410906Sbde gsub(" [$]", "", $0) 10511294Sswallace 10636782Sbde printf " * created from%s\n */\n\n", $0 > syssw 10711294Sswallace 10836782Sbde printf "\n/* The casts are bogus but will do for now. */\n" > sysent 10911294Sswallace printf "struct sysent %s[] = {\n",switchname > sysent 11010905Sbde 11111294Sswallace printf " * created from%s\n */\n\n", $0 > sysarg 11233039Sbde printf "#ifndef %s\n", sysproto_h > sysarg 11333039Sbde printf "#define\t%s\n\n", sysproto_h > sysarg 11433039Sbde printf "#include <sys/signal.h>\n\n" > sysarg 11554803Srwatson printf "#include <sys/acl.h>\n\n" > sysarg 11633039Sbde printf "struct proc;\n\n" > sysarg 11736770Sbde printf "#define\tPAD_(t)\t(sizeof(register_t) <= sizeof(t) ? \\\n" > sysarg 11836770Sbde printf "\t\t0 : sizeof(register_t) - sizeof(t))\n\n" > sysarg 1191541Srgrimes 1201541Srgrimes printf " * created from%s\n */\n\n", $0 > sysnames 12111294Sswallace printf "char *%s[] = {\n", namesname > sysnames 1221541Srgrimes 1231541Srgrimes printf " * created from%s\n */\n\n", $0 > syshdr 1242700Swollman 12534354Sjb printf "# created from%s\nMIASM = ", $0 > sysmk 12634354Sjb 1272700Swollman printf " * created from%s\n */\n\n", $0 > syshide 1281541Srgrimes next 1291541Srgrimes } 1301541Srgrimes NF == 0 || $1 ~ /^;/ { 1311541Srgrimes next 1321541Srgrimes } 13311294Sswallace $1 ~ /^#[ ]*include/ { 13411294Sswallace print > sysinc 13511294Sswallace next 13611294Sswallace } 1371541Srgrimes $1 ~ /^#[ ]*if/ { 1381541Srgrimes print > sysent 1391541Srgrimes print > sysdcl 14011294Sswallace print > sysarg 1411541Srgrimes print > syscompat 1421541Srgrimes print > sysnames 1432700Swollman print > syshide 1441541Srgrimes savesyscall = syscall 1451541Srgrimes next 1461541Srgrimes } 1471541Srgrimes $1 ~ /^#[ ]*else/ { 1481541Srgrimes print > sysent 1491541Srgrimes print > sysdcl 15011294Sswallace print > sysarg 1511541Srgrimes print > syscompat 1521541Srgrimes print > sysnames 1532700Swollman print > syshide 1541541Srgrimes syscall = savesyscall 1551541Srgrimes next 1561541Srgrimes } 1571541Srgrimes $1 ~ /^#/ { 1581541Srgrimes print > sysent 1591541Srgrimes print > sysdcl 16011294Sswallace print > sysarg 1611541Srgrimes print > syscompat 1621541Srgrimes print > sysnames 1632700Swollman print > syshide 1641541Srgrimes next 1651541Srgrimes } 1661541Srgrimes syscall != $1 { 16736770Sbde printf "%s: line %d: syscall number out of sync at %d\n", 16836770Sbde infile, NR, syscall 1691541Srgrimes printf "line is:\n" 1701541Srgrimes print 1711541Srgrimes exit 1 1721541Srgrimes } 17311294Sswallace function parserr(was, wanted) { 17436770Sbde printf "%s: line %d: unexpected %s (expected %s)\n", 17511294Sswallace infile, NR, was, wanted 17611294Sswallace exit 1 17711294Sswallace } 17811294Sswallace function parseline() { 17911294Sswallace f=4 # toss number and type 18011294Sswallace argc= 0; 18111294Sswallace bigargc = 0; 18211294Sswallace if ($NF != "}") { 18311294Sswallace funcalias=$(NF-2) 18411294Sswallace argalias=$(NF-1) 18511294Sswallace rettype=$NF 18611294Sswallace end=NF-3 18711294Sswallace } else { 18811294Sswallace funcalias="" 18911294Sswallace argalias="" 19011294Sswallace rettype="int" 19111294Sswallace end=NF 19210905Sbde } 19311294Sswallace if ($2 == "NODEF") { 19411294Sswallace funcname=$4 19511294Sswallace return 19611294Sswallace } 19711294Sswallace if ($f != "{") 19811294Sswallace parserr($f, "{") 19911294Sswallace f++ 20011294Sswallace if ($end != "}") 20111294Sswallace parserr($end, "}") 20211294Sswallace end-- 20311294Sswallace if ($end != ";") 20411294Sswallace parserr($end, ";") 20511294Sswallace end-- 20611294Sswallace if ($end != ")") 20711294Sswallace parserr($end, ")") 20811294Sswallace end-- 20911294Sswallace 21011294Sswallace f++ #function return type 21111294Sswallace 21211294Sswallace funcname=$f 21311294Sswallace if (funcalias == "") 21411294Sswallace funcalias = funcname 21511294Sswallace if (argalias == "") { 21611294Sswallace argalias = funcname "_args" 21711330Sswallace if ($2 == "COMPAT") 21811330Sswallace argalias = "o" argalias 21911294Sswallace } 22011294Sswallace f++ 22111294Sswallace 22211294Sswallace if ($f != "(") 22311294Sswallace parserr($f, ")") 22411294Sswallace f++ 22511294Sswallace 22611294Sswallace if (f == end) { 22711294Sswallace if ($f != "void") 22811294Sswallace parserr($f, "argument definition") 22911294Sswallace return 23011294Sswallace } 23111294Sswallace 23211294Sswallace while (f <= end) { 23311294Sswallace argc++ 23411294Sswallace argtype[argc]="" 23511294Sswallace oldf="" 23611294Sswallace while (f < end && $(f+1) != ",") { 23711294Sswallace if (argtype[argc] != "" && oldf != "*") 23811294Sswallace argtype[argc] = argtype[argc]" "; 23911294Sswallace argtype[argc] = argtype[argc]$f; 24011294Sswallace oldf = $f; 24111294Sswallace f++ 24211294Sswallace } 24311294Sswallace if (argtype[argc] == "") 24411294Sswallace parserr($f, "argument definition") 24511294Sswallace if (argtype[argc] == "off_t") 24611294Sswallace bigargc++ 24711294Sswallace argname[argc]=$f; 24811294Sswallace f += 2; # skip name, and any comma 24911294Sswallace } 2501541Srgrimes } 25111294Sswallace { comment = $4 25211294Sswallace if (NF < 7) 25311294Sswallace for (i = 5; i <= NF; i++) 25411294Sswallace comment = comment " " $i 25511294Sswallace } 25630740Sphk $2 == "STD" || $2 == "NODEF" || $2 == "NOARGS" || $2 == "NOPROTO" \ 25730740Sphk || $2 == "NOIMPL" { 25811294Sswallace parseline() 25911330Sswallace if ((!nosys || funcname != "nosys") && \ 26011330Sswallace (funcname != "lkmnosys")) { 26111294Sswallace if (argc != 0 && $2 != "NOARGS" && $2 != "NOPROTO") { 26211294Sswallace printf("struct\t%s {\n", argalias) > sysarg 26311294Sswallace for (i = 1; i <= argc; i++) 26436770Sbde printf("\t%s\t%s;\tchar %s_[PAD_(%s)];\n", 26536735Sdfr argtype[i], argname[i], 26636735Sdfr argname[i], argtype[i]) > sysarg 26711294Sswallace printf("};\n") > sysarg 26811294Sswallace } 26911330Sswallace else if($2 != "NOARGS" && $2 != "NOPROTO") 27036770Sbde printf("struct\t%s {\n\tregister_t dummy;\n};\n", 27136770Sbde argalias) > sysarg 27210905Sbde } 27311330Sswallace if ($2 != "NOPROTO" && (!nosys || funcname != "nosys") && \ 27411330Sswallace (!lkmnosys || funcname != "lkmnosys")) { 27536770Sbde printf("%s\t%s __P((struct proc *, struct %s *))", 27618277Sbde rettype, funcname, argalias) > sysdcl 27711330Sswallace if (funcname == "exit") 27818277Sbde printf(" __dead2") > sysdcl 27918277Sbde printf(";\n") > sysdcl 28011330Sswallace } 28111294Sswallace if (funcname == "nosys") 2822671Sats nosys = 1 28311294Sswallace if (funcname == "lkmnosys") 2844216Sats lkmnosys = 1 28530740Sphk if ($2 != "NOIMPL") { 28636770Sbde printf("\t{ %d, (sy_call_t *)%s },\t\t", 28730740Sphk argc+bigargc, funcname) > sysent 28830740Sphk if(length(funcname) < 11) 28930740Sphk printf("\t") > sysent 29030740Sphk printf("/* %d = %s */\n", syscall, funcalias) > sysent 29130740Sphk } else { 29236770Sbde printf("\t{ %d, (sy_call_t *)%s },\t\t", 29330740Sphk argc+bigargc, "nosys") > sysent 29430740Sphk if(length("nosys") < 11) 29530740Sphk printf("\t") > sysent 29630740Sphk printf("/* %d = %s */\n", syscall, funcalias) > sysent 29730740Sphk } 29836770Sbde printf("\t\"%s\",\t\t\t/* %d = %s */\n", 29911294Sswallace funcalias, syscall, funcalias) > sysnames 30034354Sjb if ($2 != "NODEF") { 30136770Sbde printf("#define\t%s%s\t%d\n", syscallprefix, 30211294Sswallace funcalias, syscall) > syshdr 30334354Sjb printf(" \\\n\t%s.o", funcalias) > sysmk 30434354Sjb } 30511294Sswallace if ($3 != "NOHIDE") 30611294Sswallace printf("HIDE_%s(%s)\n", $3, funcname) > syshide 3071541Srgrimes syscall++ 3081541Srgrimes next 3091541Srgrimes } 31011330Sswallace $2 == "COMPAT" || $2 == "CPT_NOA" { 31136782Sbde ncompat++ 31211294Sswallace parseline() 31311330Sswallace if (argc != 0 && $2 != "CPT_NOA") { 31411294Sswallace printf("struct\t%s {\n", argalias) > syscompat 31511294Sswallace for (i = 1; i <= argc; i++) 31636770Sbde printf("\t%s\t%s;\tchar %s_[PAD_(%s)];\n", 31736735Sdfr argtype[i], argname[i], 31836735Sdfr argname[i], argtype[i]) > syscompat 31911294Sswallace printf("};\n") > syscompat 32011294Sswallace } 32111330Sswallace else if($2 != "CPT_NOA") 32236770Sbde printf("struct\t%s {\n\tregister_t dummy;\n};\n", 32336770Sbde argalias) > sysarg 32436770Sbde printf("%s\to%s __P((struct proc *, struct %s *));\n", 32511294Sswallace rettype, funcname, argalias) > syscompatdcl 32636770Sbde printf("\t{ compat(%d,%s) },\t\t/* %d = old %s */\n", 32711294Sswallace argc+bigargc, funcname, syscall, funcalias) > sysent 32836770Sbde printf("\t\"old.%s\",\t\t/* %d = old %s */\n", 32911294Sswallace funcalias, syscall, funcalias) > sysnames 33036770Sbde printf("\t\t\t\t/* %d is old %s */\n", 33111294Sswallace syscall, funcalias) > syshdr 33211294Sswallace if ($3 != "NOHIDE") 33311294Sswallace printf("HIDE_%s(%s)\n", $3, funcname) > syshide 3341541Srgrimes syscall++ 3351541Srgrimes next 3361541Srgrimes } 3371541Srgrimes $2 == "LIBCOMPAT" { 33836782Sbde ncompat++ 33911294Sswallace parseline() 34011294Sswallace printf("%s\to%s();\n", rettype, funcname) > syscompatdcl 34136770Sbde printf("\t{ compat(%d,%s) },\t\t/* %d = old %s */\n", 34211294Sswallace argc+bigargc, funcname, syscall, funcalias) > sysent 34336770Sbde printf("\t\"old.%s\",\t\t/* %d = old %s */\n", 34411294Sswallace funcalias, syscall, funcalias) > sysnames 34536770Sbde printf("#define\t%s%s\t%d\t/* compatibility; still used by libc */\n", 34611294Sswallace syscallprefix, funcalias, syscall) > syshdr 34734354Sjb printf(" \\\n\t%s.o", funcalias) > sysmk 34811294Sswallace if ($3 != "NOHIDE") 34911294Sswallace printf("HIDE_%s(%s)\n", $3, funcname) > syshide 3501541Srgrimes syscall++ 3511541Srgrimes next 3521541Srgrimes } 3531541Srgrimes $2 == "OBSOL" { 35436770Sbde printf("\t{ 0, (sy_call_t *)nosys },\t\t\t/* %d = obsolete %s */\n", 3551541Srgrimes syscall, comment) > sysent 35636770Sbde printf("\t\"obs_%s\",\t\t\t/* %d = obsolete %s */\n", 35711294Sswallace $4, syscall, comment) > sysnames 35836770Sbde printf("\t\t\t\t/* %d is obsolete %s */\n", 3591541Srgrimes syscall, comment) > syshdr 36011294Sswallace if ($3 != "NOHIDE") 36111294Sswallace printf("HIDE_%s(%s)\n", $3, $4) > syshide 3621541Srgrimes syscall++ 3631541Srgrimes next 3641541Srgrimes } 3651541Srgrimes $2 == "UNIMPL" { 36636770Sbde printf("\t{ 0, (sy_call_t *)nosys },\t\t\t/* %d = %s */\n", 3671541Srgrimes syscall, comment) > sysent 36836770Sbde printf("\t\"#%d\",\t\t\t/* %d = %s */\n", 3691541Srgrimes syscall, syscall, comment) > sysnames 37011294Sswallace if ($3 != "NOHIDE") 37111294Sswallace printf("HIDE_%s(%s)\n", $3, $4) > syshide 3721541Srgrimes syscall++ 3731541Srgrimes next 3741541Srgrimes } 3751541Srgrimes { 3761541Srgrimes printf "%s: line %d: unrecognized keyword %s\n", infile, NR, $2 3771541Srgrimes exit 1 3781541Srgrimes } 3791541Srgrimes END { 38036782Sbde if (ncompat != 0) { 38136782Sbde printf "#include \"opt_compat.h\"\n\n" > syssw 38236782Sbde printf "\n#ifdef %s\n", compat > sysinc 38336782Sbde printf "#define compat(n, name) n, (sy_call_t *)__CONCAT(o,name)\n" > sysinc 38436782Sbde printf "#else\n" > sysinc 38536782Sbde printf "#define compat(n, name) 0, (sy_call_t *)nosys\n" > sysinc 38636782Sbde printf "#endif\n" > sysinc 38736782Sbde } 38836782Sbde 38936735Sdfr printf("\n#endif /* %s */\n\n", compat) > syscompatdcl 39036735Sdfr printf("#undef PAD_\n") > syscompatdcl 39111294Sswallace printf("\n#endif /* !%s */\n", sysproto_h) > syscompatdcl 3921541Srgrimes 39337227Sphk printf("\n") > sysmk 39414331Speter printf("};\n") > sysent 3951541Srgrimes printf("};\n") > sysnames 39611294Sswallace printf("#define\t%sMAXSYSCALL\t%d\n", syscallprefix, syscall) \ 39736770Sbde > syshdr 3981541Srgrimes } ' 3991541Srgrimes 40036782Sbdecat $sysinc $sysent >> $syssw 40111294Sswallacecat $sysarg $sysdcl $syscompat $syscompatdcl > $sysproto 402