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