makesyscalls.sh revision 60287
11541Srgrimes#! /bin/sh - 21541Srgrimes# @(#)makesyscalls.sh 8.1 (Berkeley) 6/10/93 350477Speter# $FreeBSD: head/sys/kern/makesyscalls.sh 60287 2000-05-09 21:18:30Z bde $ 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 } 17360287Sbde function align_sysent_comment(column) { 17460287Sbde printf("\t") > sysent 17560287Sbde column = column + 8 - column % 8 17660287Sbde while (column < 56) { 17760287Sbde printf("\t") > sysent 17860287Sbde column = column + 8 17960287Sbde } 18060287Sbde } 18111294Sswallace function parserr(was, wanted) { 18236770Sbde printf "%s: line %d: unexpected %s (expected %s)\n", 18311294Sswallace infile, NR, was, wanted 18411294Sswallace exit 1 18511294Sswallace } 18611294Sswallace function parseline() { 18711294Sswallace f=4 # toss number and type 18811294Sswallace argc= 0; 18960287Sbde argssize = "0" 19011294Sswallace if ($NF != "}") { 19111294Sswallace funcalias=$(NF-2) 19211294Sswallace argalias=$(NF-1) 19311294Sswallace rettype=$NF 19411294Sswallace end=NF-3 19511294Sswallace } else { 19611294Sswallace funcalias="" 19711294Sswallace argalias="" 19811294Sswallace rettype="int" 19911294Sswallace end=NF 20010905Sbde } 20111294Sswallace if ($2 == "NODEF") { 20211294Sswallace funcname=$4 20311294Sswallace return 20411294Sswallace } 20511294Sswallace if ($f != "{") 20611294Sswallace parserr($f, "{") 20711294Sswallace f++ 20811294Sswallace if ($end != "}") 20911294Sswallace parserr($end, "}") 21011294Sswallace end-- 21111294Sswallace if ($end != ";") 21211294Sswallace parserr($end, ";") 21311294Sswallace end-- 21411294Sswallace if ($end != ")") 21511294Sswallace parserr($end, ")") 21611294Sswallace end-- 21711294Sswallace 21811294Sswallace f++ #function return type 21911294Sswallace 22011294Sswallace funcname=$f 22111294Sswallace if (funcalias == "") 22211294Sswallace funcalias = funcname 22311294Sswallace if (argalias == "") { 22411294Sswallace argalias = funcname "_args" 22511330Sswallace if ($2 == "COMPAT") 22611330Sswallace argalias = "o" argalias 22711294Sswallace } 22811294Sswallace f++ 22911294Sswallace 23011294Sswallace if ($f != "(") 23111294Sswallace parserr($f, ")") 23211294Sswallace f++ 23311294Sswallace 23411294Sswallace if (f == end) { 23511294Sswallace if ($f != "void") 23611294Sswallace parserr($f, "argument definition") 23711294Sswallace return 23811294Sswallace } 23911294Sswallace 24011294Sswallace while (f <= end) { 24111294Sswallace argc++ 24211294Sswallace argtype[argc]="" 24311294Sswallace oldf="" 24411294Sswallace while (f < end && $(f+1) != ",") { 24511294Sswallace if (argtype[argc] != "" && oldf != "*") 24611294Sswallace argtype[argc] = argtype[argc]" "; 24711294Sswallace argtype[argc] = argtype[argc]$f; 24811294Sswallace oldf = $f; 24911294Sswallace f++ 25011294Sswallace } 25111294Sswallace if (argtype[argc] == "") 25211294Sswallace parserr($f, "argument definition") 25311294Sswallace argname[argc]=$f; 25411294Sswallace f += 2; # skip name, and any comma 25511294Sswallace } 25660287Sbde if (argc != 0) 25760287Sbde argssize = "AS(" argalias ")" 2581541Srgrimes } 25911294Sswallace { comment = $4 26011294Sswallace if (NF < 7) 26111294Sswallace for (i = 5; i <= NF; i++) 26211294Sswallace comment = comment " " $i 26311294Sswallace } 26458963Salfred # if the "MPSAFE" keyword is found, note it and shift the line 26560287Sbde mpsafe = "" 26658963Salfred $2 == "MPSAFE" { 26758963Salfred for (i = 2; i <= NF; i++) 26858963Salfred $i = $(i + 1); 26958963Salfred NF -= 1; 27060287Sbde mpsafe = "SYF_MPSAFE | " 27158963Salfred } 27230740Sphk $2 == "STD" || $2 == "NODEF" || $2 == "NOARGS" || $2 == "NOPROTO" \ 27330740Sphk || $2 == "NOIMPL" { 27411294Sswallace parseline() 27511330Sswallace if ((!nosys || funcname != "nosys") && \ 27611330Sswallace (funcname != "lkmnosys")) { 27711294Sswallace if (argc != 0 && $2 != "NOARGS" && $2 != "NOPROTO") { 27811294Sswallace printf("struct\t%s {\n", argalias) > sysarg 27911294Sswallace for (i = 1; i <= argc; i++) 28036770Sbde printf("\t%s\t%s;\tchar %s_[PAD_(%s)];\n", 28136735Sdfr argtype[i], argname[i], 28236735Sdfr argname[i], argtype[i]) > sysarg 28311294Sswallace printf("};\n") > sysarg 28411294Sswallace } 28511330Sswallace else if($2 != "NOARGS" && $2 != "NOPROTO") 28636770Sbde printf("struct\t%s {\n\tregister_t dummy;\n};\n", 28736770Sbde argalias) > sysarg 28810905Sbde } 28911330Sswallace if ($2 != "NOPROTO" && (!nosys || funcname != "nosys") && \ 29011330Sswallace (!lkmnosys || funcname != "lkmnosys")) { 29136770Sbde printf("%s\t%s __P((struct proc *, struct %s *))", 29218277Sbde rettype, funcname, argalias) > sysdcl 29311330Sswallace if (funcname == "exit") 29418277Sbde printf(" __dead2") > sysdcl 29518277Sbde printf(";\n") > sysdcl 29611330Sswallace } 29711294Sswallace if (funcname == "nosys") 2982671Sats nosys = 1 29911294Sswallace if (funcname == "lkmnosys") 3004216Sats lkmnosys = 1 30160287Sbde printf("\t{ %s%s, (sy_call_t *)", mpsafe, argssize) > sysent 30260287Sbde column = 8 + 2 + length(mpsafe) + length(argssize) + 15 30330740Sphk if ($2 != "NOIMPL") { 30460287Sbde printf("%s },", funcname) > sysent 30560287Sbde column = column + length(funcname) + 3 30630740Sphk } else { 30760287Sbde printf("%s },", "nosys") > sysent 30860287Sbde column = column + length("nosys") + 3 30930740Sphk } 31060287Sbde align_sysent_comment(column) 31158963Salfred printf("/* %d = %s */\n", syscall, funcalias) > sysent 31236770Sbde printf("\t\"%s\",\t\t\t/* %d = %s */\n", 31311294Sswallace funcalias, syscall, funcalias) > sysnames 31434354Sjb if ($2 != "NODEF") { 31536770Sbde printf("#define\t%s%s\t%d\n", syscallprefix, 31611294Sswallace funcalias, syscall) > syshdr 31734354Sjb printf(" \\\n\t%s.o", funcalias) > sysmk 31834354Sjb } 31911294Sswallace if ($3 != "NOHIDE") 32011294Sswallace printf("HIDE_%s(%s)\n", $3, funcname) > syshide 3211541Srgrimes syscall++ 3221541Srgrimes next 3231541Srgrimes } 32411330Sswallace $2 == "COMPAT" || $2 == "CPT_NOA" { 32536782Sbde ncompat++ 32611294Sswallace parseline() 32711330Sswallace if (argc != 0 && $2 != "CPT_NOA") { 32811294Sswallace printf("struct\t%s {\n", argalias) > syscompat 32911294Sswallace for (i = 1; i <= argc; i++) 33036770Sbde printf("\t%s\t%s;\tchar %s_[PAD_(%s)];\n", 33136735Sdfr argtype[i], argname[i], 33236735Sdfr argname[i], argtype[i]) > syscompat 33311294Sswallace printf("};\n") > syscompat 33411294Sswallace } 33511330Sswallace else if($2 != "CPT_NOA") 33636770Sbde printf("struct\t%s {\n\tregister_t dummy;\n};\n", 33736770Sbde argalias) > sysarg 33836770Sbde printf("%s\to%s __P((struct proc *, struct %s *));\n", 33911294Sswallace rettype, funcname, argalias) > syscompatdcl 34060287Sbde printf("\t{ compat(%s%s,%s) },", 34160287Sbde mpsafe, argssize, funcname) > sysent 34260287Sbde align_sysent_comment(8 + 9 + length(mpsafe) + \ 34360287Sbde length(argssize) + 1 + length(funcname) + 4) 34460287Sbde printf("/* %d = old %s */\n", syscall, funcalias) > sysent 34536770Sbde printf("\t\"old.%s\",\t\t/* %d = old %s */\n", 34611294Sswallace funcalias, syscall, funcalias) > sysnames 34736770Sbde printf("\t\t\t\t/* %d is old %s */\n", 34811294Sswallace syscall, funcalias) > syshdr 34911294Sswallace if ($3 != "NOHIDE") 35011294Sswallace printf("HIDE_%s(%s)\n", $3, funcname) > syshide 3511541Srgrimes syscall++ 3521541Srgrimes next 3531541Srgrimes } 3541541Srgrimes $2 == "LIBCOMPAT" { 35536782Sbde ncompat++ 35611294Sswallace parseline() 35711294Sswallace printf("%s\to%s();\n", rettype, funcname) > syscompatdcl 35860287Sbde printf("\t{ compat(%s%s,%s) },", 35960287Sbde mpsafe, argssize, funcname) > sysent 36060287Sbde align_sysent_comment(8 + 9 + length(mpsafe) + \ 36160287Sbde length(argssize) + 1 + length(funcname) + 4) 36260287Sbde printf("/* %d = old %s */\n", syscall, funcalias) > sysent 36336770Sbde printf("\t\"old.%s\",\t\t/* %d = old %s */\n", 36411294Sswallace funcalias, syscall, funcalias) > sysnames 36536770Sbde printf("#define\t%s%s\t%d\t/* compatibility; still used by libc */\n", 36611294Sswallace syscallprefix, funcalias, syscall) > syshdr 36734354Sjb printf(" \\\n\t%s.o", funcalias) > sysmk 36811294Sswallace if ($3 != "NOHIDE") 36911294Sswallace printf("HIDE_%s(%s)\n", $3, funcname) > syshide 3701541Srgrimes syscall++ 3711541Srgrimes next 3721541Srgrimes } 3731541Srgrimes $2 == "OBSOL" { 37460287Sbde printf("\t{ 0, (sy_call_t *)nosys },") > sysent 37560287Sbde align_sysent_comment(34) 37660287Sbde printf("/* %d = obsolete %s */\n", syscall, comment) > sysent 37736770Sbde printf("\t\"obs_%s\",\t\t\t/* %d = obsolete %s */\n", 37811294Sswallace $4, syscall, comment) > sysnames 37936770Sbde printf("\t\t\t\t/* %d is obsolete %s */\n", 3801541Srgrimes syscall, comment) > syshdr 38111294Sswallace if ($3 != "NOHIDE") 38211294Sswallace printf("HIDE_%s(%s)\n", $3, $4) > syshide 3831541Srgrimes syscall++ 3841541Srgrimes next 3851541Srgrimes } 3861541Srgrimes $2 == "UNIMPL" { 38736770Sbde printf("\t{ 0, (sy_call_t *)nosys },\t\t\t/* %d = %s */\n", 3881541Srgrimes syscall, comment) > sysent 38936770Sbde printf("\t\"#%d\",\t\t\t/* %d = %s */\n", 3901541Srgrimes syscall, syscall, comment) > sysnames 39111294Sswallace if ($3 != "NOHIDE") 39211294Sswallace printf("HIDE_%s(%s)\n", $3, $4) > syshide 3931541Srgrimes syscall++ 3941541Srgrimes next 3951541Srgrimes } 3961541Srgrimes { 3971541Srgrimes printf "%s: line %d: unrecognized keyword %s\n", infile, NR, $2 3981541Srgrimes exit 1 3991541Srgrimes } 4001541Srgrimes END { 40160287Sbde printf "\n#define AS(name) (sizeof(struct name) / sizeof(register_t))\n" > sysinc 40236782Sbde if (ncompat != 0) { 40336782Sbde printf "#include \"opt_compat.h\"\n\n" > syssw 40436782Sbde printf "\n#ifdef %s\n", compat > sysinc 40536782Sbde printf "#define compat(n, name) n, (sy_call_t *)__CONCAT(o,name)\n" > sysinc 40636782Sbde printf "#else\n" > sysinc 40736782Sbde printf "#define compat(n, name) 0, (sy_call_t *)nosys\n" > sysinc 40836782Sbde printf "#endif\n" > sysinc 40936782Sbde } 41036782Sbde 41136735Sdfr printf("\n#endif /* %s */\n\n", compat) > syscompatdcl 41236735Sdfr printf("#undef PAD_\n") > syscompatdcl 41311294Sswallace printf("\n#endif /* !%s */\n", sysproto_h) > syscompatdcl 4141541Srgrimes 41537227Sphk printf("\n") > sysmk 41614331Speter printf("};\n") > sysent 4171541Srgrimes printf("};\n") > sysnames 41811294Sswallace printf("#define\t%sMAXSYSCALL\t%d\n", syscallprefix, syscall) \ 41936770Sbde > syshdr 4201541Srgrimes } ' 4211541Srgrimes 42236782Sbdecat $sysinc $sysent >> $syssw 42311294Sswallacecat $sysarg $sysdcl $syscompat $syscompatdcl > $sysproto 424