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