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