makesyscalls.sh revision 219131
11541Srgrimes#! /bin/sh -
21541Srgrimes#	@(#)makesyscalls.sh	8.1 (Berkeley) 6/10/93
350477Speter# $FreeBSD: head/sys/kern/makesyscalls.sh 219131 2011-03-01 13:28:27Z rwatson $
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
156112903Sjeff		printf "#include <sys/ucontext.h>\n\n" > sysarg
157161327Sjhb		printf "#include <bsm/audit_kevents.h>\n\n" > sysarg
15833039Sbde		printf "struct proc;\n\n" > sysarg
15983366Sjulian		printf "struct thread;\n\n" > sysarg
16036770Sbde		printf "#define\tPAD_(t)\t(sizeof(register_t) <= sizeof(t) ? \\\n" > sysarg
16136770Sbde		printf "\t\t0 : sizeof(register_t) - sizeof(t))\n\n" > sysarg
16282149Stmm		printf "#if BYTE_ORDER == LITTLE_ENDIAN\n"> sysarg
16382149Stmm		printf "#define\tPADL_(t)\t0\n" > sysarg
16482149Stmm		printf "#define\tPADR_(t)\tPAD_(t)\n" > sysarg
16582149Stmm		printf "#else\n" > sysarg
16682149Stmm		printf "#define\tPADL_(t)\tPAD_(t)\n" > sysarg
16782149Stmm		printf "#define\tPADR_(t)\t0\n" > sysarg
16882149Stmm		printf "#endif\n\n" > sysarg
1691541Srgrimes
1701541Srgrimes		printf " * created from%s\n */\n\n", $0 > sysnames
171106149Sdwmalone		printf "const char *%s[] = {\n", namesname > sysnames
1721541Srgrimes
1731541Srgrimes		printf " * created from%s\n */\n\n", $0 > syshdr
1742700Swollman
17534354Sjb		printf "# created from%s\nMIASM = ", $0 > sysmk
17634354Sjb
177160942Sjb		printf " * This file is part of the DTrace syscall provider.\n */\n\n" > systrace
178209390Sed		printf "static void\nsystrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args)\n{\n" > systrace
179160942Sjb		printf "\tint64_t *iarg  = (int64_t *) uarg;\n" > systrace
180160942Sjb		printf "\tswitch (sysnum) {\n" > systrace
181160942Sjb
182177656Sjb		printf "static void\nsystrace_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)\n{\n\tconst char *p = NULL;\n" > systracetmp
183177656Sjb		printf "\tswitch (sysnum) {\n" > systracetmp
184177656Sjb
1851541Srgrimes		next
1861541Srgrimes	}
1871541Srgrimes	NF == 0 || $1 ~ /^;/ {
1881541Srgrimes		next
1891541Srgrimes	}
19011294Sswallace	$1 ~ /^#[ 	]*include/ {
19111294Sswallace		print > sysinc
19211294Sswallace		next
19311294Sswallace	}
1941541Srgrimes	$1 ~ /^#[ 	]*if/ {
1951541Srgrimes		print > sysent
1961541Srgrimes		print > sysdcl
19711294Sswallace		print > sysarg
1981541Srgrimes		print > syscompat
19999854Salfred		print > syscompat4
200171208Speter		print > syscompat6
201194833Sjhb		print > syscompat7
2021541Srgrimes		print > sysnames
2031541Srgrimes		savesyscall = syscall
2041541Srgrimes		next
2051541Srgrimes	}
2061541Srgrimes	$1 ~ /^#[ 	]*else/ {
2071541Srgrimes		print > sysent
2081541Srgrimes		print > sysdcl
20911294Sswallace		print > sysarg
2101541Srgrimes		print > syscompat
21199854Salfred		print > syscompat4
212171208Speter		print > syscompat6
213194833Sjhb		print > syscompat7
2141541Srgrimes		print > sysnames
2151541Srgrimes		syscall = savesyscall
2161541Srgrimes		next
2171541Srgrimes	}
2181541Srgrimes	$1 ~ /^#/ {
2191541Srgrimes		print > sysent
2201541Srgrimes		print > sysdcl
22111294Sswallace		print > sysarg
2221541Srgrimes		print > syscompat
22399854Salfred		print > syscompat4
224171208Speter		print > syscompat6
225194833Sjhb		print > syscompat7
2261541Srgrimes		print > sysnames
2271541Srgrimes		next
2281541Srgrimes	}
2291541Srgrimes	syscall != $1 {
23036770Sbde		printf "%s: line %d: syscall number out of sync at %d\n",
23136770Sbde		    infile, NR, syscall
2321541Srgrimes		printf "line is:\n"
2331541Srgrimes		print
2341541Srgrimes		exit 1
2351541Srgrimes	}
236194390Sjhb	# Returns true if the type "name" is the first flag in the type field
237194390Sjhb	function type(name, flags, n) {
238194390Sjhb		n = split($3, flags, /\|/)
239194390Sjhb		return (n > 0 && flags[1] == name)
240194390Sjhb	}
241194390Sjhb	# Returns true if the flag "name" is set in the type field
242194390Sjhb	function flag(name, flags, i, n) {
243194390Sjhb		n = split($3, flags, /\|/)
244194390Sjhb		for (i = 1; i <= n; i++)
245194390Sjhb			if (flags[i] == name)
246194390Sjhb				return 1
247194390Sjhb		return 0
248194390Sjhb	}
24960287Sbde	function align_sysent_comment(column) {
25060287Sbde		printf("\t") > sysent
25160287Sbde		column = column + 8 - column % 8
25260287Sbde		while (column < 56) {
25360287Sbde			printf("\t") > sysent
25460287Sbde			column = column + 8
25560287Sbde		}
25660287Sbde	}
25711294Sswallace	function parserr(was, wanted) {
25836770Sbde		printf "%s: line %d: unexpected %s (expected %s)\n",
25911294Sswallace		    infile, NR, was, wanted
26011294Sswallace		exit 1
26111294Sswallace	}
26211294Sswallace	function parseline() {
263146806Srwatson		f=4			# toss number, type, audit event
26411294Sswallace		argc= 0;
26560287Sbde		argssize = "0"
266209579Skib		thr_flag = "SY_THR_STATIC"
267209579Skib		if (flag("NOTSTATIC")) {
268209579Skib			thr_flag = "SY_THR_ABSENT"
269209579Skib		}
27011294Sswallace		if ($NF != "}") {
27111294Sswallace			funcalias=$(NF-2)
27211294Sswallace			argalias=$(NF-1)
27311294Sswallace			rettype=$NF
27411294Sswallace			end=NF-3
27511294Sswallace		} else {
27611294Sswallace			funcalias=""
27711294Sswallace			argalias=""
27811294Sswallace			rettype="int"
27911294Sswallace			end=NF
28010905Sbde		}
281194390Sjhb		if (flag("NODEF")) {
282146806Srwatson			auditev="AUE_NULL"
283146806Srwatson			funcname=$4
284146806Srwatson			argssize = "AS(" $6 ")"
28511294Sswallace			return
28611294Sswallace		}
28711294Sswallace		if ($f != "{")
28811294Sswallace			parserr($f, "{")
28911294Sswallace		f++
29011294Sswallace		if ($end != "}")
29111294Sswallace			parserr($end, "}")
29211294Sswallace		end--
29311294Sswallace		if ($end != ";")
29411294Sswallace			parserr($end, ";")
29511294Sswallace		end--
29611294Sswallace		if ($end != ")")
29711294Sswallace			parserr($end, ")")
29811294Sswallace		end--
29911294Sswallace
30011294Sswallace		f++	#function return type
30111294Sswallace
30211294Sswallace		funcname=$f
303219131Srwatson
304219131Srwatson		#
305219131Srwatson		# We now know the func name, so define a flags field for it.
306219131Srwatson		# Do this before any other processing as we may return early
307219131Srwatson		# from it.
308219131Srwatson		#
309219131Srwatson		for (cap in capenabled) {
310219131Srwatson			if (funcname == capenabled[cap]) {
311219131Srwatson				flags = "SYF_CAPENABLED";
312219131Srwatson			}
313219131Srwatson		}
314219131Srwatson
31511294Sswallace		if (funcalias == "")
31611294Sswallace			funcalias = funcname
31711294Sswallace		if (argalias == "") {
31811294Sswallace			argalias = funcname "_args"
319194390Sjhb			if (flag("COMPAT"))
32011330Sswallace				argalias = "o" argalias
321194390Sjhb			if (flag("COMPAT4"))
32299854Salfred				argalias = "freebsd4_" argalias
323194390Sjhb			if (flag("COMPAT6"))
324171208Speter				argalias = "freebsd6_" argalias
325194833Sjhb			if (flag("COMPAT7"))
326194833Sjhb				argalias = "freebsd7_" argalias
32711294Sswallace		}
32811294Sswallace		f++
32911294Sswallace
33011294Sswallace		if ($f != "(")
33111294Sswallace			parserr($f, ")")
33211294Sswallace		f++
33311294Sswallace
33411294Sswallace		if (f == end) {
33511294Sswallace			if ($f != "void")
33611294Sswallace				parserr($f, "argument definition")
33711294Sswallace			return
33811294Sswallace		}
33911294Sswallace
34011294Sswallace		while (f <= end) {
34111294Sswallace			argc++
34211294Sswallace			argtype[argc]=""
34311294Sswallace			oldf=""
34411294Sswallace			while (f < end && $(f+1) != ",") {
34511294Sswallace				if (argtype[argc] != "" && oldf != "*")
34611294Sswallace					argtype[argc] = argtype[argc]" ";
34711294Sswallace				argtype[argc] = argtype[argc]$f;
34811294Sswallace				oldf = $f;
34911294Sswallace				f++
35011294Sswallace			}
35111294Sswallace			if (argtype[argc] == "")
35211294Sswallace				parserr($f, "argument definition")
35311294Sswallace			argname[argc]=$f;
35411294Sswallace			f += 2;			# skip name, and any comma
35511294Sswallace		}
35660287Sbde		if (argc != 0)
35760287Sbde			argssize = "AS(" argalias ")"
3581541Srgrimes	}
359146806Srwatson	{	comment = $4
360146806Srwatson		if (NF < 7)
361146806Srwatson			for (i = 5; i <= NF; i++)
36211294Sswallace				comment = comment " " $i
36311294Sswallace	}
36482585Sdillon
365146806Srwatson	#
366146806Srwatson	# The AUE_ audit event identifier.
367146806Srwatson	#
368146806Srwatson	{
369146806Srwatson		auditev = $2;
370146806Srwatson	}
371146806Srwatson
372193234Srwatson	#
373219131Srwatson	# The flags, if any.
374193234Srwatson	#
375193234Srwatson	{
376193234Srwatson		flags = "0";
377193234Srwatson	}
378193234Srwatson
379194390Sjhb	type("STD") || type("NODEF") || type("NOARGS") || type("NOPROTO") \
380194390Sjhb	    || type("NOSTD") {
38111294Sswallace		parseline()
382160942Sjb		printf("\t/* %s */\n\tcase %d: {\n", funcname, syscall) > systrace
383177656Sjb		printf("\t/* %s */\n\tcase %d:\n", funcname, syscall) > systracetmp
384160942Sjb		if (argc > 0) {
385177656Sjb			printf("\t\tswitch(ndx) {\n") > systracetmp
386160942Sjb			printf("\t\tstruct %s *p = params;\n", argalias) > systrace
387160942Sjb			for (i = 1; i <= argc; i++) {
388177656Sjb				printf("\t\tcase %d:\n\t\t\tp = \"%s\";\n\t\t\tbreak;\n", i - 1, argtype[i]) > systracetmp
389160942Sjb				if (index(argtype[i], "*") > 0 || argtype[i] == "caddr_t")
390160942Sjb					printf("\t\tuarg[%d] = (intptr_t) p->%s; /* %s */\n", \
391160942Sjb					     i - 1, \
392160942Sjb					     argname[i], argtype[i]) > systrace
393160942Sjb				else if (substr(argtype[i], 1, 1) == "u" || argtype[i] == "size_t")
394160942Sjb					printf("\t\tuarg[%d] = p->%s; /* %s */\n", \
395160942Sjb					     i - 1, \
396160942Sjb					     argname[i], argtype[i]) > systrace
397160942Sjb				else
398160942Sjb					printf("\t\tiarg[%d] = p->%s; /* %s */\n", \
399160942Sjb					     i - 1, \
400160942Sjb					     argname[i], argtype[i]) > systrace
401160942Sjb			}
402177656Sjb			printf("\t\tdefault:\n\t\t\tbreak;\n\t\t};\n") > systracetmp
403160942Sjb		}
404160942Sjb		printf("\t\t*n_args = %d;\n\t\tbreak;\n\t}\n", argc) > systrace
405177656Sjb		printf("\t\tbreak;\n") > systracetmp
406194390Sjhb		if (argc != 0 && !flag("NOARGS") && !flag("NOPROTO") && \
407194390Sjhb		    !flag("NODEF")) {
408183361Sjhb			printf("struct %s {\n", argalias) > sysarg
409183361Sjhb			for (i = 1; i <= argc; i++)
410183361Sjhb				printf("\tchar %s_l_[PADL_(%s)]; " \
411183361Sjhb				    "%s %s; char %s_r_[PADR_(%s)];\n",
412183361Sjhb				    argname[i], argtype[i],
413183361Sjhb				    argtype[i], argname[i],
414183361Sjhb				    argname[i], argtype[i]) > sysarg
415183361Sjhb			printf("};\n") > sysarg
41610905Sbde		}
417194390Sjhb		else if (!flag("NOARGS") && !flag("NOPROTO") && !flag("NODEF"))
418183361Sjhb			printf("struct %s {\n\tregister_t dummy;\n};\n",
419183361Sjhb			    argalias) > sysarg
420194390Sjhb		if (!flag("NOPROTO") && !flag("NODEF")) {
42192721Salfred			printf("%s\t%s(struct thread *, struct %s *)",
42218277Sbde			    rettype, funcname, argalias) > sysdcl
42318277Sbde			printf(";\n") > sysdcl
424161327Sjhb			printf("#define\t%sAUE_%s\t%s\n", syscallprefix,
425161327Sjhb			    funcalias, auditev) > sysaue
42611330Sswallace		}
427160798Sjhb		printf("\t{ %s, (sy_call_t *)", argssize) > sysent
428160798Sjhb		column = 8 + 2 + length(argssize) + 15
429194390Sjhb		if (flag("NOSTD")) {
430209579Skib			printf("%s },", "lkmressys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT") > sysent
431193234Srwatson			column = column + length("lkmressys") + length("AUE_NULL") + 3
43269445Salfred		} else {
433209579Skib			printf("%s, %s, NULL, 0, 0, %s, %s },", funcname, auditev, flags, thr_flag) > sysent
434193234Srwatson			column = column + length(funcname) + length(auditev) + length(flags) + 3
43569445Salfred		} 
43660287Sbde		align_sysent_comment(column)
43758963Salfred		printf("/* %d = %s */\n", syscall, funcalias) > sysent
43836770Sbde		printf("\t\"%s\",\t\t\t/* %d = %s */\n",
43911294Sswallace		    funcalias, syscall, funcalias) > sysnames
440194390Sjhb		if (!flag("NODEF")) {
44136770Sbde			printf("#define\t%s%s\t%d\n", syscallprefix,
44211294Sswallace		    	    funcalias, syscall) > syshdr
44334354Sjb			printf(" \\\n\t%s.o", funcalias) > sysmk
44434354Sjb		}
4451541Srgrimes		syscall++
4461541Srgrimes		next
4471541Srgrimes	}
448194833Sjhb	type("COMPAT") || type("COMPAT4") || type("COMPAT6") || \
449194833Sjhb	    type("COMPAT7") {
450194390Sjhb		if (flag("COMPAT")) {
45199854Salfred			ncompat++
45299854Salfred			out = syscompat
45399854Salfred			outdcl = syscompatdcl
45499854Salfred			wrap = "compat"
45599854Salfred			prefix = "o"
456194390Sjhb			descr = "old"
457194390Sjhb		} else if (flag("COMPAT4")) {
45899854Salfred			ncompat4++
45999854Salfred			out = syscompat4
46099854Salfred			outdcl = syscompat4dcl
46199854Salfred			wrap = "compat4"
46299854Salfred			prefix = "freebsd4_"
463194390Sjhb			descr = "freebsd4"
464194390Sjhb		} else if (flag("COMPAT6")) {
465171208Speter			ncompat6++
466171208Speter			out = syscompat6
467171208Speter			outdcl = syscompat6dcl
468171208Speter			wrap = "compat6"
469171208Speter			prefix = "freebsd6_"
470194390Sjhb			descr = "freebsd6"
471194833Sjhb		} else if (flag("COMPAT7")) {
472194833Sjhb			ncompat7++
473194833Sjhb			out = syscompat7
474194833Sjhb			outdcl = syscompat7dcl
475194833Sjhb			wrap = "compat7"
476194833Sjhb			prefix = "freebsd7_"
477194833Sjhb			descr = "freebsd7"
47899854Salfred		}
47911294Sswallace		parseline()
480194390Sjhb		if (argc != 0 && !flag("NOARGS") && !flag("NOPROTO") && \
481194390Sjhb		    !flag("NODEF")) {
48299854Salfred			printf("struct %s {\n", argalias) > out
48311294Sswallace			for (i = 1; i <= argc; i++)
48482149Stmm				printf("\tchar %s_l_[PADL_(%s)]; %s %s; " \
48582149Stmm				    "char %s_r_[PADR_(%s)];\n",
48682149Stmm				    argname[i], argtype[i],
48736735Sdfr				    argtype[i], argname[i],
48899854Salfred				    argname[i], argtype[i]) > out
48999854Salfred			printf("};\n") > out
49011294Sswallace		}
491194390Sjhb		else if (!flag("NOARGS") && !flag("NOPROTO") && !flag("NODEF"))
49283046Sobrien			printf("struct %s {\n\tregister_t dummy;\n};\n",
49336770Sbde			    argalias) > sysarg
494194390Sjhb		if (!flag("NOPROTO") && !flag("NODEF")) {
495194390Sjhb			printf("%s\t%s%s(struct thread *, struct %s *);\n",
496194390Sjhb			    rettype, prefix, funcname, argalias) > outdcl
497194646Sjhb			printf("#define\t%sAUE_%s%s\t%s\n", syscallprefix,
498194646Sjhb			    prefix, funcname, auditev) > sysaue
499194390Sjhb		}
500194390Sjhb		if (flag("NOSTD")) {
501209579Skib			printf("\t{ %s, (sy_call_t *)%s, %s, NULL, 0, 0, 0, SY_THR_ABSENT },",
502194390Sjhb			    "0", "lkmressys", "AUE_NULL") > sysent
503194390Sjhb			align_sysent_comment(8 + 2 + length("0") + 15 + \
504194390Sjhb			    length("lkmressys") + length("AUE_NULL") + 3)
505194390Sjhb		} else {
506209579Skib			printf("\t{ %s(%s,%s), %s, NULL, 0, 0, %s, %s },",
507209579Skib			    wrap, argssize, funcname, auditev, flags, thr_flag) > sysent
508194390Sjhb			align_sysent_comment(8 + 9 + length(argssize) + 1 + \
509194390Sjhb			    length(funcname) + length(auditev) + \
510194390Sjhb			    length(flags) + 4)
511194390Sjhb		}
512194390Sjhb		printf("/* %d = %s %s */\n", syscall, descr, funcalias) > sysent
513194390Sjhb		printf("\t\"%s.%s\",\t\t/* %d = %s %s */\n",
514194390Sjhb		    wrap, funcalias, syscall, descr, funcalias) > sysnames
515194390Sjhb		if (flag("COMPAT")) {
516171208Speter			printf("\t\t\t\t/* %d is old %s */\n",
517171208Speter			    syscall, funcalias) > syshdr
518194390Sjhb		} else if (!flag("NODEF")) {
519171208Speter			printf("#define\t%s%s%s\t%d\n", syscallprefix,
520171208Speter			    prefix, funcalias, syscall) > syshdr
521171208Speter			printf(" \\\n\t%s%s.o", prefix, funcalias) > sysmk
522171208Speter		}
5231541Srgrimes		syscall++
5241541Srgrimes		next
5251541Srgrimes	}
526194390Sjhb	type("OBSOL") {
527209579Skib		printf("\t{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT },") > sysent
52860287Sbde		align_sysent_comment(34)
52960287Sbde		printf("/* %d = obsolete %s */\n", syscall, comment) > sysent
53036770Sbde		printf("\t\"obs_%s\",\t\t\t/* %d = obsolete %s */\n",
531146806Srwatson		    $4, syscall, comment) > sysnames
53236770Sbde		printf("\t\t\t\t/* %d is obsolete %s */\n",
5331541Srgrimes		    syscall, comment) > syshdr
5341541Srgrimes		syscall++
5351541Srgrimes		next
5361541Srgrimes	}
537194390Sjhb	type("UNIMPL") {
538209579Skib		printf("\t{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT },\t\t\t/* %d = %s */\n",
5391541Srgrimes		    syscall, comment) > sysent
54036770Sbde		printf("\t\"#%d\",\t\t\t/* %d = %s */\n",
5411541Srgrimes		    syscall, syscall, comment) > sysnames
5421541Srgrimes		syscall++
5431541Srgrimes		next
5441541Srgrimes	}
5451541Srgrimes	{
546146806Srwatson		printf "%s: line %d: unrecognized keyword %s\n", infile, NR, $3
5471541Srgrimes		exit 1
5481541Srgrimes	}
5491541Srgrimes	END {
55060287Sbde		printf "\n#define AS(name) (sizeof(struct name) / sizeof(register_t))\n" > sysinc
55199854Salfred
552194833Sjhb		if (ncompat != 0 || ncompat4 != 0 || ncompat6 != 0 || ncompat7 != 0)
55399854Salfred			printf "#include \"opt_compat.h\"\n\n" > syssw
55499854Salfred
55536782Sbde		if (ncompat != 0) {
55636782Sbde			printf "\n#ifdef %s\n", compat > sysinc
55736782Sbde			printf "#define compat(n, name) n, (sy_call_t *)__CONCAT(o,name)\n" > sysinc
55836782Sbde			printf "#else\n" > sysinc
55936782Sbde			printf "#define compat(n, name) 0, (sy_call_t *)nosys\n" > sysinc
56036782Sbde			printf "#endif\n" > sysinc
56136782Sbde		}
56236782Sbde
56399854Salfred		if (ncompat4 != 0) {
56499854Salfred			printf "\n#ifdef %s\n", compat4 > sysinc
56599854Salfred			printf "#define compat4(n, name) n, (sy_call_t *)__CONCAT(freebsd4_,name)\n" > sysinc
56699854Salfred			printf "#else\n" > sysinc
56799854Salfred			printf "#define compat4(n, name) 0, (sy_call_t *)nosys\n" > sysinc
56899854Salfred			printf "#endif\n" > sysinc
56999854Salfred		}
57099854Salfred
571171208Speter		if (ncompat6 != 0) {
572171208Speter			printf "\n#ifdef %s\n", compat6 > sysinc
573171208Speter			printf "#define compat6(n, name) n, (sy_call_t *)__CONCAT(freebsd6_,name)\n" > sysinc
574171208Speter			printf "#else\n" > sysinc
575171208Speter			printf "#define compat6(n, name) 0, (sy_call_t *)nosys\n" > sysinc
576171208Speter			printf "#endif\n" > sysinc
577171208Speter		}
578171208Speter
579194833Sjhb		if (ncompat7 != 0) {
580194833Sjhb			printf "\n#ifdef %s\n", compat7 > sysinc
581194833Sjhb			printf "#define compat7(n, name) n, (sy_call_t *)__CONCAT(freebsd7_,name)\n" > sysinc
582194833Sjhb			printf "#else\n" > sysinc
583194833Sjhb			printf "#define compat7(n, name) 0, (sy_call_t *)nosys\n" > sysinc
584194833Sjhb			printf "#endif\n" > sysinc
585194833Sjhb		}
586194833Sjhb
58736735Sdfr		printf("\n#endif /* %s */\n\n", compat) > syscompatdcl
58899854Salfred		printf("\n#endif /* %s */\n\n", compat4) > syscompat4dcl
589171208Speter		printf("\n#endif /* %s */\n\n", compat6) > syscompat6dcl
590194833Sjhb		printf("\n#endif /* %s */\n\n", compat7) > syscompat7dcl
59199854Salfred
592161327Sjhb		printf("\n#undef PAD_\n") > sysprotoend
59399854Salfred		printf("#undef PADL_\n") > sysprotoend
59499854Salfred		printf("#undef PADR_\n") > sysprotoend
59599854Salfred		printf("\n#endif /* !%s */\n", sysproto_h) > sysprotoend
59699854Salfred
59737227Sphk		printf("\n") > sysmk
59814331Speter		printf("};\n") > sysent
5991541Srgrimes		printf("};\n") > sysnames
60011294Sswallace		printf("#define\t%sMAXSYSCALL\t%d\n", syscallprefix, syscall) \
60136770Sbde		    > syshdr
602160942Sjb		printf "\tdefault:\n\t\t*n_args = 0;\n\t\tbreak;\n\t};\n}\n" > systrace
603177656Sjb		printf "\tdefault:\n\t\tbreak;\n\t};\n\tif (p != NULL)\n\t\tstrlcpy(desc, p, descsz);\n}\n" > systracetmp
6041541Srgrimes	} '
6051541Srgrimes
60636782Sbdecat $sysinc $sysent >> $syssw
60799854Salfredcat $sysarg $sysdcl \
60899854Salfred	$syscompat $syscompatdcl \
60999854Salfred	$syscompat4 $syscompat4dcl \
610171208Speter	$syscompat6 $syscompat6dcl \
611194833Sjhb	$syscompat7 $syscompat7dcl \
612161327Sjhb	$sysaue $sysprotoend > $sysproto
613177656Sjbcat $systracetmp >> $systrace
61499854Salfred
615