makesyscalls.sh revision 318164
1125410Sgrehan#! /bin/sh -
2125410Sgrehan#	@(#)makesyscalls.sh	8.1 (Berkeley) 6/10/93
3125410Sgrehan# $FreeBSD: stable/10/sys/kern/makesyscalls.sh 318164 2017-05-10 23:09:17Z jhb $
4125410Sgrehan
5125410Sgrehanset -e
6125410Sgrehan
7125410Sgrehan# name of compat options:
8125410Sgrehancompat=COMPAT_43
9125410Sgrehancompat4=COMPAT_FREEBSD4
10125410Sgrehancompat6=COMPAT_FREEBSD6
11125410Sgrehancompat7=COMPAT_FREEBSD7
12125410Sgrehan
13125410Sgrehan# output files:
14125410Sgrehansysnames="syscalls.c"
15125410Sgrehansysproto="../sys/sysproto.h"
16125410Sgrehansysproto_h=_SYS_SYSPROTO_H_
17125410Sgrehansyshdr="../sys/syscall.h"
18199243Sedsysmk="../sys/syscall.mk"
19220154Sedsyssw="init_sysent.c"
20220154Sedsyscallprefix="SYS_"
21125410Sgrehanswitchname="sysent"
22125410Sgrehannamesname="syscallnames"
23125410Sgrehansystrace="systrace_args.c"
24125410Sgrehan
25125410Sgrehan# tmp files:
26125410Sgrehansysaue="sysent.aue.$$"
27125410Sgrehansysdcl="sysent.dcl.$$"
28125410Sgrehansyscompat="sysent.compat.$$"
29125410Sgrehansyscompatdcl="sysent.compatdcl.$$"
30125410Sgrehansyscompat4="sysent.compat4.$$"
31125410Sgrehansyscompat4dcl="sysent.compat4dcl.$$"
32199243Sedsyscompat6="sysent.compat6.$$"
33125410Sgrehansyscompat6dcl="sysent.compat6dcl.$$"
34199243Sedsyscompat7="sysent.compat7.$$"
35199243Sedsyscompat7dcl="sysent.compat7dcl.$$"
36199243Sedsysent="sysent.switch.$$"
37199243Sedsysinc="sysinc.switch.$$"
38199243Sedsysarg="sysarg.switch.$$"
39199243Sedsysprotoend="sysprotoend.$$"
40199243Sedsystracetmp="systrace.$$"
41170088Sdougbsystraceret="systraceret.$$"
42125410Sgrehan
43125410Sgrehanif [ -r capabilities.conf ]; then
44290107Sgjb	capenabled=`cat capabilities.conf | grep -v "^#" | grep -v "^$"`
45290107Sgjb	capenabled=`echo $capenabled | sed 's/ /,/g'`
46290107Sgjbelse
47290107Sgjb	capenabled=""
48125410Sgrehanfi
49125410Sgrehan
50trap "rm $sysaue $sysdcl $syscompat $syscompatdcl $syscompat4 $syscompat4dcl $syscompat6 $syscompat6dcl $syscompat7 $syscompat7dcl $sysent $sysinc $sysarg $sysprotoend $systracetmp $systraceret" 0
51
52touch $sysaue $sysdcl $syscompat $syscompatdcl $syscompat4 $syscompat4dcl $syscompat6 $syscompat6dcl $syscompat7 $syscompat7dcl $sysent $sysinc $sysarg $sysprotoend $systracetmp $systraceret
53
54case $# in
55    0)	echo "usage: $0 input-file <config-file>" 1>&2
56	exit 1
57	;;
58esac
59
60if [ -n "$2" ]; then
61	. $2
62fi
63
64sed -e '
65:join
66	/\\$/{a\
67
68	N
69	s/\\\n//
70	b join
71	}
722,${
73	/^#/!s/\([{}()*,]\)/ \1 /g
74}
75' < $1 | awk "
76	BEGIN {
77		sysaue = \"$sysaue\"
78		sysdcl = \"$sysdcl\"
79		sysproto = \"$sysproto\"
80		sysprotoend = \"$sysprotoend\"
81		sysproto_h = \"$sysproto_h\"
82		syscompat = \"$syscompat\"
83		syscompatdcl = \"$syscompatdcl\"
84		syscompat4 = \"$syscompat4\"
85		syscompat4dcl = \"$syscompat4dcl\"
86		syscompat6 = \"$syscompat6\"
87		syscompat6dcl = \"$syscompat6dcl\"
88		syscompat7 = \"$syscompat7\"
89		syscompat7dcl = \"$syscompat7dcl\"
90		sysent = \"$sysent\"
91		syssw = \"$syssw\"
92		sysinc = \"$sysinc\"
93		sysarg = \"$sysarg\"
94		sysnames = \"$sysnames\"
95		syshdr = \"$syshdr\"
96		sysmk = \"$sysmk\"
97		systrace = \"$systrace\"
98		systracetmp = \"$systracetmp\"
99		systraceret = \"$systraceret\"
100		compat = \"$compat\"
101		compat4 = \"$compat4\"
102		compat6 = \"$compat6\"
103		compat7 = \"$compat7\"
104		syscallprefix = \"$syscallprefix\"
105		switchname = \"$switchname\"
106		namesname = \"$namesname\"
107		infile = \"$1\"
108		capenabled_string = \"$capenabled\"
109		"'
110
111		split(capenabled_string, capenabled, ",");
112
113		printf "/*\n * System call switch table.\n *\n" > syssw
114		printf " * DO NOT EDIT-- this file is automatically generated.\n" > syssw
115		printf " * $%s$\n", "FreeBSD" > syssw
116		printf " */\n\n" > syssw
117
118		printf "/*\n * System call prototypes.\n *\n" > sysarg
119		printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysarg
120		printf " * $%s$\n", "FreeBSD" > sysarg
121		printf " */\n\n" > sysarg
122
123		printf "\n#ifdef %s\n\n", compat > syscompat
124		printf "\n#ifdef %s\n\n", compat4 > syscompat4
125		printf "\n#ifdef %s\n\n", compat6 > syscompat6
126		printf "\n#ifdef %s\n\n", compat7 > syscompat7
127
128		printf "/*\n * System call names.\n *\n" > sysnames
129		printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysnames
130		printf " * $%s$\n", "FreeBSD" > sysnames
131		printf " */\n\n" > sysnames
132
133		printf "/*\n * System call numbers.\n *\n" > syshdr
134		printf " * DO NOT EDIT-- this file is automatically generated.\n" > syshdr
135		printf " * $%s$\n", "FreeBSD" > syshdr
136		printf " */\n\n" > syshdr
137
138		printf "# FreeBSD system call object files.\n" > sysmk
139		printf "# DO NOT EDIT-- this file is automatically generated.\n" > sysmk
140		printf "# $%s$\n", "FreeBSD" > sysmk
141
142		printf "/*\n * System call argument to DTrace register array converstion.\n *\n" > systrace
143		printf " * DO NOT EDIT-- this file is automatically generated.\n" > systrace
144		printf " * $%s$\n", "FreeBSD" > systrace
145	}
146	NR == 1 {
147		printf "\n/* The casts are bogus but will do for now. */\n" > sysent
148		printf "struct sysent %s[] = {\n",switchname > sysent
149
150		printf "#ifndef %s\n", sysproto_h > sysarg
151		printf "#define\t%s\n\n", sysproto_h > sysarg
152		printf "#include <sys/signal.h>\n" > sysarg
153		printf "#include <sys/acl.h>\n" > sysarg
154		printf "#include <sys/cpuset.h>\n" > sysarg
155		printf "#include <sys/_ffcounter.h>\n" > sysarg
156		printf "#include <sys/_semaphore.h>\n" > sysarg
157		printf "#include <sys/ucontext.h>\n" > sysarg
158		printf "#include <sys/wait.h>\n\n" > sysarg
159		printf "#include <bsm/audit_kevents.h>\n\n" > sysarg
160		printf "struct proc;\n\n" > sysarg
161		printf "struct thread;\n\n" > sysarg
162		printf "#define\tPAD_(t)\t(sizeof(register_t) <= sizeof(t) ? \\\n" > sysarg
163		printf "\t\t0 : sizeof(register_t) - sizeof(t))\n\n" > sysarg
164		printf "#if BYTE_ORDER == LITTLE_ENDIAN\n"> sysarg
165		printf "#define\tPADL_(t)\t0\n" > sysarg
166		printf "#define\tPADR_(t)\tPAD_(t)\n" > sysarg
167		printf "#else\n" > sysarg
168		printf "#define\tPADL_(t)\tPAD_(t)\n" > sysarg
169		printf "#define\tPADR_(t)\t0\n" > sysarg
170		printf "#endif\n\n" > sysarg
171
172		printf "const char *%s[] = {\n", namesname > sysnames
173
174		printf "MIASM = " > sysmk
175
176		printf " * This file is part of the DTrace syscall provider.\n */\n\n" > systrace
177		printf "static void\nsystrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args)\n{\n" > systrace
178		printf "\tint64_t *iarg  = (int64_t *) uarg;\n" > systrace
179		printf "\tswitch (sysnum) {\n" > systrace
180
181		printf "static void\nsystrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)\n{\n\tconst char *p = NULL;\n" > systracetmp
182		printf "\tswitch (sysnum) {\n" > systracetmp
183
184		printf "static void\nsystrace_return_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)\n{\n\tconst char *p = NULL;\n" > systraceret
185		printf "\tswitch (sysnum) {\n" > systraceret
186
187		next
188	}
189	NF == 0 || $1 ~ /^;/ {
190		next
191	}
192	$1 ~ /^#[ 	]*include/ {
193		print > sysinc
194		next
195	}
196	$1 ~ /^#[ 	]*if/ {
197		print > sysent
198		print > sysdcl
199		print > sysarg
200		print > syscompat
201		print > syscompat4
202		print > syscompat6
203		print > syscompat7
204		print > sysnames
205		print > systrace
206		print > systracetmp
207		print > systraceret
208		savesyscall = syscall
209		next
210	}
211	$1 ~ /^#[ 	]*else/ {
212		print > sysent
213		print > sysdcl
214		print > sysarg
215		print > syscompat
216		print > syscompat4
217		print > syscompat6
218		print > syscompat7
219		print > sysnames
220		print > systrace
221		print > systracetmp
222		print > systraceret
223		syscall = savesyscall
224		next
225	}
226	$1 ~ /^#/ {
227		print > sysent
228		print > sysdcl
229		print > sysarg
230		print > syscompat
231		print > syscompat4
232		print > syscompat6
233		print > syscompat7
234		print > sysnames
235		print > systrace
236		print > systracetmp
237		print > systraceret
238		next
239	}
240	syscall != $1 {
241		printf "%s: line %d: syscall number out of sync at %d\n",
242		    infile, NR, syscall
243		printf "line is:\n"
244		print
245		exit 1
246	}
247	# Returns true if the type "name" is the first flag in the type field
248	function type(name, flags, n) {
249		n = split($3, flags, /\|/)
250		return (n > 0 && flags[1] == name)
251	}
252	# Returns true if the flag "name" is set in the type field
253	function flag(name, flags, i, n) {
254		n = split($3, flags, /\|/)
255		for (i = 1; i <= n; i++)
256			if (flags[i] == name)
257				return 1
258		return 0
259	}
260	function align_sysent_comment(column) {
261		printf("\t") > sysent
262		column = column + 8 - column % 8
263		while (column < 56) {
264			printf("\t") > sysent
265			column = column + 8
266		}
267	}
268	function parserr(was, wanted) {
269		printf "%s: line %d: unexpected %s (expected %s)\n",
270		    infile, NR, was, wanted
271		exit 1
272	}
273	function parseline() {
274		f=4			# toss number, type, audit event
275		argc= 0;
276		argssize = "0"
277		thr_flag = "SY_THR_STATIC"
278		if (flag("NOTSTATIC")) {
279			thr_flag = "SY_THR_ABSENT"
280		}
281		if ($NF != "}") {
282			funcalias=$(NF-2)
283			argalias=$(NF-1)
284			rettype=$NF
285			end=NF-3
286		} else {
287			funcalias=""
288			argalias=""
289			rettype="int"
290			end=NF
291		}
292		if (flag("NODEF")) {
293			auditev="AUE_NULL"
294			funcname=$4
295			argssize = "AS(" $6 ")"
296			return
297		}
298		if ($f != "{")
299			parserr($f, "{")
300		f++
301		if ($end != "}")
302			parserr($end, "}")
303		end--
304		if ($end != ";")
305			parserr($end, ";")
306		end--
307		if ($end != ")")
308			parserr($end, ")")
309		end--
310
311		syscallret=$f
312		f++
313
314		funcname=$f
315
316		#
317		# We now know the func name, so define a flags field for it.
318		# Do this before any other processing as we may return early
319		# from it.
320		#
321		for (cap in capenabled) {
322			if (funcname == capenabled[cap]) {
323				flags = "SYF_CAPENABLED";
324			}
325		}
326
327		if (funcalias == "")
328			funcalias = funcname
329		if (argalias == "") {
330			argalias = funcname "_args"
331			if (flag("COMPAT"))
332				argalias = "o" argalias
333			if (flag("COMPAT4"))
334				argalias = "freebsd4_" argalias
335			if (flag("COMPAT6"))
336				argalias = "freebsd6_" argalias
337			if (flag("COMPAT7"))
338				argalias = "freebsd7_" argalias
339		}
340		f++
341
342		if ($f != "(")
343			parserr($f, ")")
344		f++
345
346		if (f == end) {
347			if ($f != "void")
348				parserr($f, "argument definition")
349			return
350		}
351
352		while (f <= end) {
353			argc++
354			argtype[argc]=""
355			oldf=""
356			while (f < end && $(f+1) != ",") {
357				if (argtype[argc] != "" && oldf != "*")
358					argtype[argc] = argtype[argc]" ";
359				argtype[argc] = argtype[argc]$f;
360				oldf = $f;
361				f++
362			}
363			if (argtype[argc] == "")
364				parserr($f, "argument definition")
365			argname[argc]=$f;
366			f += 2;			# skip name, and any comma
367		}
368		if (argc != 0)
369			argssize = "AS(" argalias ")"
370	}
371	{	comment = $4
372		if (NF < 7)
373			for (i = 5; i <= NF; i++)
374				comment = comment " " $i
375	}
376
377	#
378	# The AUE_ audit event identifier.
379	#
380	{
381		auditev = $2;
382	}
383
384	#
385	# The flags, if any.
386	#
387	{
388		flags = "0";
389	}
390
391	type("STD") || type("NODEF") || type("NOARGS") || type("NOPROTO") \
392	    || type("NOSTD") {
393		parseline()
394		printf("\t/* %s */\n\tcase %d: {\n", funcname, syscall) > systrace
395		printf("\t/* %s */\n\tcase %d:\n", funcname, syscall) > systracetmp
396		printf("\t/* %s */\n\tcase %d:\n", funcname, syscall) > systraceret
397		if (argc > 0) {
398			printf("\t\tswitch(ndx) {\n") > systracetmp
399			printf("\t\tstruct %s *p = params;\n", argalias) > systrace
400			for (i = 1; i <= argc; i++) {
401				arg = argtype[i]
402				sub("__restrict$", "", arg)
403				printf("\t\tcase %d:\n\t\t\tp = \"%s\";\n\t\t\tbreak;\n", i - 1, arg) > systracetmp
404				if (index(arg, "*") > 0 || arg == "caddr_t")
405					printf("\t\tuarg[%d] = (intptr_t) p->%s; /* %s */\n", \
406					     i - 1, \
407					     argname[i], arg) > systrace
408				else if (arg == "union l_semun")
409					printf("\t\tuarg[%d] = p->%s.buf; /* %s */\n", \
410					     i - 1, \
411					     argname[i], arg) > systrace
412				else if (substr(arg, 1, 1) == "u" || arg == "size_t")
413					printf("\t\tuarg[%d] = p->%s; /* %s */\n", \
414					     i - 1, \
415					     argname[i], arg) > systrace
416				else
417					printf("\t\tiarg[%d] = p->%s; /* %s */\n", \
418					     i - 1, \
419					     argname[i], arg) > systrace
420			}
421			printf("\t\tdefault:\n\t\t\tbreak;\n\t\t};\n") > systracetmp
422
423			printf("\t\tif (ndx == 0 || ndx == 1)\n") > systraceret
424			printf("\t\t\tp = \"%s\";\n", syscallret) > systraceret
425			printf("\t\tbreak;\n") > systraceret
426		}
427		printf("\t\t*n_args = %d;\n\t\tbreak;\n\t}\n", argc) > systrace
428		printf("\t\tbreak;\n") > systracetmp
429		if (argc != 0 && !flag("NOARGS") && !flag("NOPROTO") && \
430		    !flag("NODEF")) {
431			printf("struct %s {\n", argalias) > sysarg
432			for (i = 1; i <= argc; i++)
433				printf("\tchar %s_l_[PADL_(%s)]; " \
434				    "%s %s; char %s_r_[PADR_(%s)];\n",
435				    argname[i], argtype[i],
436				    argtype[i], argname[i],
437				    argname[i], argtype[i]) > sysarg
438			printf("};\n") > sysarg
439		}
440		else if (!flag("NOARGS") && !flag("NOPROTO") && !flag("NODEF"))
441			printf("struct %s {\n\tregister_t dummy;\n};\n",
442			    argalias) > sysarg
443		if (!flag("NOPROTO") && !flag("NODEF")) {
444			if (funcname == "nosys" || funcname == "lkmnosys" ||
445			    funcname == "sysarch" || funcname ~ /^freebsd/ || 
446			    funcname ~ /^linux/ || funcname ~ /^svr4/ || 
447			    funcname ~ /^ibcs2/ || funcname ~ /^xenix/) {				
448				printf("%s\t%s(struct thread *, struct %s *)",
449				    rettype, funcname, argalias) > sysdcl
450			} else {
451				printf("%s\tsys_%s(struct thread *, struct %s *)",
452				    rettype, funcname, argalias) > sysdcl
453			} 
454			printf(";\n") > sysdcl
455			printf("#define\t%sAUE_%s\t%s\n", syscallprefix,
456			    funcalias, auditev) > sysaue
457		}
458		printf("\t{ %s, (sy_call_t *)", argssize) > sysent
459		column = 8 + 2 + length(argssize) + 15
460		if (flag("NOSTD")) {
461			printf("lkmressys, AUE_NULL, NULL, 0, 0, %s, SY_THR_ABSENT },", flags) > sysent
462			column = column + length("lkmressys") + length("AUE_NULL") + 3
463		} else {
464			if (funcname == "nosys" || funcname == "sysarch" || 
465			    funcname == "lkmnosys" || funcname ~ /^freebsd/ ||
466			    funcname ~ /^linux/ || funcname ~ /^svr4/ ||
467			    funcname ~ /^ibcs2/ || funcname ~ /^xenix/) {
468				printf("%s, %s, NULL, 0, 0, %s, %s },", funcname, auditev, flags, thr_flag) > sysent
469				column = column + length(funcname) + length(auditev) + length(flags) + 3 
470			} else {
471				printf("sys_%s, %s, NULL, 0, 0, %s, %s },", funcname, auditev, flags, thr_flag) > sysent
472				column = column + length(funcname) + length(auditev) + length(flags) + 3 + 4
473			} 
474		} 
475		align_sysent_comment(column)
476		printf("/* %d = %s */\n", syscall, funcalias) > sysent
477		printf("\t\"%s\",\t\t\t/* %d = %s */\n",
478		    funcalias, syscall, funcalias) > sysnames
479		if (!flag("NODEF")) {
480			printf("#define\t%s%s\t%d\n", syscallprefix,
481		    	    funcalias, syscall) > syshdr
482			printf(" \\\n\t%s.o", funcalias) > sysmk
483		}
484		syscall++
485		next
486	}
487	type("COMPAT") || type("COMPAT4") || type("COMPAT6") || \
488	    type("COMPAT7") {
489		if (flag("COMPAT")) {
490			ncompat++
491			out = syscompat
492			outdcl = syscompatdcl
493			wrap = "compat"
494			prefix = "o"
495			descr = "old"
496		} else if (flag("COMPAT4")) {
497			ncompat4++
498			out = syscompat4
499			outdcl = syscompat4dcl
500			wrap = "compat4"
501			prefix = "freebsd4_"
502			descr = "freebsd4"
503		} else if (flag("COMPAT6")) {
504			ncompat6++
505			out = syscompat6
506			outdcl = syscompat6dcl
507			wrap = "compat6"
508			prefix = "freebsd6_"
509			descr = "freebsd6"
510		} else if (flag("COMPAT7")) {
511			ncompat7++
512			out = syscompat7
513			outdcl = syscompat7dcl
514			wrap = "compat7"
515			prefix = "freebsd7_"
516			descr = "freebsd7"
517		}
518		parseline()
519		if (argc != 0 && !flag("NOARGS") && !flag("NOPROTO") && \
520		    !flag("NODEF")) {
521			printf("struct %s {\n", argalias) > out
522			for (i = 1; i <= argc; i++)
523				printf("\tchar %s_l_[PADL_(%s)]; %s %s; " \
524				    "char %s_r_[PADR_(%s)];\n",
525				    argname[i], argtype[i],
526				    argtype[i], argname[i],
527				    argname[i], argtype[i]) > out
528			printf("};\n") > out
529		}
530		else if (!flag("NOARGS") && !flag("NOPROTO") && !flag("NODEF"))
531			printf("struct %s {\n\tregister_t dummy;\n};\n",
532			    argalias) > sysarg
533		if (!flag("NOPROTO") && !flag("NODEF")) {
534			printf("%s\t%s%s(struct thread *, struct %s *);\n",
535			    rettype, prefix, funcname, argalias) > outdcl
536			printf("#define\t%sAUE_%s%s\t%s\n", syscallprefix,
537			    prefix, funcname, auditev) > sysaue
538		}
539		if (flag("NOSTD")) {
540			printf("\t{ %s, (sy_call_t *)%s, %s, NULL, 0, 0, 0, SY_THR_ABSENT },",
541			    "0", "lkmressys", "AUE_NULL") > sysent
542			align_sysent_comment(8 + 2 + length("0") + 15 + \
543			    length("lkmressys") + length("AUE_NULL") + 3)
544		} else {
545			printf("\t{ %s(%s,%s), %s, NULL, 0, 0, %s, %s },",
546			    wrap, argssize, funcname, auditev, flags, thr_flag) > sysent
547			align_sysent_comment(8 + 9 + length(argssize) + 1 + \
548			    length(funcname) + length(auditev) + \
549			    length(flags) + 4)
550		}
551		printf("/* %d = %s %s */\n", syscall, descr, funcalias) > sysent
552		printf("\t\"%s.%s\",\t\t/* %d = %s %s */\n",
553		    wrap, funcalias, syscall, descr, funcalias) > sysnames
554		if (flag("COMPAT")) {
555			printf("\t\t\t\t/* %d is old %s */\n",
556			    syscall, funcalias) > syshdr
557		} else if (!flag("NODEF")) {
558			printf("#define\t%s%s%s\t%d\n", syscallprefix,
559			    prefix, funcalias, syscall) > syshdr
560			printf(" \\\n\t%s%s.o", prefix, funcalias) > sysmk
561		}
562		syscall++
563		next
564	}
565	type("OBSOL") {
566		printf("\t{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT },") > sysent
567		align_sysent_comment(34)
568		printf("/* %d = obsolete %s */\n", syscall, comment) > sysent
569		printf("\t\"obs_%s\",\t\t\t/* %d = obsolete %s */\n",
570		    $4, syscall, comment) > sysnames
571		printf("\t\t\t\t/* %d is obsolete %s */\n",
572		    syscall, comment) > syshdr
573		syscall++
574		next
575	}
576	type("UNIMPL") {
577		printf("\t{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT },\t\t\t/* %d = %s */\n",
578		    syscall, comment) > sysent
579		printf("\t\"#%d\",\t\t\t/* %d = %s */\n",
580		    syscall, syscall, comment) > sysnames
581		syscall++
582		next
583	}
584	{
585		printf "%s: line %d: unrecognized keyword %s\n", infile, NR, $3
586		exit 1
587	}
588	END {
589		printf "\n#define AS(name) (sizeof(struct name) / sizeof(register_t))\n" > sysinc
590
591		if (ncompat != 0 || ncompat4 != 0 || ncompat6 != 0 || ncompat7 != 0)
592			printf "#include \"opt_compat.h\"\n\n" > syssw
593
594		if (ncompat != 0) {
595			printf "\n#ifdef %s\n", compat > sysinc
596			printf "#define compat(n, name) n, (sy_call_t *)__CONCAT(o,name)\n" > sysinc
597			printf "#else\n" > sysinc
598			printf "#define compat(n, name) 0, (sy_call_t *)nosys\n" > sysinc
599			printf "#endif\n" > sysinc
600		}
601
602		if (ncompat4 != 0) {
603			printf "\n#ifdef %s\n", compat4 > sysinc
604			printf "#define compat4(n, name) n, (sy_call_t *)__CONCAT(freebsd4_,name)\n" > sysinc
605			printf "#else\n" > sysinc
606			printf "#define compat4(n, name) 0, (sy_call_t *)nosys\n" > sysinc
607			printf "#endif\n" > sysinc
608		}
609
610		if (ncompat6 != 0) {
611			printf "\n#ifdef %s\n", compat6 > sysinc
612			printf "#define compat6(n, name) n, (sy_call_t *)__CONCAT(freebsd6_,name)\n" > sysinc
613			printf "#else\n" > sysinc
614			printf "#define compat6(n, name) 0, (sy_call_t *)nosys\n" > sysinc
615			printf "#endif\n" > sysinc
616		}
617
618		if (ncompat7 != 0) {
619			printf "\n#ifdef %s\n", compat7 > sysinc
620			printf "#define compat7(n, name) n, (sy_call_t *)__CONCAT(freebsd7_,name)\n" > sysinc
621			printf "#else\n" > sysinc
622			printf "#define compat7(n, name) 0, (sy_call_t *)nosys\n" > sysinc
623			printf "#endif\n" > sysinc
624		}
625
626		printf("\n#endif /* %s */\n\n", compat) > syscompatdcl
627		printf("\n#endif /* %s */\n\n", compat4) > syscompat4dcl
628		printf("\n#endif /* %s */\n\n", compat6) > syscompat6dcl
629		printf("\n#endif /* %s */\n\n", compat7) > syscompat7dcl
630
631		printf("\n#undef PAD_\n") > sysprotoend
632		printf("#undef PADL_\n") > sysprotoend
633		printf("#undef PADR_\n") > sysprotoend
634		printf("\n#endif /* !%s */\n", sysproto_h) > sysprotoend
635
636		printf("\n") > sysmk
637		printf("};\n") > sysent
638		printf("};\n") > sysnames
639		printf("#define\t%sMAXSYSCALL\t%d\n", syscallprefix, syscall) \
640		    > syshdr
641		printf "\tdefault:\n\t\t*n_args = 0;\n\t\tbreak;\n\t};\n}\n" > systrace
642		printf "\tdefault:\n\t\tbreak;\n\t};\n\tif (p != NULL)\n\t\tstrlcpy(desc, p, descsz);\n}\n" > systracetmp
643		printf "\tdefault:\n\t\tbreak;\n\t};\n\tif (p != NULL)\n\t\tstrlcpy(desc, p, descsz);\n}\n" > systraceret
644	} '
645
646cat $sysinc $sysent >> $syssw
647cat $sysarg $sysdcl \
648	$syscompat $syscompatdcl \
649	$syscompat4 $syscompat4dcl \
650	$syscompat6 $syscompat6dcl \
651	$syscompat7 $syscompat7dcl \
652	$sysaue $sysprotoend > $sysproto
653cat $systracetmp >> $systrace
654cat $systraceret >> $systrace
655
656