]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/kern/makesyscalls.sh
This commit was generated by cvs2svn to compensate for changes in r171831,
[FreeBSD/FreeBSD.git] / sys / kern / makesyscalls.sh
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