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