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