xref: /netbsd-src/sys/kern/makesyscalls.sh (revision cda4f8f6ee55684e8d311b86c99ea59191e6b74f)
1#! /bin/sh -
2#	from: @(#)makesyscalls.sh	7.6 (Berkeley) 4/20/91
3#	$Id: makesyscalls.sh,v 1.5 1993/06/07 19:52:40 cgd Exp $
4
5set -e
6
7# name of compat option:
8compat=COMPAT_43
9
10# output files:
11sysnames="syscalls.c"
12syshdr="../sys/syscall.h"
13syssw="init_sysent.c"
14
15# tmp files:
16sysdcl="sysent.dcl"
17syscompat="sysent.compat"
18sysent="sysent.switch"
19
20trap "rm $sysdcl $syscompat $sysent" 0
21
22case $# in
23    0)	echo "Usage: $0 input-file" 1>&2
24	exit 1
25	;;
26esac
27
28awk < $1 "
29	BEGIN {
30		sysdcl = \"$sysdcl\"
31		syscompat = \"$syscompat\"
32		sysent = \"$sysent\"
33		sysnames = \"$sysnames\"
34		syshdr = \"$syshdr\"
35		compat = \"$compat\"
36		infile = \"$1\"
37		"'
38
39		printf "/*\n * System call switch table.\n *\n" > sysdcl
40		printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysdcl
41
42		printf "\n#ifdef %s\n", compat > syscompat
43		printf "#define compat(n, name) n, __CONCAT(o,name)\n\n" > syscompat
44
45		printf "/*\n * System call names.\n *\n" > sysnames
46		printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysnames
47
48		printf "/*\n * System call numbers.\n *\n" > syshdr
49		printf " * DO NOT EDIT-- this file is automatically generated.\n" > syshdr
50	}
51	NR == 1 {
52		printf " * created from: %s %s %s %s\n */\n\n",$2,$3,$4,$5 > sysdcl
53		printf "#include \"param.h\"\n" > sysdcl
54		printf "#include \"systm.h\"\n\n" > sysdcl
55		printf "int\tnosys();\n\n" > sysdcl
56
57		printf "struct sysent sysent[] = {\n" > sysent
58
59		printf " * created from: %s %s %s %s\n */\n\n",$2,$3,$4,$5 > sysnames
60		printf "char *syscallnames[] = {\n" > sysnames
61
62		printf " * created from: %s %s %s %s\n */\n\n",$2,$3,$4,$5 > syshdr
63		printf "#ifndef _SYS_SYSCALL_H\n" > syshdr
64		printf "#define _SYS_SYSCALL_H\n" > syshdr
65		printf "\n" > syshdr
66		next
67	}
68	NF == 0 || $1 ~ /^;/ {
69		next
70	}
71	$1 ~ /^#[ 	]*if/ {
72		print > sysent
73		print > sysdcl
74		print > syscompat
75		print > sysnames
76		savesyscall = syscall
77		next
78	}
79	$1 ~ /^#[ 	]*else/ {
80		print > sysent
81		print > sysdcl
82		print > syscompat
83		print > sysnames
84		syscall = savesyscall
85		next
86	}
87	$1 ~ /^#/ {
88		print > sysent
89		print > sysdcl
90		print > syscompat
91		print > sysnames
92		next
93	}
94	syscall != $1 {
95		printf "%s: line %d: syscall number out of sync at %d\n", \
96		   infile, NR, syscall
97		printf "line is:\n"
98		print
99		exit 1
100	}
101	{	comment = $4
102		for (i = 5; i <= NF; i++)
103			comment = comment " " $i
104		if (NF < 5)
105			$5 = $4
106	}
107	$2 == "STD" || $2 == "NODEF" {
108		printf("int\t%s();\n", $4) > sysdcl
109		printf("\t%d, %s,\t\t\t/* %d = %s */\n", \
110		    $3, $4, syscall, $5) > sysent
111		printf("\t\"%s\",\t\t\t/* %d = %s */\n", \
112		    $5, syscall, $5) > sysnames
113		if ($2 == "STD")
114			printf("#define\tSYS_%s\t%d\n", \
115			    $5, syscall) > syshdr
116		syscall++
117		next
118	}
119	$2 == "COMPAT" {
120		printf("int\to%s();\n", $4) > syscompat
121		printf("\tcompat(%d,%s),\t\t/* %d = old %s */\n", \
122		    $3, $4, syscall, $5) > sysent
123		printf("\t\"old.%s\",\t\t/* %d = old %s */\n", \
124		    $5, syscall, $5) > sysnames
125		printf("\t\t\t\t/* %d is old %s */\n", \
126		    syscall, comment) > syshdr
127		syscall++
128		next
129	}
130	$2 == "LIBCOMPAT" {
131		printf("int\to%s();\n", $4) > syscompat
132		printf("\tcompat(%d,%s),\t\t/* %d = old %s */\n", \
133		    $3, $4, syscall, $5) > sysent
134		printf("\t\"old.%s\",\t\t/* %d = old %s */\n", \
135		    $5, syscall, $5) > sysnames
136		printf("#define\tSYS_%s\t%d\t/* compatibility; still used by libc */\n", \
137		    $5, syscall) > syshdr
138		syscall++
139		next
140	}
141	$2 == "OBSOL" {
142		printf("\t0, nosys,\t\t\t/* %d = obsolete %s */\n", \
143		    syscall, comment) > sysent
144		printf("\t\"obs_%s\",\t\t\t/* %d = obsolete %s */\n", \
145		    $4, syscall, comment) > sysnames
146		printf("\t\t\t\t/* %d is obsolete %s */\n", \
147		    syscall, comment) > syshdr
148		syscall++
149		next
150	}
151	$2 == "UNIMPL" {
152		printf("\t0, nosys,\t\t\t/* %d = %s */\n", \
153		    syscall, comment) > sysent
154		printf("\t\"#%d\",\t\t\t/* %d = %s */\n", \
155		    syscall, syscall, comment) > sysnames
156		syscall++
157		next
158	}
159	{
160		printf "%s: line %d: unrecognized keyword %s\n", infile, NR, $2
161		exit 1
162	}
163	END {
164		printf("\n#else /* %s */\n", compat) > syscompat
165		printf("#define compat(n, name) 0, nosys\n") > syscompat
166		printf("#endif /* %s */\n\n", compat) > syscompat
167
168		printf("};\n\n") > sysent
169		printf("int\tnsysent = sizeof(sysent) / sizeof(sysent[0]);\n") > sysent
170
171		printf("};\n") > sysnames
172
173		printf "\n" > syshdr
174		printf "#endif /* _SYS_SYSCALL_H */\n" > syshdr
175	} '
176
177cat $sysdcl $syscompat $sysent >$syssw
178
179#chmod 444 $sysnames $syshdr $syssw
180