11541Srgrimes#! /bin/sh -
21541Srgrimes#	@(#)makesyscalls.sh	8.1 (Berkeley) 6/10/93
350477Speter# $FreeBSD$
41541Srgrimes
51541Srgrimesset -e
61541Srgrimes
799854Salfred# name of compat options:
81541Srgrimescompat=COMPAT_43
999854Salfredcompat4=COMPAT_FREEBSD4
10171208Spetercompat6=COMPAT_FREEBSD6
11194833Sjhbcompat7=COMPAT_FREEBSD7
121541Srgrimes
131541Srgrimes# output files:
141541Srgrimessysnames="syscalls.c"
1510905Sbdesysproto="../sys/sysproto.h"
1610905Sbdesysproto_h=_SYS_SYSPROTO_H_
171541Srgrimessyshdr="../sys/syscall.h"
1834354Sjbsysmk="../sys/syscall.mk"
191541Srgrimessyssw="init_sysent.c"
2011294Sswallacesyscallprefix="SYS_"
2111294Sswallaceswitchname="sysent"
2211294Sswallacenamesname="syscallnames"
23160942Sjbsystrace="systrace_args.c"
241541Srgrimes
251541Srgrimes# tmp files:
26161327Sjhbsysaue="sysent.aue.$$"
2731627Sjmgsysdcl="sysent.dcl.$$"
2831627Sjmgsyscompat="sysent.compat.$$"
2931627Sjmgsyscompatdcl="sysent.compatdcl.$$"
3099854Salfredsyscompat4="sysent.compat4.$$"
3199854Salfredsyscompat4dcl="sysent.compat4dcl.$$"
32171208Spetersyscompat6="sysent.compat6.$$"
33171208Spetersyscompat6dcl="sysent.compat6dcl.$$"
34194833Sjhbsyscompat7="sysent.compat7.$$"
35194833Sjhbsyscompat7dcl="sysent.compat7dcl.$$"
3631627Sjmgsysent="sysent.switch.$$"
3731627Sjmgsysinc="sysinc.switch.$$"
3831627Sjmgsysarg="sysarg.switch.$$"
3999854Salfredsysprotoend="sysprotoend.$$"
40177656Sjbsystracetmp="systrace.$$"
411541Srgrimes
42219131Srwatsonif [ -r capabilities.conf ]; then
43219131Srwatson	capenabled=`cat capabilities.conf | grep -v "^#" | grep -v "^$"`
44219131Srwatson	capenabled=`echo $capenabled | sed 's/ /,/g'`
45219131Srwatsonelse
46219131Srwatson	capenabled=""
47219131Srwatsonfi
48219131Srwatson
49194833Sjhbtrap "rm $sysaue $sysdcl $syscompat $syscompatdcl $syscompat4 $syscompat4dcl $syscompat6 $syscompat6dcl $syscompat7 $syscompat7dcl $sysent $sysinc $sysarg $sysprotoend $systracetmp" 0
501541Srgrimes
51194833Sjhbtouch $sysaue $sysdcl $syscompat $syscompatdcl $syscompat4 $syscompat4dcl $syscompat6 $syscompat6dcl $syscompat7 $syscompat7dcl $sysent $sysinc $sysarg $sysprotoend $systracetmp
5224373Speter
531541Srgrimescase $# in
5495258Sdes    0)	echo "usage: $0 input-file <config-file>" 1>&2
551541Srgrimes	exit 1
561541Srgrimes	;;
571541Srgrimesesac
581541Srgrimes
5936735Sdfrif [ -n "$2" -a -f "$2" ]; then
6011294Sswallace	. $2
6111294Sswallacefi
6211294Sswallace
6311294Sswallacesed -e '
6411294Sswallaces/\$//g
6511294Sswallace:join
6611294Sswallace	/\\$/{a\
6711294Sswallace
6811294Sswallace	N
6911294Sswallace	s/\\\n//
7011294Sswallace	b join
7111294Sswallace	}
7211294Sswallace2,${
7311294Sswallace	/^#/!s/\([{}()*,]\)/ \1 /g
7411294Sswallace}
7511294Sswallace' < $1 | awk "
761541Srgrimes	BEGIN {
77161327Sjhb		sysaue = \"$sysaue\"
781541Srgrimes		sysdcl = \"$sysdcl\"
7910905Sbde		sysproto = \"$sysproto\"
8099854Salfred		sysprotoend = \"$sysprotoend\"
8110905Sbde		sysproto_h = \"$sysproto_h\"
821541Srgrimes		syscompat = \"$syscompat\"
8311294Sswallace		syscompatdcl = \"$syscompatdcl\"
8499854Salfred		syscompat4 = \"$syscompat4\"
8599854Salfred		syscompat4dcl = \"$syscompat4dcl\"
86171208Speter		syscompat6 = \"$syscompat6\"
87171208Speter		syscompat6dcl = \"$syscompat6dcl\"
88194833Sjhb		syscompat7 = \"$syscompat7\"
89194833Sjhb		syscompat7dcl = \"$syscompat7dcl\"
901541Srgrimes		sysent = \"$sysent\"
9136782Sbde		syssw = \"$syssw\"
9211294Sswallace		sysinc = \"$sysinc\"
9311294Sswallace		sysarg = \"$sysarg\"
941541Srgrimes		sysnames = \"$sysnames\"
951541Srgrimes		syshdr = \"$syshdr\"
9634354Sjb		sysmk = \"$sysmk\"
97160942Sjb		systrace = \"$systrace\"
98177656Sjb		systracetmp = \"$systracetmp\"
991541Srgrimes		compat = \"$compat\"
10099854Salfred		compat4 = \"$compat4\"
101171208Speter		compat6 = \"$compat6\"
102194833Sjhb		compat7 = \"$compat7\"
10311294Sswallace		syscallprefix = \"$syscallprefix\"
10411294Sswallace		switchname = \"$switchname\"
10511294Sswallace		namesname = \"$namesname\"
1061541Srgrimes		infile = \"$1\"
107219131Srwatson		capenabled_string = \"$capenabled\"
1081541Srgrimes		"'
1091541Srgrimes
110219131Srwatson		split(capenabled_string, capenabled, ",");
111219131Srwatson
11236782Sbde		printf "/*\n * System call switch table.\n *\n" > syssw
11336782Sbde		printf " * DO NOT EDIT-- this file is automatically generated.\n" > syssw
11489977Sbde		printf " * $%s$\n", "FreeBSD" > syssw
11510905Sbde
11611294Sswallace		printf "/*\n * System call prototypes.\n *\n" > sysarg
11711294Sswallace		printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysarg
11889977Sbde		printf " * $%s$\n", "FreeBSD" > sysarg
1191541Srgrimes
12031785Seivind		printf "\n#ifdef %s\n\n", compat > syscompat
12199854Salfred		printf "\n#ifdef %s\n\n", compat4 > syscompat4
122171208Speter		printf "\n#ifdef %s\n\n", compat6 > syscompat6
123194833Sjhb		printf "\n#ifdef %s\n\n", compat7 > syscompat7
1241541Srgrimes
1251541Srgrimes		printf "/*\n * System call names.\n *\n" > sysnames
1261541Srgrimes		printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysnames
12789977Sbde		printf " * $%s$\n", "FreeBSD" > sysnames
1281541Srgrimes
1291541Srgrimes		printf "/*\n * System call numbers.\n *\n" > syshdr
1301541Srgrimes		printf " * DO NOT EDIT-- this file is automatically generated.\n" > syshdr
13189977Sbde		printf " * $%s$\n", "FreeBSD" > syshdr
13234354Sjb		printf "# FreeBSD system call names.\n" > sysmk
13334354Sjb		printf "# DO NOT EDIT-- this file is automatically generated.\n" > sysmk
13489984Sbde		printf "# $%s$\n", "FreeBSD" > sysmk
135160942Sjb
136160942Sjb		printf "/*\n * System call argument to DTrace register array converstion.\n *\n" > systrace
137160942Sjb		printf " * DO NOT EDIT-- this file is automatically generated.\n" > systrace
138160942Sjb		printf " * $%s$\n", "FreeBSD" > systrace
1391541Srgrimes	}
1401541Srgrimes	NR == 1 {
14150478Speter		gsub("[$]FreeBSD: ", "", $0)
14210906Sbde		gsub(" [$]", "", $0)
14311294Sswallace
14436782Sbde		printf " * created from%s\n */\n\n", $0 > syssw
14511294Sswallace
14636782Sbde		printf "\n/* The casts are bogus but will do for now. */\n" > sysent
14711294Sswallace		printf "struct sysent %s[] = {\n",switchname > sysent
14810905Sbde
14911294Sswallace		printf " * created from%s\n */\n\n", $0 > sysarg
15033039Sbde		printf "#ifndef %s\n", sysproto_h > sysarg
15133039Sbde		printf "#define\t%s\n\n", sysproto_h > sysarg
152103574Salfred		printf "#include <sys/signal.h>\n" > sysarg
153103574Salfred		printf "#include <sys/acl.h>\n" > sysarg
154177597Sru		printf "#include <sys/cpuset.h>\n" > sysarg
155164184Strhodes		printf "#include <sys/_semaphore.h>\n" > sysarg
156258106Sjhb		printf "#include <sys/ucontext.h>\n" > sysarg
157258106Sjhb		printf "#include <sys/wait.h>\n\n" > sysarg
158161327Sjhb		printf "#include <bsm/audit_kevents.h>\n\n" > sysarg
15933039Sbde		printf "struct proc;\n\n" > sysarg
16083366Sjulian		printf "struct thread;\n\n" > sysarg
16136770Sbde		printf "#define\tPAD_(t)\t(sizeof(register_t) <= sizeof(t) ? \\\n" > sysarg
16236770Sbde		printf "\t\t0 : sizeof(register_t) - sizeof(t))\n\n" > sysarg
16382149Stmm		printf "#if BYTE_ORDER == LITTLE_ENDIAN\n"> sysarg
16482149Stmm		printf "#define\tPADL_(t)\t0\n" > sysarg
16582149Stmm		printf "#define\tPADR_(t)\tPAD_(t)\n" > sysarg
16682149Stmm		printf "#else\n" > sysarg
16782149Stmm		printf "#define\tPADL_(t)\tPAD_(t)\n" > sysarg
16882149Stmm		printf "#define\tPADR_(t)\t0\n" > sysarg
16982149Stmm		printf "#endif\n\n" > sysarg
1701541Srgrimes
1711541Srgrimes		printf " * created from%s\n */\n\n", $0 > sysnames
172106149Sdwmalone		printf "const char *%s[] = {\n", namesname > sysnames
1731541Srgrimes
1741541Srgrimes		printf " * created from%s\n */\n\n", $0 > syshdr
1752700Swollman
17634354Sjb		printf "# created from%s\nMIASM = ", $0 > sysmk
17734354Sjb
178160942Sjb		printf " * This file is part of the DTrace syscall provider.\n */\n\n" > systrace
179209390Sed		printf "static void\nsystrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args)\n{\n" > systrace
180160942Sjb		printf "\tint64_t *iarg  = (int64_t *) uarg;\n" > systrace
181160942Sjb		printf "\tswitch (sysnum) {\n" > systrace
182160942Sjb
183177656Sjb		printf "static void\nsystrace_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)\n{\n\tconst char *p = NULL;\n" > systracetmp
184177656Sjb		printf "\tswitch (sysnum) {\n" > systracetmp
185177656Sjb
1861541Srgrimes		next
1871541Srgrimes	}
1881541Srgrimes	NF == 0 || $1 ~ /^;/ {
1891541Srgrimes		next
1901541Srgrimes	}
19111294Sswallace	$1 ~ /^#[ 	]*include/ {
19211294Sswallace		print > sysinc
19311294Sswallace		next
19411294Sswallace	}
1951541Srgrimes	$1 ~ /^#[ 	]*if/ {
1961541Srgrimes		print > sysent
1971541Srgrimes		print > sysdcl
19811294Sswallace		print > sysarg
1991541Srgrimes		print > syscompat
20099854Salfred		print > syscompat4
201171208Speter		print > syscompat6
202194833Sjhb		print > syscompat7
2031541Srgrimes		print > sysnames
204219559Savg		print > systrace
205219559Savg		print > systracetmp
2061541Srgrimes		savesyscall = syscall
2071541Srgrimes		next
2081541Srgrimes	}
2091541Srgrimes	$1 ~ /^#[ 	]*else/ {
2101541Srgrimes		print > sysent
2111541Srgrimes		print > sysdcl
21211294Sswallace		print > sysarg
2131541Srgrimes		print > syscompat
21499854Salfred		print > syscompat4
215171208Speter		print > syscompat6
216194833Sjhb		print > syscompat7
2171541Srgrimes		print > sysnames
218219559Savg		print > systrace
219219559Savg		print > systracetmp
2201541Srgrimes		syscall = savesyscall
2211541Srgrimes		next
2221541Srgrimes	}
2231541Srgrimes	$1 ~ /^#/ {
2241541Srgrimes		print > sysent
2251541Srgrimes		print > sysdcl
22611294Sswallace		print > sysarg
2271541Srgrimes		print > syscompat
22899854Salfred		print > syscompat4
229171208Speter		print > syscompat6
230194833Sjhb		print > syscompat7
2311541Srgrimes		print > sysnames
232219559Savg		print > systrace
233219559Savg		print > systracetmp
2341541Srgrimes		next
2351541Srgrimes	}
2361541Srgrimes	syscall != $1 {
23736770Sbde		printf "%s: line %d: syscall number out of sync at %d\n",
23836770Sbde		    infile, NR, syscall
2391541Srgrimes		printf "line is:\n"
2401541Srgrimes		print
2411541Srgrimes		exit 1
2421541Srgrimes	}
243194390Sjhb	# Returns true if the type "name" is the first flag in the type field
244194390Sjhb	function type(name, flags, n) {
245194390Sjhb		n = split($3, flags, /\|/)
246194390Sjhb		return (n > 0 && flags[1] == name)
247194390Sjhb	}
248194390Sjhb	# Returns true if the flag "name" is set in the type field
249194390Sjhb	function flag(name, flags, i, n) {
250194390Sjhb		n = split($3, flags, /\|/)
251194390Sjhb		for (i = 1; i <= n; i++)
252194390Sjhb			if (flags[i] == name)
253194390Sjhb				return 1
254194390Sjhb		return 0
255194390Sjhb	}
25660287Sbde	function align_sysent_comment(column) {
25760287Sbde		printf("\t") > sysent
25860287Sbde		column = column + 8 - column % 8
25960287Sbde		while (column < 56) {
26060287Sbde			printf("\t") > sysent
26160287Sbde			column = column + 8
26260287Sbde		}
26360287Sbde	}
26411294Sswallace	function parserr(was, wanted) {
26536770Sbde		printf "%s: line %d: unexpected %s (expected %s)\n",
26611294Sswallace		    infile, NR, was, wanted
26711294Sswallace		exit 1
26811294Sswallace	}
26911294Sswallace	function parseline() {
270146806Srwatson		f=4			# toss number, type, audit event
27111294Sswallace		argc= 0;
27260287Sbde		argssize = "0"
273209579Skib		thr_flag = "SY_THR_STATIC"
274209579Skib		if (flag("NOTSTATIC")) {
275209579Skib			thr_flag = "SY_THR_ABSENT"
276209579Skib		}
27711294Sswallace		if ($NF != "}") {
27811294Sswallace			funcalias=$(NF-2)
27911294Sswallace			argalias=$(NF-1)
28011294Sswallace			rettype=$NF
28111294Sswallace			end=NF-3
28211294Sswallace		} else {
28311294Sswallace			funcalias=""
28411294Sswallace			argalias=""
28511294Sswallace			rettype="int"
28611294Sswallace			end=NF
28710905Sbde		}
288194390Sjhb		if (flag("NODEF")) {
289146806Srwatson			auditev="AUE_NULL"
290146806Srwatson			funcname=$4
291146806Srwatson			argssize = "AS(" $6 ")"
29211294Sswallace			return
29311294Sswallace		}
29411294Sswallace		if ($f != "{")
29511294Sswallace			parserr($f, "{")
29611294Sswallace		f++
29711294Sswallace		if ($end != "}")
29811294Sswallace			parserr($end, "}")
29911294Sswallace		end--
30011294Sswallace		if ($end != ";")
30111294Sswallace			parserr($end, ";")
30211294Sswallace		end--
30311294Sswallace		if ($end != ")")
30411294Sswallace			parserr($end, ")")
30511294Sswallace		end--
30611294Sswallace
30711294Sswallace		f++	#function return type
30811294Sswallace
30911294Sswallace		funcname=$f
310219131Srwatson
311219131Srwatson		#
312219131Srwatson		# We now know the func name, so define a flags field for it.
313219131Srwatson		# Do this before any other processing as we may return early
314219131Srwatson		# from it.
315219131Srwatson		#
316219131Srwatson		for (cap in capenabled) {
317219131Srwatson			if (funcname == capenabled[cap]) {
318219131Srwatson				flags = "SYF_CAPENABLED";
319219131Srwatson			}
320219131Srwatson		}
321219131Srwatson
32211294Sswallace		if (funcalias == "")
32311294Sswallace			funcalias = funcname
32411294Sswallace		if (argalias == "") {
32511294Sswallace			argalias = funcname "_args"
326194390Sjhb			if (flag("COMPAT"))
32711330Sswallace				argalias = "o" argalias
328194390Sjhb			if (flag("COMPAT4"))
32999854Salfred				argalias = "freebsd4_" argalias
330194390Sjhb			if (flag("COMPAT6"))
331171208Speter				argalias = "freebsd6_" argalias
332194833Sjhb			if (flag("COMPAT7"))
333194833Sjhb				argalias = "freebsd7_" argalias
33411294Sswallace		}
33511294Sswallace		f++
33611294Sswallace
33711294Sswallace		if ($f != "(")
33811294Sswallace			parserr($f, ")")
33911294Sswallace		f++
34011294Sswallace
34111294Sswallace		if (f == end) {
34211294Sswallace			if ($f != "void")
34311294Sswallace				parserr($f, "argument definition")
34411294Sswallace			return
34511294Sswallace		}
34611294Sswallace
34711294Sswallace		while (f <= end) {
34811294Sswallace			argc++
34911294Sswallace			argtype[argc]=""
35011294Sswallace			oldf=""
35111294Sswallace			while (f < end && $(f+1) != ",") {
35211294Sswallace				if (argtype[argc] != "" && oldf != "*")
35311294Sswallace					argtype[argc] = argtype[argc]" ";
35411294Sswallace				argtype[argc] = argtype[argc]$f;
35511294Sswallace				oldf = $f;
35611294Sswallace				f++
35711294Sswallace			}
35811294Sswallace			if (argtype[argc] == "")
35911294Sswallace				parserr($f, "argument definition")
36011294Sswallace			argname[argc]=$f;
36111294Sswallace			f += 2;			# skip name, and any comma
36211294Sswallace		}
36360287Sbde		if (argc != 0)
36460287Sbde			argssize = "AS(" argalias ")"
3651541Srgrimes	}
366146806Srwatson	{	comment = $4
367146806Srwatson		if (NF < 7)
368146806Srwatson			for (i = 5; i <= NF; i++)
36911294Sswallace				comment = comment " " $i
37011294Sswallace	}
37182585Sdillon
372146806Srwatson	#
373146806Srwatson	# The AUE_ audit event identifier.
374146806Srwatson	#
375146806Srwatson	{
376146806Srwatson		auditev = $2;
377146806Srwatson	}
378146806Srwatson
379193234Srwatson	#
380219131Srwatson	# The flags, if any.
381193234Srwatson	#
382193234Srwatson	{
383193234Srwatson		flags = "0";
384193234Srwatson	}
385193234Srwatson
386194390Sjhb	type("STD") || type("NODEF") || type("NOARGS") || type("NOPROTO") \
387194390Sjhb	    || type("NOSTD") {
38811294Sswallace		parseline()
389160942Sjb		printf("\t/* %s */\n\tcase %d: {\n", funcname, syscall) > systrace
390177656Sjb		printf("\t/* %s */\n\tcase %d:\n", funcname, syscall) > systracetmp
391160942Sjb		if (argc > 0) {
392177656Sjb			printf("\t\tswitch(ndx) {\n") > systracetmp
393160942Sjb			printf("\t\tstruct %s *p = params;\n", argalias) > systrace
394160942Sjb			for (i = 1; i <= argc; i++) {
395262034Savg				arg = argtype[i]
396262034Savg				sub("__restrict$", "", arg)
397262034Savg				printf("\t\tcase %d:\n\t\t\tp = \"%s\";\n\t\t\tbreak;\n", i - 1, arg) > systracetmp
398262034Savg				if (index(arg, "*") > 0 || arg == "caddr_t")
399160942Sjb					printf("\t\tuarg[%d] = (intptr_t) p->%s; /* %s */\n", \
400160942Sjb					     i - 1, \
401262034Savg					     argname[i], arg) > systrace
402262034Savg				else if (substr(arg, 1, 1) == "u" || arg == "size_t")
403160942Sjb					printf("\t\tuarg[%d] = p->%s; /* %s */\n", \
404160942Sjb					     i - 1, \
405262034Savg					     argname[i], arg) > systrace
406160942Sjb				else
407160942Sjb					printf("\t\tiarg[%d] = p->%s; /* %s */\n", \
408160942Sjb					     i - 1, \
409262034Savg					     argname[i], arg) > systrace
410160942Sjb			}
411177656Sjb			printf("\t\tdefault:\n\t\t\tbreak;\n\t\t};\n") > systracetmp
412160942Sjb		}
413160942Sjb		printf("\t\t*n_args = %d;\n\t\tbreak;\n\t}\n", argc) > systrace
414177656Sjb		printf("\t\tbreak;\n") > systracetmp
415194390Sjhb		if (argc != 0 && !flag("NOARGS") && !flag("NOPROTO") && \
416194390Sjhb		    !flag("NODEF")) {
417183361Sjhb			printf("struct %s {\n", argalias) > sysarg
418183361Sjhb			for (i = 1; i <= argc; i++)
419183361Sjhb				printf("\tchar %s_l_[PADL_(%s)]; " \
420183361Sjhb				    "%s %s; char %s_r_[PADR_(%s)];\n",
421183361Sjhb				    argname[i], argtype[i],
422183361Sjhb				    argtype[i], argname[i],
423183361Sjhb				    argname[i], argtype[i]) > sysarg
424183361Sjhb			printf("};\n") > sysarg
42510905Sbde		}
426194390Sjhb		else if (!flag("NOARGS") && !flag("NOPROTO") && !flag("NODEF"))
427183361Sjhb			printf("struct %s {\n\tregister_t dummy;\n};\n",
428183361Sjhb			    argalias) > sysarg
429194390Sjhb		if (!flag("NOPROTO") && !flag("NODEF")) {
430225617Skmacy			if (funcname == "nosys" || funcname == "lkmnosys" ||
431225617Skmacy			    funcname == "sysarch" || funcname ~ /^freebsd/ || 
432225617Skmacy			    funcname ~ /^linux/ || funcname ~ /^svr4/ || 
433225617Skmacy			    funcname ~ /^ibcs2/ || funcname ~ /^xenix/) {				
434225617Skmacy				printf("%s\t%s(struct thread *, struct %s *)",
435225617Skmacy				    rettype, funcname, argalias) > sysdcl
436225617Skmacy			} else {
437225617Skmacy				printf("%s\tsys_%s(struct thread *, struct %s *)",
438225617Skmacy				    rettype, funcname, argalias) > sysdcl
439225617Skmacy			} 
44018277Sbde			printf(";\n") > sysdcl
441161327Sjhb			printf("#define\t%sAUE_%s\t%s\n", syscallprefix,
442161327Sjhb			    funcalias, auditev) > sysaue
44311330Sswallace		}
444160798Sjhb		printf("\t{ %s, (sy_call_t *)", argssize) > sysent
445160798Sjhb		column = 8 + 2 + length(argssize) + 15
446194390Sjhb		if (flag("NOSTD")) {
447209579Skib			printf("%s },", "lkmressys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT") > sysent
448193234Srwatson			column = column + length("lkmressys") + length("AUE_NULL") + 3
44969445Salfred		} else {
450225617Skmacy			if (funcname == "nosys" || funcname == "sysarch" || 
451225617Skmacy			    funcname == "lkmnosys" || funcname ~ /^freebsd/ ||
452225617Skmacy			    funcname ~ /^linux/ || funcname ~ /^svr4/ ||
453225617Skmacy			    funcname ~ /^ibcs2/ || funcname ~ /^xenix/) {
454225617Skmacy				printf("%s, %s, NULL, 0, 0, %s, %s },", funcname, auditev, flags, thr_flag) > sysent
455225617Skmacy				column = column + length(funcname) + length(auditev) + length(flags) + 3 
456225617Skmacy			} else {
457225617Skmacy				printf("sys_%s, %s, NULL, 0, 0, %s, %s },", funcname, auditev, flags, thr_flag) > sysent
458225617Skmacy				column = column + length(funcname) + length(auditev) + length(flags) + 3 + 4
459225617Skmacy			} 
46069445Salfred		} 
46160287Sbde		align_sysent_comment(column)
46258963Salfred		printf("/* %d = %s */\n", syscall, funcalias) > sysent
46336770Sbde		printf("\t\"%s\",\t\t\t/* %d = %s */\n",
46411294Sswallace		    funcalias, syscall, funcalias) > sysnames
465194390Sjhb		if (!flag("NODEF")) {
46636770Sbde			printf("#define\t%s%s\t%d\n", syscallprefix,
46711294Sswallace		    	    funcalias, syscall) > syshdr
46834354Sjb			printf(" \\\n\t%s.o", funcalias) > sysmk
46934354Sjb		}
4701541Srgrimes		syscall++
4711541Srgrimes		next
4721541Srgrimes	}
473194833Sjhb	type("COMPAT") || type("COMPAT4") || type("COMPAT6") || \
474194833Sjhb	    type("COMPAT7") {
475194390Sjhb		if (flag("COMPAT")) {
47699854Salfred			ncompat++
47799854Salfred			out = syscompat
47899854Salfred			outdcl = syscompatdcl
47999854Salfred			wrap = "compat"
48099854Salfred			prefix = "o"
481194390Sjhb			descr = "old"
482194390Sjhb		} else if (flag("COMPAT4")) {
48399854Salfred			ncompat4++
48499854Salfred			out = syscompat4
48599854Salfred			outdcl = syscompat4dcl
48699854Salfred			wrap = "compat4"
48799854Salfred			prefix = "freebsd4_"
488194390Sjhb			descr = "freebsd4"
489194390Sjhb		} else if (flag("COMPAT6")) {
490171208Speter			ncompat6++
491171208Speter			out = syscompat6
492171208Speter			outdcl = syscompat6dcl
493171208Speter			wrap = "compat6"
494171208Speter			prefix = "freebsd6_"
495194390Sjhb			descr = "freebsd6"
496194833Sjhb		} else if (flag("COMPAT7")) {
497194833Sjhb			ncompat7++
498194833Sjhb			out = syscompat7
499194833Sjhb			outdcl = syscompat7dcl
500194833Sjhb			wrap = "compat7"
501194833Sjhb			prefix = "freebsd7_"
502194833Sjhb			descr = "freebsd7"
50399854Salfred		}
50411294Sswallace		parseline()
505194390Sjhb		if (argc != 0 && !flag("NOARGS") && !flag("NOPROTO") && \
506194390Sjhb		    !flag("NODEF")) {
50799854Salfred			printf("struct %s {\n", argalias) > out
50811294Sswallace			for (i = 1; i <= argc; i++)
50982149Stmm				printf("\tchar %s_l_[PADL_(%s)]; %s %s; " \
51082149Stmm				    "char %s_r_[PADR_(%s)];\n",
51182149Stmm				    argname[i], argtype[i],
51236735Sdfr				    argtype[i], argname[i],
51399854Salfred				    argname[i], argtype[i]) > out
51499854Salfred			printf("};\n") > out
51511294Sswallace		}
516194390Sjhb		else if (!flag("NOARGS") && !flag("NOPROTO") && !flag("NODEF"))
51783046Sobrien			printf("struct %s {\n\tregister_t dummy;\n};\n",
51836770Sbde			    argalias) > sysarg
519194390Sjhb		if (!flag("NOPROTO") && !flag("NODEF")) {
520194390Sjhb			printf("%s\t%s%s(struct thread *, struct %s *);\n",
521194390Sjhb			    rettype, prefix, funcname, argalias) > outdcl
522194646Sjhb			printf("#define\t%sAUE_%s%s\t%s\n", syscallprefix,
523194646Sjhb			    prefix, funcname, auditev) > sysaue
524194390Sjhb		}
525194390Sjhb		if (flag("NOSTD")) {
526209579Skib			printf("\t{ %s, (sy_call_t *)%s, %s, NULL, 0, 0, 0, SY_THR_ABSENT },",
527194390Sjhb			    "0", "lkmressys", "AUE_NULL") > sysent
528194390Sjhb			align_sysent_comment(8 + 2 + length("0") + 15 + \
529194390Sjhb			    length("lkmressys") + length("AUE_NULL") + 3)
530194390Sjhb		} else {
531209579Skib			printf("\t{ %s(%s,%s), %s, NULL, 0, 0, %s, %s },",
532209579Skib			    wrap, argssize, funcname, auditev, flags, thr_flag) > sysent
533194390Sjhb			align_sysent_comment(8 + 9 + length(argssize) + 1 + \
534194390Sjhb			    length(funcname) + length(auditev) + \
535194390Sjhb			    length(flags) + 4)
536194390Sjhb		}
537194390Sjhb		printf("/* %d = %s %s */\n", syscall, descr, funcalias) > sysent
538194390Sjhb		printf("\t\"%s.%s\",\t\t/* %d = %s %s */\n",
539194390Sjhb		    wrap, funcalias, syscall, descr, funcalias) > sysnames
540194390Sjhb		if (flag("COMPAT")) {
541171208Speter			printf("\t\t\t\t/* %d is old %s */\n",
542171208Speter			    syscall, funcalias) > syshdr
543194390Sjhb		} else if (!flag("NODEF")) {
544171208Speter			printf("#define\t%s%s%s\t%d\n", syscallprefix,
545171208Speter			    prefix, funcalias, syscall) > syshdr
546171208Speter			printf(" \\\n\t%s%s.o", prefix, funcalias) > sysmk
547171208Speter		}
5481541Srgrimes		syscall++
5491541Srgrimes		next
5501541Srgrimes	}
551194390Sjhb	type("OBSOL") {
552209579Skib		printf("\t{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT },") > sysent
55360287Sbde		align_sysent_comment(34)
55460287Sbde		printf("/* %d = obsolete %s */\n", syscall, comment) > sysent
55536770Sbde		printf("\t\"obs_%s\",\t\t\t/* %d = obsolete %s */\n",
556146806Srwatson		    $4, syscall, comment) > sysnames
55736770Sbde		printf("\t\t\t\t/* %d is obsolete %s */\n",
5581541Srgrimes		    syscall, comment) > syshdr
5591541Srgrimes		syscall++
5601541Srgrimes		next
5611541Srgrimes	}
562194390Sjhb	type("UNIMPL") {
563209579Skib		printf("\t{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT },\t\t\t/* %d = %s */\n",
5641541Srgrimes		    syscall, comment) > sysent
56536770Sbde		printf("\t\"#%d\",\t\t\t/* %d = %s */\n",
5661541Srgrimes		    syscall, syscall, comment) > sysnames
5671541Srgrimes		syscall++
5681541Srgrimes		next
5691541Srgrimes	}
5701541Srgrimes	{
571146806Srwatson		printf "%s: line %d: unrecognized keyword %s\n", infile, NR, $3
5721541Srgrimes		exit 1
5731541Srgrimes	}
5741541Srgrimes	END {
57560287Sbde		printf "\n#define AS(name) (sizeof(struct name) / sizeof(register_t))\n" > sysinc
57699854Salfred
577194833Sjhb		if (ncompat != 0 || ncompat4 != 0 || ncompat6 != 0 || ncompat7 != 0)
57899854Salfred			printf "#include \"opt_compat.h\"\n\n" > syssw
57999854Salfred
58036782Sbde		if (ncompat != 0) {
58136782Sbde			printf "\n#ifdef %s\n", compat > sysinc
58236782Sbde			printf "#define compat(n, name) n, (sy_call_t *)__CONCAT(o,name)\n" > sysinc
58336782Sbde			printf "#else\n" > sysinc
58436782Sbde			printf "#define compat(n, name) 0, (sy_call_t *)nosys\n" > sysinc
58536782Sbde			printf "#endif\n" > sysinc
58636782Sbde		}
58736782Sbde
58899854Salfred		if (ncompat4 != 0) {
58999854Salfred			printf "\n#ifdef %s\n", compat4 > sysinc
59099854Salfred			printf "#define compat4(n, name) n, (sy_call_t *)__CONCAT(freebsd4_,name)\n" > sysinc
59199854Salfred			printf "#else\n" > sysinc
59299854Salfred			printf "#define compat4(n, name) 0, (sy_call_t *)nosys\n" > sysinc
59399854Salfred			printf "#endif\n" > sysinc
59499854Salfred		}
59599854Salfred
596171208Speter		if (ncompat6 != 0) {
597171208Speter			printf "\n#ifdef %s\n", compat6 > sysinc
598171208Speter			printf "#define compat6(n, name) n, (sy_call_t *)__CONCAT(freebsd6_,name)\n" > sysinc
599171208Speter			printf "#else\n" > sysinc
600171208Speter			printf "#define compat6(n, name) 0, (sy_call_t *)nosys\n" > sysinc
601171208Speter			printf "#endif\n" > sysinc
602171208Speter		}
603171208Speter
604194833Sjhb		if (ncompat7 != 0) {
605194833Sjhb			printf "\n#ifdef %s\n", compat7 > sysinc
606194833Sjhb			printf "#define compat7(n, name) n, (sy_call_t *)__CONCAT(freebsd7_,name)\n" > sysinc
607194833Sjhb			printf "#else\n" > sysinc
608194833Sjhb			printf "#define compat7(n, name) 0, (sy_call_t *)nosys\n" > sysinc
609194833Sjhb			printf "#endif\n" > sysinc
610194833Sjhb		}
611194833Sjhb
61236735Sdfr		printf("\n#endif /* %s */\n\n", compat) > syscompatdcl
61399854Salfred		printf("\n#endif /* %s */\n\n", compat4) > syscompat4dcl
614171208Speter		printf("\n#endif /* %s */\n\n", compat6) > syscompat6dcl
615194833Sjhb		printf("\n#endif /* %s */\n\n", compat7) > syscompat7dcl
61699854Salfred
617161327Sjhb		printf("\n#undef PAD_\n") > sysprotoend
61899854Salfred		printf("#undef PADL_\n") > sysprotoend
61999854Salfred		printf("#undef PADR_\n") > sysprotoend
62099854Salfred		printf("\n#endif /* !%s */\n", sysproto_h) > sysprotoend
62199854Salfred
62237227Sphk		printf("\n") > sysmk
62314331Speter		printf("};\n") > sysent
6241541Srgrimes		printf("};\n") > sysnames
62511294Sswallace		printf("#define\t%sMAXSYSCALL\t%d\n", syscallprefix, syscall) \
62636770Sbde		    > syshdr
627160942Sjb		printf "\tdefault:\n\t\t*n_args = 0;\n\t\tbreak;\n\t};\n}\n" > systrace
628177656Sjb		printf "\tdefault:\n\t\tbreak;\n\t};\n\tif (p != NULL)\n\t\tstrlcpy(desc, p, descsz);\n}\n" > systracetmp
6291541Srgrimes	} '
6301541Srgrimes
63136782Sbdecat $sysinc $sysent >> $syssw
63299854Salfredcat $sysarg $sysdcl \
63399854Salfred	$syscompat $syscompatdcl \
63499854Salfred	$syscompat4 $syscompat4dcl \
635171208Speter	$syscompat6 $syscompat6dcl \
636194833Sjhb	$syscompat7 $syscompat7dcl \
637161327Sjhb	$sysaue $sysprotoend > $sysproto
638177656Sjbcat $systracetmp >> $systrace
63999854Salfred
640