xref: /dragonfly/sys/kern/makesyscalls.sh (revision 6bd457ed)
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.12 2005/08/02 13:03:55 joerg 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 = "o" funcname
270			}
271			if ($2 == "COMPAT_DF12") {
272				argalias = "dfbsd12_" argalias
273				usefuncname = "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				printf("\tunion usrmsg usrmsg;\n") > sysarg
332				for (i = 1; i <= argc; i++)
333					printf("\t%s\t%s;\tchar %s_[PAD_(%s)];\n",
334					    argtype[i], argname[i],
335					    argname[i], argtype[i]) > sysarg
336				printf("};\n") > sysarg
337			}
338			else if ($2 != "NOARGS" && $2 != "NOPROTO" && \
339			    $2 != "NODEF") {
340				printf("\tstruct\t%s %s;\n", argalias, usefuncname) > sysun
341				printf("struct\t%s {\n", argalias) > sysarg
342				printf("#ifdef _KERNEL\n") > sysarg
343				printf("\tstruct sysmsg sysmsg;\n") > sysarg
344				printf("#endif\n") > sysarg
345				printf("\tunion usrmsg usrmsg;\n") > sysarg
346				printf("\tregister_t dummy;\n") > sysarg
347				printf("};\n") > sysarg
348			}
349		}
350		if (($2 != "NOPROTO" && $2 != "NODEF" && \
351		    (funcname != "nosys" || !nosys)) || \
352		    (funcname == "lkmnosys" && !lkmnosys) || \
353		    funcname == "lkmressys") {
354			printf("%s\t%s (struct %s *)",
355			    rettype, funcname, argalias) > sysdcl
356			printf(";\n") > sysdcl
357		}
358		if (funcname == "nosys")
359			nosys = 1
360		if (funcname == "lkmnosys")
361			lkmnosys = 1
362		printf("\t{ %s%s, (sy_call_t *)", mpsafe, argssize) > sysent
363		column = 8 + 2 + length(mpsafe) + length(argssize) + 15
364	 	if ($2 != "NOIMPL") {
365			printf("%s },", funcname) > sysent
366			column = column + length(funcname) + 3
367		} else {
368			printf("%s },", "nosys") > sysent
369			column = column + length("nosys") + 3
370		}
371		align_sysent_comment(column)
372		printf("/* %d = %s */\n", syscall, funcalias) > sysent
373		printf("\t\"%s\",\t\t\t/* %d = %s */\n",
374		    funcalias, syscall, funcalias) > sysnames
375		if ($2 != "NODEF") {
376			printf("#define\t%s%s\t%d\n", syscallprefix,
377		    	    funcalias, syscall) > syshdr
378			printf(" \\\n\t%s.o", funcalias) > sysmk
379			printf("%s\t%s\t%s\t%s", rettype, funcalias, usefuncname, argalias) > sysargs
380			for (i = 1; i <= argc; i++)
381				printf("\t%s\t%s", argtype[i], argname[i]) > sysargs
382			printf("\n") > sysargs
383		}
384		if ($3 != "NOHIDE")
385			printf("HIDE_%s(%s)\n", $3, funcname) > syshide
386		syscall++
387		next
388	}
389	$2 == "COMPAT" || $2 == "CPT_NOA" {
390		ncompat++
391		parseline()
392		if (argc != 0 && $2 != "CPT_NOA") {
393			printf("#ifdef %s\n", compat) > sysun
394			printf("\tstruct\t%s %s;\n", argalias, usefuncname) > sysun
395			printf("#endif\n") > sysun
396			printf("struct\t%s {\n", argalias) > syscompat
397			printf("#ifdef _KERNEL\n") > syscompat
398			printf("\tstruct sysmsg sysmsg;\n") > syscompat
399			printf("#endif\n") > syscompat
400			printf("\tunion usrmsg usrmsg;\n") > syscompat
401			for (i = 1; i <= argc; i++)
402				printf("\t%s\t%s;\tchar %s_[PAD_(%s)];\n",
403				    argtype[i], argname[i],
404				    argname[i], argtype[i]) > syscompat
405			printf("};\n") > syscompat
406		}
407		else if($2 != "CPT_NOA") {
408			printf("\tstruct\t%s %s;\n", argalias, usefuncname) > sysun
409			printf("struct\t%s {\n", argalias) > sysarg
410			printf("#ifdef _KERNEL\n") > sysarg
411			printf("\tstruct sysmsg sysmsg;\n") > sysarg
412			printf("#endif\n") > sysarg
413			printf("\tunion usrmsg usrmsg;\n") > sysarg
414			printf("\tregister_t dummy;\n") > sysarg
415			printf("};\n") > sysarg
416		}
417		printf("%s\to%s (struct %s *);\n",
418		    rettype, funcname, argalias) > syscompatdcl
419		printf("\t{ compat(%s%s,%s) },",
420		    mpsafe, argssize, funcname) > sysent
421		align_sysent_comment(8 + 9 + length(mpsafe) + \
422		    length(argssize) + 1 + length(funcname) + 4)
423		printf("/* %d = old %s */\n", syscall, funcalias) > sysent
424		printf("\t\"old.%s\",\t\t/* %d = old %s */\n",
425		    funcalias, syscall, funcalias) > sysnames
426		printf("\t\t\t\t/* %d is old %s */\n",
427		    syscall, funcalias) > syshdr
428		if ($3 != "NOHIDE")
429			printf("HIDE_%s(%s)\n", $3, funcname) > syshide
430		syscall++
431		next
432	}
433	$2 == "COMPAT_DF12" {
434		ncompatdf12++
435		parseline()
436		if (argc != 0) {
437			printf("#ifdef %s\n", compatdf12) > sysun
438			printf("\tstruct\t%s %s;\n", argalias, usefuncname) > sysun
439			printf("#endif\n") > sysun
440			printf("struct\t%s {\n", argalias) > syscompatdf12
441			printf("#ifdef _KERNEL\n") > syscompatdf12
442			printf("\tstruct sysmsg sysmsg;\n") > syscompatdf12
443			printf("#endif\n") > syscompatdf12
444			printf("\tunion usrmsg usrmsg;\n") > syscompatdf12
445			for (i = 1; i <= argc; i++)
446				printf("\t%s\t%s;\tchar %s_[PAD_(%s)];\n",
447				    argtype[i], argname[i],
448				    argname[i], argtype[i]) > syscompatdf12
449			printf("};\n") > syscompatdf12
450		}
451		else {
452			printf("\tstruct\t%s %s;\n", argalias, usefuncname) > sysun
453			printf("struct\t%s {\n", argalias) > sysarg
454			printf("#ifdef _KERNEL\n") > sysarg
455			printf("\tstruct sysmsg sysmsg;\n") > sysarg
456			printf("#endif\n") > sysarg
457			printf("\tunion usrmsg usrmsg;\n") > sysarg
458			printf("\tregister_t dummy;\n") > sysarg
459			printf("};\n") > sysarg
460		}
461		printf("%s\tdfbsd12_%s (struct %s *);\n",
462		    rettype, funcname, argalias) > syscompatdcldf12
463		printf("\t{ compatdf12(%s%s,%s) },",
464		    mpsafe, argssize, funcname) > sysent
465		align_sysent_comment(8 + 9 + length(mpsafe) + \
466		    length(argssize) + 1 + length(funcname) + 4)
467		printf("/* %d = old %s */\n", syscall, funcalias) > sysent
468		printf("\t\"old.%s\",\t\t/* %d = old %s */\n",
469		    funcalias, syscall, funcalias) > sysnames
470		printf("\t\t\t\t/* %d is old %s */\n",
471		    syscall, funcalias) > syshdr
472		if ($3 != "NOHIDE")
473			printf("HIDE_%s(%s)\n", $3, funcname) > syshide
474		syscall++
475		next
476	}
477	$2 == "LIBCOMPAT" {
478		ncompat++
479		parseline()
480		printf("%s\to%s();\n", rettype, funcname) > syscompatdcl
481		printf("\t{ compat(%s%s,%s) },",
482		    mpsafe, argssize, funcname) > sysent
483		align_sysent_comment(8 + 9 + length(mpsafe) + \
484		    length(argssize) + 1 + length(funcname) + 4)
485		printf("/* %d = old %s */\n", syscall, funcalias) > sysent
486		printf("\t\"old.%s\",\t\t/* %d = old %s */\n",
487		    funcalias, syscall, funcalias) > sysnames
488		printf("#define\t%s%s\t%d\t/* compatibility; still used by libc */\n",
489		    syscallprefix, funcalias, syscall) > syshdr
490		printf(" \\\n\t%s.o", funcalias) > sysmk
491		printf("%s\t%s\t%s\t%s", rettype, funcalias, usefuncname, argalias) > sysargs
492		for (i = 1; i <= argc; i++)
493			printf("\t%s\t%s", argtype[i], argname[i]) > sysargs
494		printf("\n") > sysargs
495		if ($3 != "NOHIDE")
496			printf("HIDE_%s(%s)\n", $3, funcname) > syshide
497		syscall++
498		next
499	}
500	$2 == "OBSOL" {
501		printf("\t{ 0, (sy_call_t *)nosys },") > sysent
502		align_sysent_comment(34)
503		printf("/* %d = obsolete %s */\n", syscall, comment) > sysent
504		printf("\t\"obs_%s\",\t\t\t/* %d = obsolete %s */\n",
505		    $4, syscall, comment) > sysnames
506		printf("\t\t\t\t/* %d is obsolete %s */\n",
507		    syscall, comment) > syshdr
508		if ($3 != "NOHIDE")
509			printf("HIDE_%s(%s)\n", $3, $4) > syshide
510		syscall++
511		next
512	}
513	$2 == "UNIMPL" {
514		printf("\t{ 0, (sy_call_t *)nosys },\t\t\t/* %d = %s */\n",
515		    syscall, comment) > sysent
516		printf("\t\"#%d\",\t\t\t/* %d = %s */\n",
517		    syscall, syscall, comment) > sysnames
518		if ($3 != "NOHIDE")
519			printf("HIDE_%s(%s)\n", $3, $4) > syshide
520		syscall++
521		next
522	}
523	{
524		printf "%s: line %d: unrecognized keyword %s\n", infile, NR, $2
525		exit 1
526	}
527	END {
528		printf "\n#define AS(name) ((sizeof(struct name) - sizeof(struct sysmsg) - sizeof(union usrmsg)) / sizeof(register_t))\n" > sysinc
529		if (ncompat != 0) {
530			printf "#include \"opt_compat.h\"\n\n" > syssw
531			printf "\n#ifdef %s\n", compat > sysinc
532			printf "#define compat(n, name) n, (sy_call_t *)__CONCAT(o,name)\n" > sysinc
533			printf "#else\n" > sysinc
534			printf "#define compat(n, name) 0, (sy_call_t *)nosys\n" > sysinc
535			printf "#endif\n" > sysinc
536		}
537
538		if (ncompatdf12 != 0) {
539			printf "#include \"opt_compatdf12.h\"\n\n" > syssw
540			printf "\n#ifdef %s\n", compatdf12 > sysinc
541			printf "#define compatdf12(n, name) n, (sy_call_t *)__CONCAT(dfbsd12_,name)\n" > sysinc
542			printf "#else\n" > sysinc
543			printf "#define compatdf12(n, name) 0, (sy_call_t *)nosys\n" > sysinc
544			printf "#endif\n" > sysinc
545		}
546
547		printf("\n#endif /* _KERNEL */\n") > syscompatdcl
548		printf("\n#endif /* _KERNEL */\n") > syscompatdcldf12
549		printf("\n#endif /* %s */\n\n", compat) > syscompatdcl
550		printf("\n#endif /* %s */\n\n", compatdf12) > syscompatdcldf12
551
552		printf("\n") > sysmk
553		printf("};\n") > sysent
554		printf("};\n") > sysnames
555		printf("};\n") > sysun
556		printf("\n#endif /* !%s */\n", sysproto_h) > sysdcl
557		printf("#undef PAD_\n") > sysdcl
558		printf("\n#endif /* _KERNEL */\n") > sysdcl
559		printf("#define\t%sMAXSYSCALL\t%d\n", syscallprefix, syscall) \
560		    > syshdr
561	} '
562
563cat $sysinc $sysent >> $syssw
564cat $sysarg $syscompat $syscompatdcl $syscompatdf12 $syscompatdcldf12 $sysdcl > $sysproto
565cat $sysun > $sysunion
566