xref: /dragonfly/sys/kern/makesyscalls.sh (revision 2513f15e)
1#! /bin/sh -
2#	@(#)makesyscalls.sh	8.1 (Berkeley) 6/10/93
3# $FreeBSD: src/sys/kern/makesyscalls.sh,v 1.39.2.4 2001/10/20 09:01:24 marcel Exp $
4
5set -e
6
7# name of compat option:
8compat=COMPAT_43
9# name of DragonFly 1.2 compat option
10compatdf12=COMPAT_DF12
11
12# output files:
13sysnames="syscalls.c"
14sysproto="../sys/sysproto.h"
15sysunion="../sys/sysunion.h"
16sysproto_h=_SYS_SYSPROTO_H_
17syshdr="../sys/syscall.h"
18sysmk="../sys/syscall.mk"
19syssw="init_sysent.c"
20syscallprefix="SYS_"
21switchname="sysent"
22namesname="syscallnames"
23
24# tmp files:
25sysdcl="sysent.dcl.$$"
26syscompat="sysent.compat.$$"
27syscompatdf12="sysent.compatdf12.$$"
28syscompatdcl="sysent.compatdcl.$$"
29syscompatdcldf12="sysent.compatdcldf12.$$"
30sysent="sysent.switch.$$"
31sysinc="sysinc.switch.$$"
32sysarg="sysarg.switch.$$"
33sysun="sysunion.switch.$$"
34
35trap "rm $sysdcl $syscompat $syscompatdf12 $syscompatdcl $syscompatdcldf12 $sysent $sysinc $sysarg $sysun" 0
36
37touch $sysdcl $syscompat $syscompatdf12 $syscompatdcl $syscompatdcldf12 $sysent $sysinc $sysarg $sysun
38
39case $# in
40    0)	echo "Usage: $0 input-file <config-file>" 1>&2
41	exit 1
42	;;
43esac
44
45if [ -n "$2" -a -f "$2" ]; then
46	. $2
47fi
48
49sed -e '
50s/\$//g
51:join
52	/\\$/{a\
53
54	N
55	s/\\\n//
56	b join
57	}
582,${
59	/^#/!s/\([{}()*,]\)/ \1 /g
60}
61' < $1 | awk "
62	BEGIN {
63		sysdcl = \"$sysdcl\"
64		sysproto = \"$sysproto\"
65		sysproto_h = \"$sysproto_h\"
66		syscompat = \"$syscompat\"
67		syscompatdf12 = \"$syscompatdf12\"
68		syscompatdcl = \"$syscompatdcl\"
69		syscompatdcldf12 = \"$syscompatdcldf12\"
70		sysent = \"$sysent\"
71		syssw = \"$syssw\"
72		sysinc = \"$sysinc\"
73		sysarg = \"$sysarg\"
74		sysun = \"$sysun\"
75		sysnames = \"$sysnames\"
76		syshdr = \"$syshdr\"
77		sysmk = \"$sysmk\"
78		compat = \"$compat\"
79		compatdf12 = \"$compatdf12\"
80		syscallprefix = \"$syscallprefix\"
81		switchname = \"$switchname\"
82		namesname = \"$namesname\"
83		infile = \"$1\"
84		"'
85
86		printf "/*\n * System call switch table.\n *\n" > syssw
87		printf " * DO NOT EDIT-- To regenerate this file, edit syscalls.master followed\n" > syssw
88		printf " *               by running make sysent in the same directory.\n" > syssw
89		printf " */\n\n" > syssw
90
91		printf "/*\n * System call prototypes.\n *\n" > sysarg
92		printf " * DO NOT EDIT-- To regenerate this file, edit syscalls.master followed\n" > sysarg
93		printf " *               by running make sysent in the same directory.\n" > sysarg
94		printf " */\n\n" > sysarg
95		printf "#ifndef %s\n", sysproto_h > sysarg
96		printf "#define\t%s\n\n", sysproto_h > sysarg
97		printf "#include <sys/select.h>\n\n" > sysarg
98		printf "#include <sys/signal.h>\n\n" > sysarg
99		printf "#include <sys/acl.h>\n\n" > sysarg
100		printf "#include <sys/msgport.h>\n\n" > sysarg
101		printf "#include <sys/sysmsg.h>\n\n" > sysarg
102		printf "#include <sys/syslink.h>\n\n" > sysarg
103		printf "#define\tPAD_(t)\t(sizeof(register_t) <= sizeof(t) ? \\\n" > sysarg
104		printf "\t\t0 : sizeof(register_t) - sizeof(t))\n\n" > sysarg
105
106		printf "\n#ifdef %s\n\n", compat > syscompat
107		printf "\n#ifdef %s\n\n", compatdf12 > syscompatdf12
108
109		printf "/*\n * System call names.\n *\n" > sysnames
110		printf " * DO NOT EDIT-- To regenerate this file, edit syscalls.master followed\n" > sysnames
111		printf " *               by running make sysent in the same directory.\n" > sysnames
112		printf " */\n\n" > sysnames
113		printf "const char *%s[] = {\n", namesname > sysnames
114
115		printf "/*\n * System call numbers.\n *\n" > syshdr
116		printf " * DO NOT EDIT-- To regenerate this file, edit syscalls.master followed\n" > syshdr
117		printf " *               by running make sysent in the same directory.\n" > syshdr
118		printf " */\n\n" > syshdr
119
120		printf "# DragonFly system call names.\n" > sysmk
121		printf "# DO NOT EDIT-- To regenerate this file, edit syscalls.master followed\n" > sysmk
122		printf "#               by running make sysent in the same directory.\n" > sysmk
123		printf "MIASM = " > sysmk
124
125		printf "/*\n * Union of syscall args for messaging.\n *\n" > sysun
126		printf " * DO NOT EDIT-- To regenerate this file, edit syscalls.master followed\n" > sysun
127		printf " *               by running make sysent in the same directory.\n" > sysun
128		printf " */\n\n" > sysun
129		printf "union sysunion {\n" > sysun
130		printf "#ifdef _KERNEL /* header only applies in kernel */\n" > sysun
131		printf "\tstruct\tlwkt_msg lmsg;\n" > sysun
132		printf "\tstruct\tsysmsg sysmsg;\n" > sysun
133		printf "#endif\n" > sysun
134
135		printf "\n/* The casts are bogus but will do for now. */\n" > sysent
136		printf "struct sysent %s[] = {\n",switchname > sysent
137
138		printf "\n#ifdef _KERNEL\n\n" > sysdcl
139		printf "\n#ifdef _KERNEL\n\n" > syscompatdcl
140		printf "\n#ifdef _KERNEL\n\n" > syscompatdcldf12
141	}
142	NF == 0 || $1 ~ /^;/ {
143		next
144	}
145	$1 ~ /^#[ 	]*include/ {
146		print > sysinc
147		next
148	}
149	$1 ~ /^#[ 	]*if/ {
150		print > sysent
151		print > sysdcl
152		print > sysarg
153		print > syscompat
154		print > syscompatdf12
155		print > sysnames
156		print > sysun
157		savesyscall = syscall
158		next
159	}
160	$1 ~ /^#[ 	]*else/ {
161		print > sysent
162		print > sysdcl
163		print > sysarg
164		print > sysun
165		print > syscompat
166		print > syscompatdf12
167		print > sysnames
168		syscall = savesyscall
169		next
170	}
171	$1 ~ /^#/ {
172		print > sysent
173		print > sysdcl
174		print > sysarg
175		print > sysun
176		print > syscompat
177		print > syscompatdf12
178		print > sysnames
179		next
180	}
181	syscall != $1 {
182		printf "%s: line %d: syscall number out of sync at %d\n",
183		    infile, NR, syscall
184		printf "line is:\n"
185		print
186		exit 1
187	}
188	function align_sysent_comment(column) {
189		printf("\t") > sysent
190		column = column + 8 - column % 8
191		while (column < 56) {
192			printf("\t") > sysent
193			column = column + 8
194		}
195	}
196	function parserr(was, wanted) {
197		printf "%s: line %d: unexpected %s (expected %s)\n",
198		    infile, NR, was, wanted
199		exit 1
200	}
201	function parseline() {
202		f=3			# toss number and type
203		argc= 0;
204		argssize = "0"
205		if ($NF != "}") {
206			funcalias=$(NF-2)
207			argalias=$(NF-1)
208			rettype=$NF
209			end=NF-3
210		} else {
211			funcalias=""
212			argalias=""
213			rettype="int"
214			end=NF
215		}
216		if ($2 == "NODEF") {
217			funcname=$3
218			argssize = "AS(" $5 ")"
219			return
220		}
221		if ($f != "{")
222			parserr($f, "{")
223		f++
224		if ($end != "}")
225			parserr($end, "}")
226		end--
227		if ($end != ";")
228			parserr($end, ";")
229		end--
230		if ($end != ")")
231			parserr($end, ")")
232		end--
233
234		f++	#function return type
235
236		funcname=$f
237		usefuncname=$f
238		if (funcalias == "")
239			funcalias = funcname
240		if (argalias == "") {
241			argalias = funcname "_args"
242			if ($2 == "COMPAT") {
243				argalias = "o" argalias
244				usefuncname = "sys_o" funcname
245			}
246			if ($2 == "COMPAT_DF12") {
247				argalias = "dfbsd12_" argalias
248				usefuncname = "sys_dfbsd12_" funcname
249			}
250		}
251		f++
252
253		if ($f != "(")
254			parserr($f, ")")
255		f++
256
257		if (f == end) {
258			if ($f != "void")
259				parserr($f, "argument definition")
260			return
261		}
262
263		while (f <= end) {
264			argc++
265			argtype[argc]=""
266			oldf=""
267			while (f < end && $(f+1) != ",") {
268				if (argtype[argc] != "" && oldf != "*")
269					argtype[argc] = argtype[argc]" ";
270				argtype[argc] = argtype[argc]$f;
271				oldf = $f;
272				f++
273			}
274			if (argtype[argc] == "")
275				parserr($f, "argument definition")
276			argname[argc]=$f;
277			f += 2;			# skip name, and any comma
278		}
279		if (argc != 0)
280			argssize = "AS(" argalias ")"
281	}
282	{	comment = $3
283		if (NF < 6)
284			for (i = 4; i <= NF; i++)
285				comment = comment " " $i
286	}
287	$2 == "STD" || $2 == "NODEF" || $2 == "NOARGS"  || $2 == "NOPROTO" \
288	    || $2 == "NOIMPL" {
289		parseline()
290		if ((!nosys || funcname != "nosys") && \
291		    (funcname != "lkmnosys")) {
292			if (argc != 0 && $2 != "NOARGS" && $2 != "NOPROTO") {
293				printf("\tstruct\t%s %s;\n", argalias, usefuncname) > sysun
294				printf("struct\t%s {\n", argalias) > sysarg
295				printf("#ifdef _KERNEL\n") > sysarg
296				printf("\tstruct sysmsg sysmsg;\n") > sysarg
297				printf("#endif\n") > sysarg
298				for (i = 1; i <= argc; i++)
299					printf("\t%s\t%s;\tchar %s_[PAD_(%s)];\n",
300					    argtype[i], argname[i],
301					    argname[i], argtype[i]) > sysarg
302				printf("};\n") > sysarg
303			}
304			else if ($2 != "NOARGS" && $2 != "NOPROTO" && \
305			    $2 != "NODEF") {
306				printf("\tstruct\t%s %s;\n", argalias, usefuncname) > sysun
307				printf("struct\t%s {\n", argalias) > sysarg
308				printf("#ifdef _KERNEL\n") > sysarg
309				printf("\tstruct sysmsg sysmsg;\n") > sysarg
310				printf("#endif\n") > sysarg
311				printf("\tregister_t dummy;\n") > sysarg
312				printf("};\n") > sysarg
313			}
314		}
315		if (($2 != "NOPROTO" && $2 != "NODEF" && \
316		    (funcname != "nosys" || !nosys)) || \
317		    (funcname == "lkmnosys" && !lkmnosys) || \
318		    funcname == "lkmressys") {
319			printf("%s\tsys_%s (struct %s *)",
320			    rettype, funcname, argalias) > sysdcl
321			printf(";\n") > sysdcl
322		}
323		if (funcname == "nosys")
324			nosys = 1
325		if (funcname == "lkmnosys")
326			lkmnosys = 1
327		printf("\t{ %s, (sy_call_t *)", argssize) > sysent
328		column = 8 + 2 + length(argssize) + 15
329	 	if ($2 != "NOIMPL") {
330			printf("sys_%s },", funcname) > sysent
331			column = column + length(funcname) + 7
332		} else {
333			printf("sys_%s },", "nosys") > sysent
334			column = column + length("nosys") + 7
335		}
336		align_sysent_comment(column)
337		printf("/* %d = %s */\n", syscall, funcalias) > sysent
338		printf("\t\"%s\",\t\t\t/* %d = %s */\n",
339		    funcalias, syscall, funcalias) > sysnames
340		if ($2 != "NODEF") {
341			printf("#define\t%s%s\t%d\n", syscallprefix,
342		    	    funcalias, syscall) > syshdr
343			printf(" \\\n\t%s.o", funcalias) > sysmk
344		}
345		syscall++
346		next
347	}
348	$2 == "COMPAT" || $2 == "CPT_NOA" {
349		ncompat++
350		parseline()
351		if (argc != 0 && $2 != "CPT_NOA") {
352			printf("#ifdef %s\n", compat) > sysun
353			printf("\tstruct\t%s %s;\n", argalias, usefuncname) > sysun
354			printf("#endif\n") > sysun
355			printf("struct\t%s {\n", argalias) > syscompat
356			printf("#ifdef _KERNEL\n") > syscompat
357			printf("\tstruct sysmsg sysmsg;\n") > syscompat
358			printf("#endif\n") > syscompat
359			for (i = 1; i <= argc; i++)
360				printf("\t%s\t%s;\tchar %s_[PAD_(%s)];\n",
361				    argtype[i], argname[i],
362				    argname[i], argtype[i]) > syscompat
363			printf("};\n") > syscompat
364		}
365		else if($2 != "CPT_NOA") {
366			printf("\tstruct\t%s %s;\n", argalias, usefuncname) > sysun
367			printf("struct\t%s {\n", argalias) > sysarg
368			printf("#ifdef _KERNEL\n") > sysarg
369			printf("\tstruct sysmsg sysmsg;\n") > sysarg
370			printf("#endif\n") > sysarg
371			printf("\tregister_t dummy;\n") > sysarg
372			printf("};\n") > sysarg
373		}
374		printf("%s\tsys_o%s (struct %s *);\n",
375		    rettype, funcname, argalias) > syscompatdcl
376		printf("\t{ compat(%s,%s) },",
377		    argssize, funcname) > sysent
378		align_sysent_comment(8 + 9 + \
379		    length(argssize) + 1 + length(funcname) + 4)
380		printf("/* %d = old %s */\n", syscall, funcalias) > sysent
381		printf("\t\"old.%s\",\t\t/* %d = old %s */\n",
382		    funcalias, syscall, funcalias) > sysnames
383		printf("\t\t\t\t/* %d is old %s */\n",
384		    syscall, funcalias) > syshdr
385		syscall++
386		next
387	}
388	$2 == "COMPAT_DF12" {
389		ncompatdf12++
390		parseline()
391		if (argc != 0) {
392			printf("#ifdef %s\n", compatdf12) > sysun
393			printf("\tstruct\t%s %s;\n", argalias, usefuncname) > sysun
394			printf("#endif\n") > sysun
395			printf("struct\t%s {\n", argalias) > syscompatdf12
396			printf("#ifdef _KERNEL\n") > syscompatdf12
397			printf("\tstruct sysmsg sysmsg;\n") > syscompatdf12
398			printf("#endif\n") > syscompatdf12
399			for (i = 1; i <= argc; i++)
400				printf("\t%s\t%s;\tchar %s_[PAD_(%s)];\n",
401				    argtype[i], argname[i],
402				    argname[i], argtype[i]) > syscompatdf12
403			printf("};\n") > syscompatdf12
404		}
405		else {
406			printf("\tstruct\t%s %s;\n", argalias, usefuncname) > sysun
407			printf("struct\t%s {\n", argalias) > sysarg
408			printf("#ifdef _KERNEL\n") > sysarg
409			printf("\tstruct sysmsg sysmsg;\n") > sysarg
410			printf("#endif\n") > sysarg
411			printf("\tregister_t dummy;\n") > sysarg
412			printf("};\n") > sysarg
413		}
414		printf("%s\tsys_dfbsd12_%s (struct %s *);\n",
415		    rettype, funcname, argalias) > syscompatdcldf12
416		printf("\t{ compatdf12(%s,%s) },",
417		    argssize, funcname) > sysent
418		align_sysent_comment(8 + 9 + \
419		    length(argssize) + 1 + length(funcname) + 4)
420		printf("/* %d = old %s */\n", syscall, funcalias) > sysent
421		printf("\t\"old.%s\",\t\t/* %d = old %s */\n",
422		    funcalias, syscall, funcalias) > sysnames
423		printf("\t\t\t\t/* %d is old %s */\n",
424		    syscall, funcalias) > syshdr
425		syscall++
426		next
427	}
428	$2 == "LIBCOMPAT" {
429		ncompat++
430		parseline()
431		printf("%s\tsys_o%s();\n", rettype, funcname) > syscompatdcl
432		printf("\t{ compat(%s,%s) },",
433		    argssize, funcname) > sysent
434		align_sysent_comment(8 + 9 + \
435		    length(argssize) + 1 + length(funcname) + 4)
436		printf("/* %d = old %s */\n", syscall, funcalias) > sysent
437		printf("\t\"old.%s\",\t\t/* %d = old %s */\n",
438		    funcalias, syscall, funcalias) > sysnames
439		printf("#define\t%s%s\t%d\t/* compatibility; still used by libc */\n",
440		    syscallprefix, funcalias, syscall) > syshdr
441		printf(" \\\n\t%s.o", funcalias) > sysmk
442		syscall++
443		next
444	}
445	$2 == "OBSOL" {
446		printf("\t{ 0, (sy_call_t *)sys_nosys },") > sysent
447		align_sysent_comment(37)
448		printf("/* %d = obsolete %s */\n", syscall, comment) > sysent
449		printf("\t\"obs_%s\",\t\t\t/* %d = obsolete %s */\n",
450		    $3, syscall, comment) > sysnames
451		printf("\t\t\t\t/* %d is obsolete %s */\n",
452		    syscall, comment) > syshdr
453		syscall++
454		next
455	}
456	$2 == "UNIMPL" {
457		printf("\t{ 0, (sy_call_t *)sys_nosys },\t\t\t/* %d = %s */\n",
458		    syscall, comment) > sysent
459		printf("\t\"#%d\",\t\t\t/* %d = %s */\n",
460		    syscall, syscall, comment) > sysnames
461		syscall++
462		next
463	}
464	{
465		printf "%s: line %d: unrecognized keyword %s\n", infile, NR, $2
466		exit 1
467	}
468	END {
469		printf "\n#define AS(name) ((sizeof(struct name) - sizeof(struct sysmsg)) / sizeof(register_t))\n" > sysinc
470		if (ncompat != 0) {
471			printf "#include \"opt_compat.h\"\n\n" > syssw
472			printf "\n#ifdef %s\n", compat > sysinc
473			printf "#define compat(n, name) n, (sy_call_t *)__CONCAT(sys_,__CONCAT(o,name))\n" > sysinc
474			printf "#else\n" > sysinc
475			printf "#define compat(n, name) 0, (sy_call_t *)sys_nosys\n" > sysinc
476			printf "#endif\n" > sysinc
477		}
478
479		if (ncompatdf12 != 0) {
480			printf "#ifdef __i386__\n" > syssw
481			printf "#include \"opt_compatdf12.h\"\n" > syssw
482			printf "#endif\n\n" > syssw
483			printf "\n#ifdef %s\n", compatdf12 > sysinc
484			printf "#define compatdf12(n, name) n, (sy_call_t *)__CONCAT(sys_,__CONCAT(dfbsd12_,name))\n" > sysinc
485			printf "#else\n" > sysinc
486			printf "#define compatdf12(n, name) 0, (sy_call_t *)sys_nosys\n" > sysinc
487			printf "#endif\n" > sysinc
488		}
489
490		printf("\n#endif /* _KERNEL */\n") > syscompatdcl
491		printf("\n#endif /* _KERNEL */\n") > syscompatdcldf12
492		printf("\n#endif /* %s */\n\n", compat) > syscompatdcl
493		printf("\n#endif /* %s */\n\n", compatdf12) > syscompatdcldf12
494
495		printf("\n") > sysmk
496		printf("};\n") > sysent
497		printf("};\n") > sysnames
498		printf("};\n") > sysun
499		printf("\n#endif /* !%s */\n", sysproto_h) > sysdcl
500		printf("#undef PAD_\n") > sysdcl
501		printf("\n#endif /* _KERNEL */\n") > sysdcl
502		printf("#define\t%sMAXSYSCALL\t%d\n", syscallprefix, syscall) \
503		    > syshdr
504	} '
505
506cat $sysinc $sysent >> $syssw
507cat $sysarg $syscompat $syscompatdcl $syscompatdf12 $syscompatdcldf12 $sysdcl > $sysproto
508cat $sysun > $sysunion
509