kernel/makesyscalls.sh: Fix copy/paste error.
[dragonfly.git] / sys / kern / makesyscalls.sh
1 #! /bin/sh -
2 #       @(#)makesyscalls.sh     8.1 (Berkeley) 6/10/93
3 # $FreeBSD: src/sys/kern/makesyscalls.sh,v 1.39.2.4 2001/10/20 09:01:24 marcel Exp $
4
5 set -e
6
7 # name of compat option:
8 compat=COMPAT_43
9 # name of DragonFly 1.2 compat option
10 compatdf12=COMPAT_DF12
11
12 # output files:
13 sysnames="syscalls.c"
14 sysproto="../sys/sysproto.h"
15 sysunion="../sys/sysunion.h"
16 sysproto_h=_SYS_SYSPROTO_H_
17 syshdr="../sys/syscall.h"
18 sysmk="../sys/syscall.mk"
19 syssw="init_sysent.c"
20 syshide="../sys/syscall-hide.h"
21 syscallprefix="SYS_"
22 switchname="sysent"
23 namesname="syscallnames"
24
25 # tmp files:
26 sysdcl="sysent.dcl.$$"
27 syscompat="sysent.compat.$$"
28 syscompatdf12="sysent.compatdf12.$$"
29 syscompatdcl="sysent.compatdcl.$$"
30 syscompatdcldf12="sysent.compatdcldf12.$$"
31 sysent="sysent.switch.$$"
32 sysinc="sysinc.switch.$$"
33 sysarg="sysarg.switch.$$"
34 sysun="sysunion.switch.$$"
35
36 trap "rm $sysdcl $syscompat $syscompatdf12 $syscompatdcl $syscompatdcldf12 $sysent $sysinc $sysarg $sysun" 0
37
38 touch $sysdcl $syscompat $syscompatdf12 $syscompatdcl $syscompatdcldf12 $sysent $sysinc $sysarg $sysun
39
40 case $# in
41     0)  echo "Usage: $0 input-file <config-file>" 1>&2
42         exit 1
43         ;;
44 esac
45
46 if [ -n "$2" -a -f "$2" ]; then
47         . $2
48 fi
49
50 sed -e '
51 s/\$//g
52 :join
53         /\\$/{a\
54
55         N
56         s/\\\n//
57         b join
58         }
59 2,${
60         /^#/!s/\([{}()*,]\)/ \1 /g
61 }
62 ' < $1 | awk "
63         BEGIN {
64                 sysdcl = \"$sysdcl\"
65                 sysproto = \"$sysproto\"
66                 sysproto_h = \"$sysproto_h\"
67                 syscompat = \"$syscompat\"
68                 syscompatdf12 = \"$syscompatdf12\"
69                 syscompatdcl = \"$syscompatdcl\"
70                 syscompatdcldf12 = \"$syscompatdcldf12\"
71                 sysent = \"$sysent\"
72                 syssw = \"$syssw\"
73                 sysinc = \"$sysinc\"
74                 sysarg = \"$sysarg\"
75                 sysun = \"$sysun\"
76                 sysnames = \"$sysnames\"
77                 syshdr = \"$syshdr\"
78                 sysmk = \"$sysmk\"
79                 compat = \"$compat\"
80                 compatdf12 = \"$compatdf12\"
81                 syshide = \"$syshide\"
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-- To regenerate this file, edit syscalls.master followed\n" > syssw
90                 printf " *               by running make sysent in the same directory.\n" > syssw
91                 printf " */\n\n" > syssw
92
93                 printf "/*\n * System call prototypes.\n *\n" > sysarg
94                 printf " * DO NOT EDIT-- To regenerate this file, edit syscalls.master followed\n" > sysarg
95                 printf " *               by running make sysent in the same directory.\n" > sysarg
96                 printf " */\n\n" > sysarg
97                 printf "#ifndef %s\n", sysproto_h > sysarg
98                 printf "#define\t%s\n\n", sysproto_h > sysarg
99                 printf "#include <sys/select.h>\n\n" > sysarg
100                 printf "#include <sys/signal.h>\n\n" > sysarg
101                 printf "#include <sys/acl.h>\n\n" > sysarg
102                 printf "#include <sys/msgport.h>\n\n" > sysarg
103                 printf "#include <sys/sysmsg.h>\n\n" > sysarg
104                 printf "#include <sys/syslink.h>\n\n" > sysarg
105                 printf "#define\tPAD_(t)\t(sizeof(register_t) <= sizeof(t) ? \\\n" > sysarg
106                 printf "\t\t0 : sizeof(register_t) - sizeof(t))\n\n" > sysarg
107
108                 printf "\n#ifdef %s\n\n", compat > syscompat
109                 printf "\n#ifdef %s\n\n", compatdf12 > syscompatdf12
110
111                 printf "/*\n * System call names.\n *\n" > sysnames
112                 printf " * DO NOT EDIT-- To regenerate this file, edit syscalls.master followed\n" > sysnames
113                 printf " *               by running make sysent in the same directory.\n" > sysnames
114                 printf " */\n\n" > sysnames
115                 printf "const char *%s[] = {\n", namesname > sysnames
116
117                 printf "/*\n * System call numbers.\n *\n" > syshdr
118                 printf " * DO NOT EDIT-- To regenerate this file, edit syscalls.master followed\n" > syshdr
119                 printf " *               by running make sysent in the same directory.\n" > syshdr
120                 printf " */\n\n" > syshdr
121
122                 printf "# DragonFly system call names.\n" > sysmk
123                 printf "# DO NOT EDIT-- To regenerate this file, edit syscalls.master followed\n" > sysmk
124                 printf "#               by running make sysent in the same directory.\n" > sysmk
125                 printf "MIASM = " > sysmk
126
127                 printf "/*\n * System call hiders.\n *\n" > syshide
128                 printf " * DO NOT EDIT-- To regenerate this file, edit syscalls.master followed\n" > syshide
129                 printf " *               by running make sysent in the same directory.\n" > syshide
130                 printf " */\n\n" > syshide
131
132                 printf "/*\n * Union of syscall args for messaging.\n *\n" > sysun
133                 printf " * DO NOT EDIT-- To regenerate this file, edit syscalls.master followed\n" > sysun
134                 printf " *               by running make sysent in the same directory.\n" > sysun
135                 printf " */\n\n" > sysun
136                 printf "union sysunion {\n" > sysun
137                 printf "#ifdef _KERNEL /* header only applies in kernel */\n" > sysun
138                 printf "\tstruct\tlwkt_msg lmsg;\n" > sysun
139                 printf "\tstruct\tsysmsg sysmsg;\n" > sysun
140                 printf "#endif\n" > sysun
141
142                 printf "\n/* The casts are bogus but will do for now. */\n" > sysent
143                 printf "struct sysent %s[] = {\n",switchname > sysent
144
145                 printf "\n#ifdef _KERNEL\n\n" > sysdcl
146                 printf "\n#ifdef _KERNEL\n\n" > syscompatdcl
147                 printf "\n#ifdef _KERNEL\n\n" > syscompatdcldf12
148         }
149         NF == 0 || $1 ~ /^;/ {
150                 next
151         }
152         $1 ~ /^#[       ]*include/ {
153                 print > sysinc
154                 next
155         }
156         $1 ~ /^#[       ]*if/ {
157                 print > sysent
158                 print > sysdcl
159                 print > sysarg
160                 print > syscompat
161                 print > syscompatdf12
162                 print > sysnames
163                 print > syshide
164                 print > sysun
165                 savesyscall = syscall
166                 next
167         }
168         $1 ~ /^#[       ]*else/ {
169                 print > sysent
170                 print > sysdcl
171                 print > sysarg
172                 print > sysun
173                 print > syscompat
174                 print > syscompatdf12
175                 print > sysnames
176                 print > syshide
177                 syscall = savesyscall
178                 next
179         }
180         $1 ~ /^#/ {
181                 print > sysent
182                 print > sysdcl
183                 print > sysarg
184                 print > sysun
185                 print > syscompat
186                 print > syscompatdf12
187                 print > sysnames
188                 print > syshide
189                 next
190         }
191         syscall != $1 {
192                 printf "%s: line %d: syscall number out of sync at %d\n",
193                     infile, NR, syscall
194                 printf "line is:\n"
195                 print
196                 exit 1
197         }
198         function align_sysent_comment(column) {
199                 printf("\t") > sysent
200                 column = column + 8 - column % 8
201                 while (column < 56) {
202                         printf("\t") > sysent
203                         column = column + 8
204                 }
205         }
206         function parserr(was, wanted) {
207                 printf "%s: line %d: unexpected %s (expected %s)\n",
208                     infile, NR, was, wanted
209                 exit 1
210         }
211         function parseline() {
212                 f=4                     # toss number and type
213                 argc= 0;
214                 argssize = "0"
215                 if ($NF != "}") {
216                         funcalias=$(NF-2)
217                         argalias=$(NF-1)
218                         rettype=$NF
219                         end=NF-3
220                 } else {
221                         funcalias=""
222                         argalias=""
223                         rettype="int"
224                         end=NF
225                 }
226                 if ($2 == "NODEF") {
227                         funcname=$4
228                         argssize = "AS(" $6 ")"
229                         return
230                 }
231                 if ($f != "{")
232                         parserr($f, "{")
233                 f++
234                 if ($end != "}")
235                         parserr($end, "}")
236                 end--
237                 if ($end != ";")
238                         parserr($end, ";")
239                 end--
240                 if ($end != ")")
241                         parserr($end, ")")
242                 end--
243
244                 f++     #function return type
245
246                 funcname=$f
247                 usefuncname=$f
248                 if (funcalias == "")
249                         funcalias = funcname
250                 if (argalias == "") {
251                         argalias = funcname "_args"
252                         if ($2 == "COMPAT") {
253                                 argalias = "o" argalias
254                                 usefuncname = "sys_o" funcname
255                         }
256                         if ($2 == "COMPAT_DF12") {
257                                 argalias = "dfbsd12_" argalias
258                                 usefuncname = "sys_dfbsd12_" funcname
259                         }
260                 }
261                 f++
262
263                 if ($f != "(")
264                         parserr($f, ")")
265                 f++
266
267                 if (f == end) {
268                         if ($f != "void")
269                                 parserr($f, "argument definition")
270                         return
271                 }
272
273                 while (f <= end) {
274                         argc++
275                         argtype[argc]=""
276                         oldf=""
277                         while (f < end && $(f+1) != ",") {
278                                 if (argtype[argc] != "" && oldf != "*")
279                                         argtype[argc] = argtype[argc]" ";
280                                 argtype[argc] = argtype[argc]$f;
281                                 oldf = $f;
282                                 f++
283                         }
284                         if (argtype[argc] == "")
285                                 parserr($f, "argument definition")
286                         argname[argc]=$f;
287                         f += 2;                 # skip name, and any comma
288                 }
289                 if (argc != 0)
290                         argssize = "AS(" argalias ")"
291         }
292         {       comment = $4
293                 if (NF < 7)
294                         for (i = 5; i <= NF; i++)
295                                 comment = comment " " $i
296         }
297         $2 == "STD" || $2 == "NODEF" || $2 == "NOARGS"  || $2 == "NOPROTO" \
298             || $2 == "NOIMPL" {
299                 parseline()
300                 if ((!nosys || funcname != "nosys") && \
301                     (funcname != "lkmnosys")) {
302                         if (argc != 0 && $2 != "NOARGS" && $2 != "NOPROTO") {
303                                 printf("\tstruct\t%s %s;\n", argalias, usefuncname) > sysun
304                                 printf("struct\t%s {\n", argalias) > sysarg
305                                 printf("#ifdef _KERNEL\n") > sysarg
306                                 printf("\tstruct sysmsg sysmsg;\n") > sysarg
307                                 printf("#endif\n") > sysarg
308                                 for (i = 1; i <= argc; i++)
309                                         printf("\t%s\t%s;\tchar %s_[PAD_(%s)];\n",
310                                             argtype[i], argname[i],
311                                             argname[i], argtype[i]) > sysarg
312                                 printf("};\n") > sysarg
313                         }
314                         else if ($2 != "NOARGS" && $2 != "NOPROTO" && \
315                             $2 != "NODEF") {
316                                 printf("\tstruct\t%s %s;\n", argalias, usefuncname) > sysun
317                                 printf("struct\t%s {\n", argalias) > sysarg
318                                 printf("#ifdef _KERNEL\n") > sysarg
319                                 printf("\tstruct sysmsg sysmsg;\n") > sysarg
320                                 printf("#endif\n") > sysarg
321                                 printf("\tregister_t dummy;\n") > sysarg
322                                 printf("};\n") > sysarg
323                         }
324                 }
325                 if (($2 != "NOPROTO" && $2 != "NODEF" && \
326                     (funcname != "nosys" || !nosys)) || \
327                     (funcname == "lkmnosys" && !lkmnosys) || \
328                     funcname == "lkmressys") {
329                         printf("%s\tsys_%s (struct %s *)",
330                             rettype, funcname, argalias) > sysdcl
331                         printf(";\n") > sysdcl
332                 }
333                 if (funcname == "nosys")
334                         nosys = 1
335                 if (funcname == "lkmnosys")
336                         lkmnosys = 1
337                 printf("\t{ %s, (sy_call_t *)", argssize) > sysent
338                 column = 8 + 2 + length(argssize) + 15
339                 if ($2 != "NOIMPL") {
340                         printf("sys_%s },", funcname) > sysent
341                         column = column + length(funcname) + 7
342                 } else {
343                         printf("sys_%s },", "nosys") > sysent
344                         column = column + length("nosys") + 7
345                 }
346                 align_sysent_comment(column)
347                 printf("/* %d = %s */\n", syscall, funcalias) > sysent
348                 printf("\t\"%s\",\t\t\t/* %d = %s */\n",
349                     funcalias, syscall, funcalias) > sysnames
350                 if ($2 != "NODEF") {
351                         printf("#define\t%s%s\t%d\n", syscallprefix,
352                             funcalias, syscall) > syshdr
353                         printf(" \\\n\t%s.o", funcalias) > sysmk
354                 }
355                 if ($3 != "NOHIDE")
356                         printf("HIDE_%s(%s)\n", $3, funcname) > syshide
357                 syscall++
358                 next
359         }
360         $2 == "COMPAT" || $2 == "CPT_NOA" {
361                 ncompat++
362                 parseline()
363                 if (argc != 0 && $2 != "CPT_NOA") {
364                         printf("#ifdef %s\n", compat) > sysun
365                         printf("\tstruct\t%s %s;\n", argalias, usefuncname) > sysun
366                         printf("#endif\n") > sysun
367                         printf("struct\t%s {\n", argalias) > syscompat
368                         printf("#ifdef _KERNEL\n") > syscompat
369                         printf("\tstruct sysmsg sysmsg;\n") > syscompat
370                         printf("#endif\n") > syscompat
371                         for (i = 1; i <= argc; i++)
372                                 printf("\t%s\t%s;\tchar %s_[PAD_(%s)];\n",
373                                     argtype[i], argname[i],
374                                     argname[i], argtype[i]) > syscompat
375                         printf("};\n") > syscompat
376                 }
377                 else if($2 != "CPT_NOA") {
378                         printf("\tstruct\t%s %s;\n", argalias, usefuncname) > sysun
379                         printf("struct\t%s {\n", argalias) > sysarg
380                         printf("#ifdef _KERNEL\n") > sysarg
381                         printf("\tstruct sysmsg sysmsg;\n") > sysarg
382                         printf("#endif\n") > sysarg
383                         printf("\tregister_t dummy;\n") > sysarg
384                         printf("};\n") > sysarg
385                 }
386                 printf("%s\tsys_o%s (struct %s *);\n",
387                     rettype, funcname, argalias) > syscompatdcl
388                 printf("\t{ compat(%s,%s) },",
389                     argssize, funcname) > sysent
390                 align_sysent_comment(8 + 9 + \
391                     length(argssize) + 1 + length(funcname) + 4)
392                 printf("/* %d = old %s */\n", syscall, funcalias) > sysent
393                 printf("\t\"old.%s\",\t\t/* %d = old %s */\n",
394                     funcalias, syscall, funcalias) > sysnames
395                 printf("\t\t\t\t/* %d is old %s */\n",
396                     syscall, funcalias) > syshdr
397                 if ($3 != "NOHIDE")
398                         printf("HIDE_%s(%s)\n", $3, funcname) > syshide
399                 syscall++
400                 next
401         }
402         $2 == "COMPAT_DF12" {
403                 ncompatdf12++
404                 parseline()
405                 if (argc != 0) {
406                         printf("#ifdef %s\n", compatdf12) > sysun
407                         printf("\tstruct\t%s %s;\n", argalias, usefuncname) > sysun
408                         printf("#endif\n") > sysun
409                         printf("struct\t%s {\n", argalias) > syscompatdf12
410                         printf("#ifdef _KERNEL\n") > syscompatdf12
411                         printf("\tstruct sysmsg sysmsg;\n") > syscompatdf12
412                         printf("#endif\n") > syscompatdf12
413                         for (i = 1; i <= argc; i++)
414                                 printf("\t%s\t%s;\tchar %s_[PAD_(%s)];\n",
415                                     argtype[i], argname[i],
416                                     argname[i], argtype[i]) > syscompatdf12
417                         printf("};\n") > syscompatdf12
418                 }
419                 else {
420                         printf("\tstruct\t%s %s;\n", argalias, usefuncname) > sysun
421                         printf("struct\t%s {\n", argalias) > sysarg
422                         printf("#ifdef _KERNEL\n") > sysarg
423                         printf("\tstruct sysmsg sysmsg;\n") > sysarg
424                         printf("#endif\n") > sysarg
425                         printf("\tregister_t dummy;\n") > sysarg
426                         printf("};\n") > sysarg
427                 }
428                 printf("%s\tsys_dfbsd12_%s (struct %s *);\n",
429                     rettype, funcname, argalias) > syscompatdcldf12
430                 printf("\t{ compatdf12(%s,%s) },",
431                     argssize, funcname) > sysent
432                 align_sysent_comment(8 + 9 + \
433                     length(argssize) + 1 + length(funcname) + 4)
434                 printf("/* %d = old %s */\n", syscall, funcalias) > sysent
435                 printf("\t\"old.%s\",\t\t/* %d = old %s */\n",
436                     funcalias, syscall, funcalias) > sysnames
437                 printf("\t\t\t\t/* %d is old %s */\n",
438                     syscall, funcalias) > syshdr
439                 if ($3 != "NOHIDE")
440                         printf("HIDE_%s(%s)\n", $3, funcname) > syshide
441                 syscall++
442                 next
443         }
444         $2 == "LIBCOMPAT" {
445                 ncompat++
446                 parseline()
447                 printf("%s\tsys_o%s();\n", rettype, funcname) > syscompatdcl
448                 printf("\t{ compat(%s,%s) },",
449                     argssize, funcname) > sysent
450                 align_sysent_comment(8 + 9 + \
451                     length(argssize) + 1 + length(funcname) + 4)
452                 printf("/* %d = old %s */\n", syscall, funcalias) > sysent
453                 printf("\t\"old.%s\",\t\t/* %d = old %s */\n",
454                     funcalias, syscall, funcalias) > sysnames
455                 printf("#define\t%s%s\t%d\t/* compatibility; still used by libc */\n",
456                     syscallprefix, funcalias, syscall) > syshdr
457                 printf(" \\\n\t%s.o", funcalias) > sysmk
458                 if ($3 != "NOHIDE")
459                         printf("HIDE_%s(%s)\n", $3, funcname) > syshide
460                 syscall++
461                 next
462         }
463         $2 == "OBSOL" {
464                 printf("\t{ 0, (sy_call_t *)sys_nosys },") > sysent
465                 align_sysent_comment(37)
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                 if ($3 != "NOHIDE")
472                         printf("HIDE_%s(%s)\n", $3, $4) > syshide
473                 syscall++
474                 next
475         }
476         $2 == "UNIMPL" {
477                 printf("\t{ 0, (sy_call_t *)sys_nosys },\t\t\t/* %d = %s */\n",
478                     syscall, comment) > sysent
479                 printf("\t\"#%d\",\t\t\t/* %d = %s */\n",
480                     syscall, syscall, comment) > sysnames
481                 if ($3 != "NOHIDE")
482                         printf("HIDE_%s(%s)\n", $3, $4) > syshide
483                 syscall++
484                 next
485         }
486         {
487                 printf "%s: line %d: unrecognized keyword %s\n", infile, NR, $2
488                 exit 1
489         }
490         END {
491                 printf "\n#define AS(name) ((sizeof(struct name) - sizeof(struct sysmsg)) / sizeof(register_t))\n" > sysinc
492                 if (ncompat != 0) {
493                         printf "#include \"opt_compat.h\"\n\n" > syssw
494                         printf "\n#ifdef %s\n", compat > sysinc
495                         printf "#define compat(n, name) n, (sy_call_t *)__CONCAT(sys_,__CONCAT(o,name))\n" > sysinc
496                         printf "#else\n" > sysinc
497                         printf "#define compat(n, name) 0, (sy_call_t *)sys_nosys\n" > sysinc
498                         printf "#endif\n" > sysinc
499                 }
500
501                 if (ncompatdf12 != 0) {
502                         printf "#include \"opt_compatdf12.h\"\n\n" > syssw
503                         printf "\n#ifdef %s\n", compatdf12 > sysinc
504                         printf "#define compatdf12(n, name) n, (sy_call_t *)__CONCAT(sys_,__CONCAT(dfbsd12_,name))\n" > sysinc
505                         printf "#else\n" > sysinc
506                         printf "#define compatdf12(n, name) 0, (sy_call_t *)sys_nosys\n" > sysinc
507                         printf "#endif\n" > sysinc
508                 }
509
510                 printf("\n#endif /* _KERNEL */\n") > syscompatdcl
511                 printf("\n#endif /* _KERNEL */\n") > syscompatdcldf12
512                 printf("\n#endif /* %s */\n\n", compat) > syscompatdcl
513                 printf("\n#endif /* %s */\n\n", compatdf12) > syscompatdcldf12
514
515                 printf("\n") > sysmk
516                 printf("};\n") > sysent
517                 printf("};\n") > sysnames
518                 printf("};\n") > sysun
519                 printf("\n#endif /* !%s */\n", sysproto_h) > sysdcl
520                 printf("#undef PAD_\n") > sysdcl
521                 printf("\n#endif /* _KERNEL */\n") > sysdcl
522                 printf("#define\t%sMAXSYSCALL\t%d\n", syscallprefix, syscall) \
523                     > syshdr
524         } '
525
526 cat $sysinc $sysent >> $syssw
527 cat $sysarg $syscompat $syscompatdcl $syscompatdf12 $syscompatdcldf12 $sysdcl > $sysproto
528 cat $sysun > $sysunion