makesyscalls.sh revision 83366
11541Srgrimes#! /bin/sh - 21541Srgrimes# @(#)makesyscalls.sh 8.1 (Berkeley) 6/10/93 350477Speter# $FreeBSD: head/sys/kern/makesyscalls.sh 83366 2001-09-12 08:38:13Z julian $ 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 11783366Sjulian printf "struct thread;\n\n" > sysarg 11836770Sbde printf "#define\tPAD_(t)\t(sizeof(register_t) <= sizeof(t) ? \\\n" > sysarg 11936770Sbde printf "\t\t0 : sizeof(register_t) - sizeof(t))\n\n" > sysarg 12082149Stmm printf "#if BYTE_ORDER == LITTLE_ENDIAN\n"> sysarg 12182149Stmm printf "#define\tPADL_(t)\t0\n" > sysarg 12282149Stmm printf "#define\tPADR_(t)\tPAD_(t)\n" > sysarg 12382149Stmm printf "#else\n" > sysarg 12482149Stmm printf "#define\tPADL_(t)\tPAD_(t)\n" > sysarg 12582149Stmm printf "#define\tPADR_(t)\t0\n" > sysarg 12682149Stmm printf "#endif\n\n" > sysarg 1271541Srgrimes 1281541Srgrimes printf " * created from%s\n */\n\n", $0 > sysnames 12911294Sswallace printf "char *%s[] = {\n", namesname > sysnames 1301541Srgrimes 1311541Srgrimes printf " * created from%s\n */\n\n", $0 > syshdr 1322700Swollman 13334354Sjb printf "# created from%s\nMIASM = ", $0 > sysmk 13434354Sjb 1352700Swollman printf " * created from%s\n */\n\n", $0 > syshide 1361541Srgrimes next 1371541Srgrimes } 1381541Srgrimes NF == 0 || $1 ~ /^;/ { 1391541Srgrimes next 1401541Srgrimes } 14111294Sswallace $1 ~ /^#[ ]*include/ { 14211294Sswallace print > sysinc 14311294Sswallace next 14411294Sswallace } 1451541Srgrimes $1 ~ /^#[ ]*if/ { 1461541Srgrimes print > sysent 1471541Srgrimes print > sysdcl 14811294Sswallace print > sysarg 1491541Srgrimes print > syscompat 1501541Srgrimes print > sysnames 1512700Swollman print > syshide 1521541Srgrimes savesyscall = syscall 1531541Srgrimes next 1541541Srgrimes } 1551541Srgrimes $1 ~ /^#[ ]*else/ { 1561541Srgrimes print > sysent 1571541Srgrimes print > sysdcl 15811294Sswallace print > sysarg 1591541Srgrimes print > syscompat 1601541Srgrimes print > sysnames 1612700Swollman print > syshide 1621541Srgrimes syscall = savesyscall 1631541Srgrimes next 1641541Srgrimes } 1651541Srgrimes $1 ~ /^#/ { 1661541Srgrimes print > sysent 1671541Srgrimes print > sysdcl 16811294Sswallace print > sysarg 1691541Srgrimes print > syscompat 1701541Srgrimes print > sysnames 1712700Swollman print > syshide 1721541Srgrimes next 1731541Srgrimes } 1741541Srgrimes syscall != $1 { 17536770Sbde printf "%s: line %d: syscall number out of sync at %d\n", 17636770Sbde infile, NR, syscall 1771541Srgrimes printf "line is:\n" 1781541Srgrimes print 1791541Srgrimes exit 1 1801541Srgrimes } 18160287Sbde function align_sysent_comment(column) { 18260287Sbde printf("\t") > sysent 18360287Sbde column = column + 8 - column % 8 18460287Sbde while (column < 56) { 18560287Sbde printf("\t") > sysent 18660287Sbde column = column + 8 18760287Sbde } 18860287Sbde } 18911294Sswallace function parserr(was, wanted) { 19036770Sbde printf "%s: line %d: unexpected %s (expected %s)\n", 19111294Sswallace infile, NR, was, wanted 19211294Sswallace exit 1 19311294Sswallace } 19411294Sswallace function parseline() { 19511294Sswallace f=4 # toss number and type 19611294Sswallace argc= 0; 19760287Sbde argssize = "0" 19811294Sswallace if ($NF != "}") { 19911294Sswallace funcalias=$(NF-2) 20011294Sswallace argalias=$(NF-1) 20111294Sswallace rettype=$NF 20211294Sswallace end=NF-3 20311294Sswallace } else { 20411294Sswallace funcalias="" 20511294Sswallace argalias="" 20611294Sswallace rettype="int" 20711294Sswallace end=NF 20810905Sbde } 20911294Sswallace if ($2 == "NODEF") { 21011294Sswallace funcname=$4 21111294Sswallace return 21211294Sswallace } 21311294Sswallace if ($f != "{") 21411294Sswallace parserr($f, "{") 21511294Sswallace f++ 21611294Sswallace if ($end != "}") 21711294Sswallace parserr($end, "}") 21811294Sswallace end-- 21911294Sswallace if ($end != ";") 22011294Sswallace parserr($end, ";") 22111294Sswallace end-- 22211294Sswallace if ($end != ")") 22311294Sswallace parserr($end, ")") 22411294Sswallace end-- 22511294Sswallace 22611294Sswallace f++ #function return type 22711294Sswallace 22811294Sswallace funcname=$f 22911294Sswallace if (funcalias == "") 23011294Sswallace funcalias = funcname 23111294Sswallace if (argalias == "") { 23211294Sswallace argalias = funcname "_args" 23311330Sswallace if ($2 == "COMPAT") 23411330Sswallace argalias = "o" argalias 23511294Sswallace } 23611294Sswallace f++ 23711294Sswallace 23811294Sswallace if ($f != "(") 23911294Sswallace parserr($f, ")") 24011294Sswallace f++ 24111294Sswallace 24211294Sswallace if (f == end) { 24311294Sswallace if ($f != "void") 24411294Sswallace parserr($f, "argument definition") 24511294Sswallace return 24611294Sswallace } 24711294Sswallace 24811294Sswallace while (f <= end) { 24911294Sswallace argc++ 25011294Sswallace argtype[argc]="" 25111294Sswallace oldf="" 25211294Sswallace while (f < end && $(f+1) != ",") { 25311294Sswallace if (argtype[argc] != "" && oldf != "*") 25411294Sswallace argtype[argc] = argtype[argc]" "; 25511294Sswallace argtype[argc] = argtype[argc]$f; 25611294Sswallace oldf = $f; 25711294Sswallace f++ 25811294Sswallace } 25911294Sswallace if (argtype[argc] == "") 26011294Sswallace parserr($f, "argument definition") 26111294Sswallace argname[argc]=$f; 26211294Sswallace f += 2; # skip name, and any comma 26311294Sswallace } 26460287Sbde if (argc != 0) 26560287Sbde argssize = "AS(" argalias ")" 2661541Srgrimes } 26711294Sswallace { comment = $4 26811294Sswallace if (NF < 7) 26911294Sswallace for (i = 5; i <= NF; i++) 27011294Sswallace comment = comment " " $i 27111294Sswallace } 27282585Sdillon 27382585Sdillon # The 'M' type prefix 27482585Sdillon # 27582585Sdillon { 27682585Sdillon mpsafe = "SYF_MPSAFE | "; 27782585Sdillon if ($2 == "MSTD") { 27882585Sdillon $2 = "STD"; 27982585Sdillon } else if ($2 == "MNODEF") { 28082585Sdillon $2 = "NODEF"; 28182585Sdillon } else if ($2 == "MNOARGS") { 28282585Sdillon $2 = "NOARGS"; 28382585Sdillon } else if ($2 == "MNOPROTO") { 28482585Sdillon $2 = "NOPROTO"; 28582585Sdillon } else if ($2 == "MNOIMPL") { 28682585Sdillon $2 = "NOIMPL"; 28782585Sdillon } else if ($2 == "MNOSTD") { 28882585Sdillon $2 = "NOSTD"; 28982585Sdillon } else if ($2 == "MCOMPAT") { 29082585Sdillon $2 = "COMPAT"; 29182585Sdillon } else if ($2 == "MCPT_NOA") { 29282585Sdillon $2 = "CPT_NOA"; 29382585Sdillon } else if ($2 == "MLIBCOMPAT") { 29482585Sdillon $2 = "LIBCOMPAT"; 29582585Sdillon } else if ($2 == "MOBSOL") { 29682585Sdillon $2 = "OBSOL"; 29782585Sdillon } else if ($2 == "MUNIMPL") { 29882585Sdillon $2 = "UNIMPL"; 29982585Sdillon } else { 30082585Sdillon mpsafe = ""; 30182585Sdillon } 30258963Salfred } 30330740Sphk $2 == "STD" || $2 == "NODEF" || $2 == "NOARGS" || $2 == "NOPROTO" \ 30469445Salfred || $2 == "NOIMPL" || $2 == "NOSTD" { 30511294Sswallace parseline() 30611330Sswallace if ((!nosys || funcname != "nosys") && \ 30769448Salfred (funcname != "lkmnosys") && (funcname != "lkmressys")) { 30811294Sswallace if (argc != 0 && $2 != "NOARGS" && $2 != "NOPROTO") { 30983046Sobrien printf("struct %s {\n", argalias) > sysarg 31011294Sswallace for (i = 1; i <= argc; i++) 31182149Stmm printf("\tchar %s_l_[PADL_(%s)]; " \ 31282149Stmm "%s %s; char %s_r_[PADR_(%s)];\n", 31382149Stmm argname[i], argtype[i], 31436735Sdfr argtype[i], argname[i], 31536735Sdfr argname[i], argtype[i]) > sysarg 31611294Sswallace printf("};\n") > sysarg 31711294Sswallace } 31811330Sswallace else if($2 != "NOARGS" && $2 != "NOPROTO") 31983046Sobrien printf("struct %s {\n\tregister_t dummy;\n};\n", 32036770Sbde argalias) > sysarg 32110905Sbde } 32211330Sswallace if ($2 != "NOPROTO" && (!nosys || funcname != "nosys") && \ 32311330Sswallace (!lkmnosys || funcname != "lkmnosys")) { 32483366Sjulian printf("%s\t%s __P((struct thread *, struct %s *))", 32518277Sbde rettype, funcname, argalias) > sysdcl 32618277Sbde printf(";\n") > sysdcl 32711330Sswallace } 32811294Sswallace if (funcname == "nosys") 3292671Sats nosys = 1 33011294Sswallace if (funcname == "lkmnosys") 3314216Sats lkmnosys = 1 33260287Sbde printf("\t{ %s%s, (sy_call_t *)", mpsafe, argssize) > sysent 33360287Sbde column = 8 + 2 + length(mpsafe) + length(argssize) + 15 33469445Salfred if ($2 == "NOIMPL") { 33569445Salfred printf("%s },", "nosys") > sysent 33669445Salfred column = column + length("nosys") + 3 33769445Salfred } else if ($2 == "NOSTD") { 33869448Salfred printf("%s },", "lkmressys") > sysent 33969445Salfred column = column + length("lkmnosys") + 3 34069445Salfred } else { 34160287Sbde printf("%s },", funcname) > sysent 34260287Sbde column = column + length(funcname) + 3 34369445Salfred } 34460287Sbde align_sysent_comment(column) 34558963Salfred printf("/* %d = %s */\n", syscall, funcalias) > sysent 34636770Sbde printf("\t\"%s\",\t\t\t/* %d = %s */\n", 34711294Sswallace funcalias, syscall, funcalias) > sysnames 34834354Sjb if ($2 != "NODEF") { 34936770Sbde printf("#define\t%s%s\t%d\n", syscallprefix, 35011294Sswallace funcalias, syscall) > syshdr 35134354Sjb printf(" \\\n\t%s.o", funcalias) > sysmk 35234354Sjb } 35311294Sswallace if ($3 != "NOHIDE") 35411294Sswallace printf("HIDE_%s(%s)\n", $3, funcname) > syshide 3551541Srgrimes syscall++ 3561541Srgrimes next 3571541Srgrimes } 35811330Sswallace $2 == "COMPAT" || $2 == "CPT_NOA" { 35936782Sbde ncompat++ 36011294Sswallace parseline() 36111330Sswallace if (argc != 0 && $2 != "CPT_NOA") { 36283046Sobrien printf("struct %s {\n", argalias) > syscompat 36311294Sswallace for (i = 1; i <= argc; i++) 36482149Stmm printf("\tchar %s_l_[PADL_(%s)]; %s %s; " \ 36582149Stmm "char %s_r_[PADR_(%s)];\n", 36682149Stmm argname[i], argtype[i], 36736735Sdfr argtype[i], argname[i], 36836735Sdfr argname[i], argtype[i]) > syscompat 36911294Sswallace printf("};\n") > syscompat 37011294Sswallace } 37111330Sswallace else if($2 != "CPT_NOA") 37283046Sobrien printf("struct %s {\n\tregister_t dummy;\n};\n", 37336770Sbde argalias) > sysarg 37483366Sjulian printf("%s\to%s __P((struct thread *, struct %s *));\n", 37511294Sswallace rettype, funcname, argalias) > syscompatdcl 37660287Sbde printf("\t{ compat(%s%s,%s) },", 37760287Sbde mpsafe, argssize, funcname) > sysent 37860287Sbde align_sysent_comment(8 + 9 + length(mpsafe) + \ 37960287Sbde length(argssize) + 1 + length(funcname) + 4) 38060287Sbde printf("/* %d = old %s */\n", syscall, funcalias) > sysent 38136770Sbde printf("\t\"old.%s\",\t\t/* %d = old %s */\n", 38211294Sswallace funcalias, syscall, funcalias) > sysnames 38336770Sbde printf("\t\t\t\t/* %d is old %s */\n", 38411294Sswallace syscall, funcalias) > syshdr 38511294Sswallace if ($3 != "NOHIDE") 38611294Sswallace printf("HIDE_%s(%s)\n", $3, funcname) > syshide 3871541Srgrimes syscall++ 3881541Srgrimes next 3891541Srgrimes } 3901541Srgrimes $2 == "LIBCOMPAT" { 39136782Sbde ncompat++ 39211294Sswallace parseline() 39311294Sswallace printf("%s\to%s();\n", rettype, funcname) > syscompatdcl 39460287Sbde printf("\t{ compat(%s%s,%s) },", 39560287Sbde mpsafe, argssize, funcname) > sysent 39660287Sbde align_sysent_comment(8 + 9 + length(mpsafe) + \ 39760287Sbde length(argssize) + 1 + length(funcname) + 4) 39860287Sbde printf("/* %d = old %s */\n", syscall, funcalias) > sysent 39936770Sbde printf("\t\"old.%s\",\t\t/* %d = old %s */\n", 40011294Sswallace funcalias, syscall, funcalias) > sysnames 40136770Sbde printf("#define\t%s%s\t%d\t/* compatibility; still used by libc */\n", 40211294Sswallace syscallprefix, funcalias, syscall) > syshdr 40334354Sjb printf(" \\\n\t%s.o", funcalias) > sysmk 40411294Sswallace if ($3 != "NOHIDE") 40511294Sswallace printf("HIDE_%s(%s)\n", $3, funcname) > syshide 4061541Srgrimes syscall++ 4071541Srgrimes next 4081541Srgrimes } 4091541Srgrimes $2 == "OBSOL" { 41060287Sbde printf("\t{ 0, (sy_call_t *)nosys },") > sysent 41160287Sbde align_sysent_comment(34) 41260287Sbde printf("/* %d = obsolete %s */\n", syscall, comment) > sysent 41336770Sbde printf("\t\"obs_%s\",\t\t\t/* %d = obsolete %s */\n", 41411294Sswallace $4, syscall, comment) > sysnames 41536770Sbde printf("\t\t\t\t/* %d is obsolete %s */\n", 4161541Srgrimes syscall, comment) > syshdr 41711294Sswallace if ($3 != "NOHIDE") 41811294Sswallace printf("HIDE_%s(%s)\n", $3, $4) > syshide 4191541Srgrimes syscall++ 4201541Srgrimes next 4211541Srgrimes } 4221541Srgrimes $2 == "UNIMPL" { 42336770Sbde printf("\t{ 0, (sy_call_t *)nosys },\t\t\t/* %d = %s */\n", 4241541Srgrimes syscall, comment) > sysent 42536770Sbde printf("\t\"#%d\",\t\t\t/* %d = %s */\n", 4261541Srgrimes syscall, syscall, comment) > sysnames 42711294Sswallace if ($3 != "NOHIDE") 42811294Sswallace printf("HIDE_%s(%s)\n", $3, $4) > syshide 4291541Srgrimes syscall++ 4301541Srgrimes next 4311541Srgrimes } 4321541Srgrimes { 4331541Srgrimes printf "%s: line %d: unrecognized keyword %s\n", infile, NR, $2 4341541Srgrimes exit 1 4351541Srgrimes } 4361541Srgrimes END { 43760287Sbde printf "\n#define AS(name) (sizeof(struct name) / sizeof(register_t))\n" > sysinc 43836782Sbde if (ncompat != 0) { 43936782Sbde printf "#include \"opt_compat.h\"\n\n" > syssw 44036782Sbde printf "\n#ifdef %s\n", compat > sysinc 44136782Sbde printf "#define compat(n, name) n, (sy_call_t *)__CONCAT(o,name)\n" > sysinc 44236782Sbde printf "#else\n" > sysinc 44336782Sbde printf "#define compat(n, name) 0, (sy_call_t *)nosys\n" > sysinc 44436782Sbde printf "#endif\n" > sysinc 44536782Sbde } 44636782Sbde 44736735Sdfr printf("\n#endif /* %s */\n\n", compat) > syscompatdcl 44836735Sdfr printf("#undef PAD_\n") > syscompatdcl 44982149Stmm printf("#undef PADL_\n") > syscompatdcl 45082149Stmm printf("#undef PADR_\n") > syscompatdcl 45111294Sswallace printf("\n#endif /* !%s */\n", sysproto_h) > syscompatdcl 4521541Srgrimes 45337227Sphk printf("\n") > sysmk 45414331Speter printf("};\n") > sysent 4551541Srgrimes printf("};\n") > sysnames 45611294Sswallace printf("#define\t%sMAXSYSCALL\t%d\n", syscallprefix, syscall) \ 45736770Sbde > syshdr 4581541Srgrimes } ' 4591541Srgrimes 46036782Sbdecat $sysinc $sysent >> $syssw 46111294Sswallacecat $sysarg $sysdcl $syscompat $syscompatdcl > $sysproto 462