makesyscalls.sh revision 89984
11541Srgrimes#! /bin/sh -
21541Srgrimes#	@(#)makesyscalls.sh	8.1 (Berkeley) 6/10/93
350477Speter# $FreeBSD: head/sys/kern/makesyscalls.sh 89984 2002-01-30 15:12:12Z 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"
1711294Sswallacesyscallprefix="SYS_"
1811294Sswallaceswitchname="sysent"
1911294Sswallacenamesname="syscallnames"
201541Srgrimes
211541Srgrimes# tmp files:
2231627Sjmgsysdcl="sysent.dcl.$$"
2331627Sjmgsyscompat="sysent.compat.$$"
2431627Sjmgsyscompatdcl="sysent.compatdcl.$$"
2531627Sjmgsysent="sysent.switch.$$"
2631627Sjmgsysinc="sysinc.switch.$$"
2731627Sjmgsysarg="sysarg.switch.$$"
281541Srgrimes
2911294Sswallacetrap "rm $sysdcl $syscompat $syscompatdcl $sysent $sysinc $sysarg" 0
301541Srgrimes
3124373Spetertouch $sysdcl $syscompat $syscompatdcl $sysent $sysinc $sysarg
3224373Speter
331541Srgrimescase $# in
3411294Sswallace    0)	echo "Usage: $0 input-file <config-file>" 1>&2
351541Srgrimes	exit 1
361541Srgrimes	;;
371541Srgrimesesac
381541Srgrimes
3936735Sdfrif [ -n "$2" -a -f "$2" ]; then
4011294Sswallace	. $2
4111294Sswallacefi
4211294Sswallace
4311294Sswallacesed -e '
4411294Sswallaces/\$//g
4511294Sswallace:join
4611294Sswallace	/\\$/{a\
4711294Sswallace
4811294Sswallace	N
4911294Sswallace	s/\\\n//
5011294Sswallace	b join
5111294Sswallace	}
5211294Sswallace2,${
5311294Sswallace	/^#/!s/\([{}()*,]\)/ \1 /g
5411294Sswallace}
5511294Sswallace' < $1 | awk "
561541Srgrimes	BEGIN {
571541Srgrimes		sysdcl = \"$sysdcl\"
5810905Sbde		sysproto = \"$sysproto\"
5910905Sbde		sysproto_h = \"$sysproto_h\"
601541Srgrimes		syscompat = \"$syscompat\"
6111294Sswallace		syscompatdcl = \"$syscompatdcl\"
621541Srgrimes		sysent = \"$sysent\"
6336782Sbde		syssw = \"$syssw\"
6411294Sswallace		sysinc = \"$sysinc\"
6511294Sswallace		sysarg = \"$sysarg\"
661541Srgrimes		sysnames = \"$sysnames\"
671541Srgrimes		syshdr = \"$syshdr\"
6834354Sjb		sysmk = \"$sysmk\"
691541Srgrimes		compat = \"$compat\"
7011294Sswallace		syscallprefix = \"$syscallprefix\"
7111294Sswallace		switchname = \"$switchname\"
7211294Sswallace		namesname = \"$namesname\"
731541Srgrimes		infile = \"$1\"
741541Srgrimes		"'
751541Srgrimes
7636782Sbde		printf "/*\n * System call switch table.\n *\n" > syssw
7736782Sbde		printf " * DO NOT EDIT-- this file is automatically generated.\n" > syssw
7889977Sbde		printf " * $%s$\n", "FreeBSD" > syssw
7910905Sbde
8011294Sswallace		printf "/*\n * System call prototypes.\n *\n" > sysarg
8111294Sswallace		printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysarg
8289977Sbde		printf " * $%s$\n", "FreeBSD" > 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
8889977Sbde		printf " * $%s$\n", "FreeBSD" > sysnames
891541Srgrimes
901541Srgrimes		printf "/*\n * System call numbers.\n *\n" > syshdr
911541Srgrimes		printf " * DO NOT EDIT-- this file is automatically generated.\n" > syshdr
9289977Sbde		printf " * $%s$\n", "FreeBSD" > syshdr
9334354Sjb		printf "# FreeBSD system call names.\n" > sysmk
9434354Sjb		printf "# DO NOT EDIT-- this file is automatically generated.\n" > sysmk
9589984Sbde		printf "# $%s$\n", "FreeBSD" > sysmk
961541Srgrimes	}
971541Srgrimes	NR == 1 {
9850478Speter		gsub("[$]FreeBSD: ", "", $0)
9910906Sbde		gsub(" [$]", "", $0)
10011294Sswallace
10136782Sbde		printf " * created from%s\n */\n\n", $0 > syssw
10211294Sswallace
10336782Sbde		printf "\n/* The casts are bogus but will do for now. */\n" > sysent
10411294Sswallace		printf "struct sysent %s[] = {\n",switchname > sysent
10510905Sbde
10611294Sswallace		printf " * created from%s\n */\n\n", $0 > sysarg
10733039Sbde		printf "#ifndef %s\n", sysproto_h > sysarg
10833039Sbde		printf "#define\t%s\n\n", sysproto_h > sysarg
10933039Sbde		printf "#include <sys/signal.h>\n\n" > sysarg
11054803Srwatson		printf "#include <sys/acl.h>\n\n" > sysarg
11133039Sbde		printf "struct proc;\n\n" > sysarg
11283366Sjulian		printf "struct thread;\n\n" > sysarg
11336770Sbde		printf "#define\tPAD_(t)\t(sizeof(register_t) <= sizeof(t) ? \\\n" > sysarg
11436770Sbde		printf "\t\t0 : sizeof(register_t) - sizeof(t))\n\n" > sysarg
11582149Stmm		printf "#if BYTE_ORDER == LITTLE_ENDIAN\n"> sysarg
11682149Stmm		printf "#define\tPADL_(t)\t0\n" > sysarg
11782149Stmm		printf "#define\tPADR_(t)\tPAD_(t)\n" > sysarg
11882149Stmm		printf "#else\n" > sysarg
11982149Stmm		printf "#define\tPADL_(t)\tPAD_(t)\n" > sysarg
12082149Stmm		printf "#define\tPADR_(t)\t0\n" > sysarg
12182149Stmm		printf "#endif\n\n" > sysarg
1221541Srgrimes
1231541Srgrimes		printf " * created from%s\n */\n\n", $0 > sysnames
12411294Sswallace		printf "char *%s[] = {\n", namesname > sysnames
1251541Srgrimes
1261541Srgrimes		printf " * created from%s\n */\n\n", $0 > syshdr
1272700Swollman
12834354Sjb		printf "# created from%s\nMIASM = ", $0 > sysmk
12934354Sjb
1301541Srgrimes		next
1311541Srgrimes	}
1321541Srgrimes	NF == 0 || $1 ~ /^;/ {
1331541Srgrimes		next
1341541Srgrimes	}
13511294Sswallace	$1 ~ /^#[ 	]*include/ {
13611294Sswallace		print > sysinc
13711294Sswallace		next
13811294Sswallace	}
1391541Srgrimes	$1 ~ /^#[ 	]*if/ {
1401541Srgrimes		print > sysent
1411541Srgrimes		print > sysdcl
14211294Sswallace		print > sysarg
1431541Srgrimes		print > syscompat
1441541Srgrimes		print > sysnames
1451541Srgrimes		savesyscall = syscall
1461541Srgrimes		next
1471541Srgrimes	}
1481541Srgrimes	$1 ~ /^#[ 	]*else/ {
1491541Srgrimes		print > sysent
1501541Srgrimes		print > sysdcl
15111294Sswallace		print > sysarg
1521541Srgrimes		print > syscompat
1531541Srgrimes		print > sysnames
1541541Srgrimes		syscall = savesyscall
1551541Srgrimes		next
1561541Srgrimes	}
1571541Srgrimes	$1 ~ /^#/ {
1581541Srgrimes		print > sysent
1591541Srgrimes		print > sysdcl
16011294Sswallace		print > sysarg
1611541Srgrimes		print > syscompat
1621541Srgrimes		print > sysnames
1631541Srgrimes		next
1641541Srgrimes	}
1651541Srgrimes	syscall != $1 {
16636770Sbde		printf "%s: line %d: syscall number out of sync at %d\n",
16736770Sbde		    infile, NR, syscall
1681541Srgrimes		printf "line is:\n"
1691541Srgrimes		print
1701541Srgrimes		exit 1
1711541Srgrimes	}
17260287Sbde	function align_sysent_comment(column) {
17360287Sbde		printf("\t") > sysent
17460287Sbde		column = column + 8 - column % 8
17560287Sbde		while (column < 56) {
17660287Sbde			printf("\t") > sysent
17760287Sbde			column = column + 8
17860287Sbde		}
17960287Sbde	}
18011294Sswallace	function parserr(was, wanted) {
18136770Sbde		printf "%s: line %d: unexpected %s (expected %s)\n",
18211294Sswallace		    infile, NR, was, wanted
18311294Sswallace		exit 1
18411294Sswallace	}
18511294Sswallace	function parseline() {
18611294Sswallace		f=4			# toss number and type
18711294Sswallace		argc= 0;
18860287Sbde		argssize = "0"
18911294Sswallace		if ($NF != "}") {
19011294Sswallace			funcalias=$(NF-2)
19111294Sswallace			argalias=$(NF-1)
19211294Sswallace			rettype=$NF
19311294Sswallace			end=NF-3
19411294Sswallace		} else {
19511294Sswallace			funcalias=""
19611294Sswallace			argalias=""
19711294Sswallace			rettype="int"
19811294Sswallace			end=NF
19910905Sbde		}
20011294Sswallace		if ($2 == "NODEF") {
20111294Sswallace			funcname=$4
20284600Smarcel			argssize = "AS(" $6 ")"
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	}
26482585Sdillon
26582585Sdillon	# The 'M' type prefix
26682585Sdillon	#
26782585Sdillon	{
26882585Sdillon		mpsafe = "SYF_MPSAFE | ";
26982585Sdillon		if ($2 == "MSTD") {
27082585Sdillon			$2 = "STD";
27182585Sdillon		} else if ($2 == "MNODEF") {
27282585Sdillon			$2 = "NODEF";
27382585Sdillon		} else if ($2 == "MNOARGS") {
27482585Sdillon			$2 = "NOARGS";
27582585Sdillon		} else if ($2 == "MNOPROTO") {
27682585Sdillon			$2 = "NOPROTO";
27782585Sdillon		} else if ($2 == "MNOIMPL") {
27882585Sdillon			$2 = "NOIMPL";
27982585Sdillon		} else if ($2 == "MNOSTD") {
28082585Sdillon			$2 = "NOSTD";
28182585Sdillon		} else if ($2 == "MCOMPAT") {
28282585Sdillon			$2 = "COMPAT";
28382585Sdillon		} else if ($2 == "MCPT_NOA") {
28482585Sdillon			$2 = "CPT_NOA";
28582585Sdillon		} else if ($2 == "MLIBCOMPAT") {
28682585Sdillon			$2 = "LIBCOMPAT";
28782585Sdillon		} else if ($2 == "MOBSOL") {
28882585Sdillon			$2 = "OBSOL";
28982585Sdillon		} else if ($2 == "MUNIMPL") {
29082585Sdillon			$2 = "UNIMPL";
29182585Sdillon		} else {
29282585Sdillon			mpsafe = "";
29382585Sdillon		}
29458963Salfred	}
29530740Sphk	$2 == "STD" || $2 == "NODEF" || $2 == "NOARGS"  || $2 == "NOPROTO" \
29669445Salfred	    || $2 == "NOIMPL" || $2 == "NOSTD" {
29711294Sswallace		parseline()
29811330Sswallace		if ((!nosys || funcname != "nosys") && \
29969448Salfred		    (funcname != "lkmnosys") && (funcname != "lkmressys")) {
30011294Sswallace			if (argc != 0 && $2 != "NOARGS" && $2 != "NOPROTO") {
30183046Sobrien				printf("struct %s {\n", argalias) > sysarg
30211294Sswallace				for (i = 1; i <= argc; i++)
30382149Stmm					printf("\tchar %s_l_[PADL_(%s)]; " \
30482149Stmm					    "%s %s; char %s_r_[PADR_(%s)];\n",
30582149Stmm					    argname[i], argtype[i],
30636735Sdfr					    argtype[i], argname[i],
30736735Sdfr					    argname[i], argtype[i]) > sysarg
30811294Sswallace				printf("};\n") > sysarg
30911294Sswallace			}
31084600Smarcel			else if ($2 != "NOARGS" && $2 != "NOPROTO" && \
31184600Smarcel			    $2 != "NODEF")
31283046Sobrien				printf("struct %s {\n\tregister_t dummy;\n};\n",
31336770Sbde				    argalias) > sysarg
31410905Sbde		}
31584600Smarcel		if (($2 != "NOPROTO" && $2 != "NODEF" && \
31684600Smarcel		    (funcname != "nosys" || !nosys)) || \
31784600Smarcel		    (funcname == "lkmnosys" && !lkmnosys) || \
31884600Smarcel		    funcname == "lkmressys") {
31983366Sjulian			printf("%s\t%s __P((struct thread *, struct %s *))",
32018277Sbde			    rettype, funcname, argalias) > sysdcl
32118277Sbde			printf(";\n") > sysdcl
32211330Sswallace		}
32311294Sswallace		if (funcname == "nosys")
3242671Sats			nosys = 1
32511294Sswallace		if (funcname == "lkmnosys")
3264216Sats			lkmnosys = 1
32760287Sbde		printf("\t{ %s%s, (sy_call_t *)", mpsafe, argssize) > sysent
32860287Sbde		column = 8 + 2 + length(mpsafe) + length(argssize) + 15
32969445Salfred		if ($2 == "NOIMPL") {
33069445Salfred			printf("%s },", "nosys") > sysent
33169445Salfred			column = column + length("nosys") + 3
33269445Salfred		} else if ($2 == "NOSTD") {
33369448Salfred			printf("%s },", "lkmressys") > sysent
33484600Smarcel			column = column + length("lkmressys") + 3
33569445Salfred		} else {
33660287Sbde			printf("%s },", funcname) > sysent
33760287Sbde			column = column + length(funcname) + 3
33869445Salfred		} 
33960287Sbde		align_sysent_comment(column)
34058963Salfred		printf("/* %d = %s */\n", syscall, funcalias) > sysent
34136770Sbde		printf("\t\"%s\",\t\t\t/* %d = %s */\n",
34211294Sswallace		    funcalias, syscall, funcalias) > sysnames
34334354Sjb		if ($2 != "NODEF") {
34436770Sbde			printf("#define\t%s%s\t%d\n", syscallprefix,
34511294Sswallace		    	    funcalias, syscall) > syshdr
34634354Sjb			printf(" \\\n\t%s.o", funcalias) > sysmk
34734354Sjb		}
3481541Srgrimes		syscall++
3491541Srgrimes		next
3501541Srgrimes	}
35111330Sswallace	$2 == "COMPAT" || $2 == "CPT_NOA" {
35236782Sbde		ncompat++
35311294Sswallace		parseline()
35411330Sswallace		if (argc != 0 && $2 != "CPT_NOA") {
35583046Sobrien			printf("struct %s {\n", argalias) > syscompat
35611294Sswallace			for (i = 1; i <= argc; i++)
35782149Stmm				printf("\tchar %s_l_[PADL_(%s)]; %s %s; " \
35882149Stmm				    "char %s_r_[PADR_(%s)];\n",
35982149Stmm				    argname[i], argtype[i],
36036735Sdfr				    argtype[i], argname[i],
36136735Sdfr				    argname[i], argtype[i]) > syscompat
36211294Sswallace			printf("};\n") > syscompat
36311294Sswallace		}
36411330Sswallace		else if($2 != "CPT_NOA")
36583046Sobrien			printf("struct %s {\n\tregister_t dummy;\n};\n",
36636770Sbde			    argalias) > sysarg
36783366Sjulian		printf("%s\to%s __P((struct thread *, struct %s *));\n",
36811294Sswallace		    rettype, funcname, argalias) > syscompatdcl
36960287Sbde		printf("\t{ compat(%s%s,%s) },",
37060287Sbde		    mpsafe, argssize, funcname) > sysent
37160287Sbde		align_sysent_comment(8 + 9 + length(mpsafe) + \
37260287Sbde		    length(argssize) + 1 + length(funcname) + 4)
37360287Sbde		printf("/* %d = old %s */\n", syscall, funcalias) > sysent
37436770Sbde		printf("\t\"old.%s\",\t\t/* %d = old %s */\n",
37511294Sswallace		    funcalias, syscall, funcalias) > sysnames
37636770Sbde		printf("\t\t\t\t/* %d is old %s */\n",
37711294Sswallace		    syscall, funcalias) > syshdr
3781541Srgrimes		syscall++
3791541Srgrimes		next
3801541Srgrimes	}
3811541Srgrimes	$2 == "LIBCOMPAT" {
38236782Sbde		ncompat++
38311294Sswallace		parseline()
38411294Sswallace		printf("%s\to%s();\n", rettype, funcname) > syscompatdcl
38560287Sbde		printf("\t{ compat(%s%s,%s) },",
38660287Sbde		    mpsafe, argssize, funcname) > sysent
38760287Sbde		align_sysent_comment(8 + 9 + length(mpsafe) + \
38860287Sbde		    length(argssize) + 1 + length(funcname) + 4)
38960287Sbde		printf("/* %d = old %s */\n", syscall, funcalias) > sysent
39036770Sbde		printf("\t\"old.%s\",\t\t/* %d = old %s */\n",
39111294Sswallace		    funcalias, syscall, funcalias) > sysnames
39236770Sbde		printf("#define\t%s%s\t%d\t/* compatibility; still used by libc */\n",
39311294Sswallace		    syscallprefix, funcalias, syscall) > syshdr
39434354Sjb		printf(" \\\n\t%s.o", funcalias) > sysmk
3951541Srgrimes		syscall++
3961541Srgrimes		next
3971541Srgrimes	}
3981541Srgrimes	$2 == "OBSOL" {
39960287Sbde		printf("\t{ 0, (sy_call_t *)nosys },") > sysent
40060287Sbde		align_sysent_comment(34)
40160287Sbde		printf("/* %d = obsolete %s */\n", syscall, comment) > sysent
40236770Sbde		printf("\t\"obs_%s\",\t\t\t/* %d = obsolete %s */\n",
40311294Sswallace		    $4, syscall, comment) > sysnames
40436770Sbde		printf("\t\t\t\t/* %d is obsolete %s */\n",
4051541Srgrimes		    syscall, comment) > syshdr
4061541Srgrimes		syscall++
4071541Srgrimes		next
4081541Srgrimes	}
4091541Srgrimes	$2 == "UNIMPL" {
41036770Sbde		printf("\t{ 0, (sy_call_t *)nosys },\t\t\t/* %d = %s */\n",
4111541Srgrimes		    syscall, comment) > sysent
41236770Sbde		printf("\t\"#%d\",\t\t\t/* %d = %s */\n",
4131541Srgrimes		    syscall, syscall, comment) > sysnames
4141541Srgrimes		syscall++
4151541Srgrimes		next
4161541Srgrimes	}
4171541Srgrimes	{
4181541Srgrimes		printf "%s: line %d: unrecognized keyword %s\n", infile, NR, $2
4191541Srgrimes		exit 1
4201541Srgrimes	}
4211541Srgrimes	END {
42260287Sbde		printf "\n#define AS(name) (sizeof(struct name) / sizeof(register_t))\n" > sysinc
42336782Sbde		if (ncompat != 0) {
42436782Sbde			printf "#include \"opt_compat.h\"\n\n" > syssw
42536782Sbde			printf "\n#ifdef %s\n", compat > sysinc
42636782Sbde			printf "#define compat(n, name) n, (sy_call_t *)__CONCAT(o,name)\n" > sysinc
42736782Sbde			printf "#else\n" > sysinc
42836782Sbde			printf "#define compat(n, name) 0, (sy_call_t *)nosys\n" > sysinc
42936782Sbde			printf "#endif\n" > sysinc
43036782Sbde		}
43136782Sbde
43236735Sdfr		printf("\n#endif /* %s */\n\n", compat) > syscompatdcl
43336735Sdfr		printf("#undef PAD_\n") > syscompatdcl
43482149Stmm		printf("#undef PADL_\n") > syscompatdcl
43582149Stmm		printf("#undef PADR_\n") > syscompatdcl
43611294Sswallace		printf("\n#endif /* !%s */\n", sysproto_h) > syscompatdcl
4371541Srgrimes
43837227Sphk		printf("\n") > sysmk
43914331Speter		printf("};\n") > sysent
4401541Srgrimes		printf("};\n") > sysnames
44111294Sswallace		printf("#define\t%sMAXSYSCALL\t%d\n", syscallprefix, syscall) \
44236770Sbde		    > syshdr
4431541Srgrimes	} '
4441541Srgrimes
44536782Sbdecat $sysinc $sysent >> $syssw
44611294Sswallacecat $sysarg $sysdcl $syscompat $syscompatdcl > $sysproto
447