makesyscalls.sh revision 50478
11541Srgrimes#! /bin/sh - 21541Srgrimes# @(#)makesyscalls.sh 8.1 (Berkeley) 6/10/93 350477Speter# $FreeBSD: head/sys/kern/makesyscalls.sh 50478 1999-08-28 01:15:37Z peter $ 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 8010905Sbde 8111294Sswallace printf "/*\n * System call prototypes.\n *\n" > sysarg 8211294Sswallace printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysarg 831541Srgrimes 8431785Seivind printf "\n#ifdef %s\n\n", compat > syscompat 851541Srgrimes 861541Srgrimes printf "/*\n * System call names.\n *\n" > sysnames 871541Srgrimes printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysnames 881541Srgrimes 891541Srgrimes printf "/*\n * System call numbers.\n *\n" > syshdr 901541Srgrimes printf " * DO NOT EDIT-- this file is automatically generated.\n" > syshdr 9134354Sjb printf "# FreeBSD system call names.\n" > sysmk 9234354Sjb printf "# DO NOT EDIT-- this file is automatically generated.\n" > sysmk 932700Swollman printf "/*\n * System call hiders.\n *\n" > syshide 942700Swollman printf " * DO NOT EDIT-- this file is automatically generated.\n" > syshide 951541Srgrimes } 961541Srgrimes NR == 1 { 9750478Speter gsub("[$]FreeBSD: ", "", $0) 9810906Sbde gsub(" [$]", "", $0) 9911294Sswallace 10036782Sbde printf " * created from%s\n */\n\n", $0 > syssw 10111294Sswallace 10236782Sbde printf "\n/* The casts are bogus but will do for now. */\n" > sysent 10311294Sswallace printf "struct sysent %s[] = {\n",switchname > sysent 10410905Sbde 10511294Sswallace printf " * created from%s\n */\n\n", $0 > sysarg 10633039Sbde printf "#ifndef %s\n", sysproto_h > sysarg 10733039Sbde printf "#define\t%s\n\n", sysproto_h > sysarg 10833039Sbde printf "#include <sys/signal.h>\n\n" > sysarg 10933039Sbde printf "struct proc;\n\n" > sysarg 11036770Sbde printf "#define\tPAD_(t)\t(sizeof(register_t) <= sizeof(t) ? \\\n" > sysarg 11136770Sbde printf "\t\t0 : sizeof(register_t) - sizeof(t))\n\n" > sysarg 1121541Srgrimes 1131541Srgrimes printf " * created from%s\n */\n\n", $0 > sysnames 11411294Sswallace printf "char *%s[] = {\n", namesname > sysnames 1151541Srgrimes 1161541Srgrimes printf " * created from%s\n */\n\n", $0 > syshdr 1172700Swollman 11834354Sjb printf "# created from%s\nMIASM = ", $0 > sysmk 11934354Sjb 1202700Swollman printf " * created from%s\n */\n\n", $0 > syshide 1211541Srgrimes next 1221541Srgrimes } 1231541Srgrimes NF == 0 || $1 ~ /^;/ { 1241541Srgrimes next 1251541Srgrimes } 12611294Sswallace $1 ~ /^#[ ]*include/ { 12711294Sswallace print > sysinc 12811294Sswallace next 12911294Sswallace } 1301541Srgrimes $1 ~ /^#[ ]*if/ { 1311541Srgrimes print > sysent 1321541Srgrimes print > sysdcl 13311294Sswallace print > sysarg 1341541Srgrimes print > syscompat 1351541Srgrimes print > sysnames 1362700Swollman print > syshide 1371541Srgrimes savesyscall = syscall 1381541Srgrimes next 1391541Srgrimes } 1401541Srgrimes $1 ~ /^#[ ]*else/ { 1411541Srgrimes print > sysent 1421541Srgrimes print > sysdcl 14311294Sswallace print > sysarg 1441541Srgrimes print > syscompat 1451541Srgrimes print > sysnames 1462700Swollman print > syshide 1471541Srgrimes syscall = savesyscall 1481541Srgrimes next 1491541Srgrimes } 1501541Srgrimes $1 ~ /^#/ { 1511541Srgrimes print > sysent 1521541Srgrimes print > sysdcl 15311294Sswallace print > sysarg 1541541Srgrimes print > syscompat 1551541Srgrimes print > sysnames 1562700Swollman print > syshide 1571541Srgrimes next 1581541Srgrimes } 1591541Srgrimes syscall != $1 { 16036770Sbde printf "%s: line %d: syscall number out of sync at %d\n", 16136770Sbde infile, NR, syscall 1621541Srgrimes printf "line is:\n" 1631541Srgrimes print 1641541Srgrimes exit 1 1651541Srgrimes } 16611294Sswallace function parserr(was, wanted) { 16736770Sbde printf "%s: line %d: unexpected %s (expected %s)\n", 16811294Sswallace infile, NR, was, wanted 16911294Sswallace exit 1 17011294Sswallace } 17111294Sswallace function parseline() { 17211294Sswallace f=4 # toss number and type 17311294Sswallace argc= 0; 17411294Sswallace bigargc = 0; 17511294Sswallace if ($NF != "}") { 17611294Sswallace funcalias=$(NF-2) 17711294Sswallace argalias=$(NF-1) 17811294Sswallace rettype=$NF 17911294Sswallace end=NF-3 18011294Sswallace } else { 18111294Sswallace funcalias="" 18211294Sswallace argalias="" 18311294Sswallace rettype="int" 18411294Sswallace end=NF 18510905Sbde } 18611294Sswallace if ($2 == "NODEF") { 18711294Sswallace funcname=$4 18811294Sswallace return 18911294Sswallace } 19011294Sswallace if ($f != "{") 19111294Sswallace parserr($f, "{") 19211294Sswallace f++ 19311294Sswallace if ($end != "}") 19411294Sswallace parserr($end, "}") 19511294Sswallace end-- 19611294Sswallace if ($end != ";") 19711294Sswallace parserr($end, ";") 19811294Sswallace end-- 19911294Sswallace if ($end != ")") 20011294Sswallace parserr($end, ")") 20111294Sswallace end-- 20211294Sswallace 20311294Sswallace f++ #function return type 20411294Sswallace 20511294Sswallace funcname=$f 20611294Sswallace if (funcalias == "") 20711294Sswallace funcalias = funcname 20811294Sswallace if (argalias == "") { 20911294Sswallace argalias = funcname "_args" 21011330Sswallace if ($2 == "COMPAT") 21111330Sswallace argalias = "o" argalias 21211294Sswallace } 21311294Sswallace f++ 21411294Sswallace 21511294Sswallace if ($f != "(") 21611294Sswallace parserr($f, ")") 21711294Sswallace f++ 21811294Sswallace 21911294Sswallace if (f == end) { 22011294Sswallace if ($f != "void") 22111294Sswallace parserr($f, "argument definition") 22211294Sswallace return 22311294Sswallace } 22411294Sswallace 22511294Sswallace while (f <= end) { 22611294Sswallace argc++ 22711294Sswallace argtype[argc]="" 22811294Sswallace oldf="" 22911294Sswallace while (f < end && $(f+1) != ",") { 23011294Sswallace if (argtype[argc] != "" && oldf != "*") 23111294Sswallace argtype[argc] = argtype[argc]" "; 23211294Sswallace argtype[argc] = argtype[argc]$f; 23311294Sswallace oldf = $f; 23411294Sswallace f++ 23511294Sswallace } 23611294Sswallace if (argtype[argc] == "") 23711294Sswallace parserr($f, "argument definition") 23811294Sswallace if (argtype[argc] == "off_t") 23911294Sswallace bigargc++ 24011294Sswallace argname[argc]=$f; 24111294Sswallace f += 2; # skip name, and any comma 24211294Sswallace } 2431541Srgrimes } 24411294Sswallace { comment = $4 24511294Sswallace if (NF < 7) 24611294Sswallace for (i = 5; i <= NF; i++) 24711294Sswallace comment = comment " " $i 24811294Sswallace } 24930740Sphk $2 == "STD" || $2 == "NODEF" || $2 == "NOARGS" || $2 == "NOPROTO" \ 25030740Sphk || $2 == "NOIMPL" { 25111294Sswallace parseline() 25211330Sswallace if ((!nosys || funcname != "nosys") && \ 25311330Sswallace (funcname != "lkmnosys")) { 25411294Sswallace if (argc != 0 && $2 != "NOARGS" && $2 != "NOPROTO") { 25511294Sswallace printf("struct\t%s {\n", argalias) > sysarg 25611294Sswallace for (i = 1; i <= argc; i++) 25736770Sbde printf("\t%s\t%s;\tchar %s_[PAD_(%s)];\n", 25836735Sdfr argtype[i], argname[i], 25936735Sdfr argname[i], argtype[i]) > sysarg 26011294Sswallace printf("};\n") > sysarg 26111294Sswallace } 26211330Sswallace else if($2 != "NOARGS" && $2 != "NOPROTO") 26336770Sbde printf("struct\t%s {\n\tregister_t dummy;\n};\n", 26436770Sbde argalias) > sysarg 26510905Sbde } 26611330Sswallace if ($2 != "NOPROTO" && (!nosys || funcname != "nosys") && \ 26711330Sswallace (!lkmnosys || funcname != "lkmnosys")) { 26836770Sbde printf("%s\t%s __P((struct proc *, struct %s *))", 26918277Sbde rettype, funcname, argalias) > sysdcl 27011330Sswallace if (funcname == "exit") 27118277Sbde printf(" __dead2") > sysdcl 27218277Sbde printf(";\n") > sysdcl 27311330Sswallace } 27411294Sswallace if (funcname == "nosys") 2752671Sats nosys = 1 27611294Sswallace if (funcname == "lkmnosys") 2774216Sats lkmnosys = 1 27830740Sphk if ($2 != "NOIMPL") { 27936770Sbde printf("\t{ %d, (sy_call_t *)%s },\t\t", 28030740Sphk argc+bigargc, funcname) > sysent 28130740Sphk if(length(funcname) < 11) 28230740Sphk printf("\t") > sysent 28330740Sphk printf("/* %d = %s */\n", syscall, funcalias) > sysent 28430740Sphk } else { 28536770Sbde printf("\t{ %d, (sy_call_t *)%s },\t\t", 28630740Sphk argc+bigargc, "nosys") > sysent 28730740Sphk if(length("nosys") < 11) 28830740Sphk printf("\t") > sysent 28930740Sphk printf("/* %d = %s */\n", syscall, funcalias) > sysent 29030740Sphk } 29136770Sbde printf("\t\"%s\",\t\t\t/* %d = %s */\n", 29211294Sswallace funcalias, syscall, funcalias) > sysnames 29334354Sjb if ($2 != "NODEF") { 29436770Sbde printf("#define\t%s%s\t%d\n", syscallprefix, 29511294Sswallace funcalias, syscall) > syshdr 29634354Sjb printf(" \\\n\t%s.o", funcalias) > sysmk 29734354Sjb } 29811294Sswallace if ($3 != "NOHIDE") 29911294Sswallace printf("HIDE_%s(%s)\n", $3, funcname) > syshide 3001541Srgrimes syscall++ 3011541Srgrimes next 3021541Srgrimes } 30311330Sswallace $2 == "COMPAT" || $2 == "CPT_NOA" { 30436782Sbde ncompat++ 30511294Sswallace parseline() 30611330Sswallace if (argc != 0 && $2 != "CPT_NOA") { 30711294Sswallace printf("struct\t%s {\n", argalias) > syscompat 30811294Sswallace for (i = 1; i <= argc; i++) 30936770Sbde printf("\t%s\t%s;\tchar %s_[PAD_(%s)];\n", 31036735Sdfr argtype[i], argname[i], 31136735Sdfr argname[i], argtype[i]) > syscompat 31211294Sswallace printf("};\n") > syscompat 31311294Sswallace } 31411330Sswallace else if($2 != "CPT_NOA") 31536770Sbde printf("struct\t%s {\n\tregister_t dummy;\n};\n", 31636770Sbde argalias) > sysarg 31736770Sbde printf("%s\to%s __P((struct proc *, struct %s *));\n", 31811294Sswallace rettype, funcname, argalias) > syscompatdcl 31936770Sbde printf("\t{ compat(%d,%s) },\t\t/* %d = old %s */\n", 32011294Sswallace argc+bigargc, funcname, syscall, funcalias) > sysent 32136770Sbde printf("\t\"old.%s\",\t\t/* %d = old %s */\n", 32211294Sswallace funcalias, syscall, funcalias) > sysnames 32336770Sbde printf("\t\t\t\t/* %d is old %s */\n", 32411294Sswallace syscall, funcalias) > syshdr 32511294Sswallace if ($3 != "NOHIDE") 32611294Sswallace printf("HIDE_%s(%s)\n", $3, funcname) > syshide 3271541Srgrimes syscall++ 3281541Srgrimes next 3291541Srgrimes } 3301541Srgrimes $2 == "LIBCOMPAT" { 33136782Sbde ncompat++ 33211294Sswallace parseline() 33311294Sswallace printf("%s\to%s();\n", rettype, funcname) > syscompatdcl 33436770Sbde printf("\t{ compat(%d,%s) },\t\t/* %d = old %s */\n", 33511294Sswallace argc+bigargc, funcname, syscall, funcalias) > sysent 33636770Sbde printf("\t\"old.%s\",\t\t/* %d = old %s */\n", 33711294Sswallace funcalias, syscall, funcalias) > sysnames 33836770Sbde printf("#define\t%s%s\t%d\t/* compatibility; still used by libc */\n", 33911294Sswallace syscallprefix, funcalias, syscall) > syshdr 34034354Sjb printf(" \\\n\t%s.o", funcalias) > sysmk 34111294Sswallace if ($3 != "NOHIDE") 34211294Sswallace printf("HIDE_%s(%s)\n", $3, funcname) > syshide 3431541Srgrimes syscall++ 3441541Srgrimes next 3451541Srgrimes } 3461541Srgrimes $2 == "OBSOL" { 34736770Sbde printf("\t{ 0, (sy_call_t *)nosys },\t\t\t/* %d = obsolete %s */\n", 3481541Srgrimes syscall, comment) > sysent 34936770Sbde printf("\t\"obs_%s\",\t\t\t/* %d = obsolete %s */\n", 35011294Sswallace $4, syscall, comment) > sysnames 35136770Sbde printf("\t\t\t\t/* %d is obsolete %s */\n", 3521541Srgrimes syscall, comment) > syshdr 35311294Sswallace if ($3 != "NOHIDE") 35411294Sswallace printf("HIDE_%s(%s)\n", $3, $4) > syshide 3551541Srgrimes syscall++ 3561541Srgrimes next 3571541Srgrimes } 3581541Srgrimes $2 == "UNIMPL" { 35936770Sbde printf("\t{ 0, (sy_call_t *)nosys },\t\t\t/* %d = %s */\n", 3601541Srgrimes syscall, comment) > sysent 36136770Sbde printf("\t\"#%d\",\t\t\t/* %d = %s */\n", 3621541Srgrimes syscall, syscall, comment) > sysnames 36311294Sswallace if ($3 != "NOHIDE") 36411294Sswallace printf("HIDE_%s(%s)\n", $3, $4) > syshide 3651541Srgrimes syscall++ 3661541Srgrimes next 3671541Srgrimes } 3681541Srgrimes { 3691541Srgrimes printf "%s: line %d: unrecognized keyword %s\n", infile, NR, $2 3701541Srgrimes exit 1 3711541Srgrimes } 3721541Srgrimes END { 37336782Sbde if (ncompat != 0) { 37436782Sbde printf "#include \"opt_compat.h\"\n\n" > syssw 37536782Sbde printf "\n#ifdef %s\n", compat > sysinc 37636782Sbde printf "#define compat(n, name) n, (sy_call_t *)__CONCAT(o,name)\n" > sysinc 37736782Sbde printf "#else\n" > sysinc 37836782Sbde printf "#define compat(n, name) 0, (sy_call_t *)nosys\n" > sysinc 37936782Sbde printf "#endif\n" > sysinc 38036782Sbde } 38136782Sbde 38236735Sdfr printf("\n#endif /* %s */\n\n", compat) > syscompatdcl 38336735Sdfr printf("#undef PAD_\n") > syscompatdcl 38411294Sswallace printf("\n#endif /* !%s */\n", sysproto_h) > syscompatdcl 3851541Srgrimes 38637227Sphk printf("\n") > sysmk 38714331Speter printf("};\n") > sysent 3881541Srgrimes printf("};\n") > sysnames 38911294Sswallace printf("#define\t%sMAXSYSCALL\t%d\n", syscallprefix, syscall) \ 39036770Sbde > syshdr 3911541Srgrimes } ' 3921541Srgrimes 39336782Sbdecat $sysinc $sysent >> $syssw 39411294Sswallacecat $sysarg $sysdcl $syscompat $syscompatdcl > $sysproto 395