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