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