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