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