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