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