2 # @(#)makesyscalls.sh 8.1 (Berkeley) 6/10/93
7 # name of compat option:
12 sysproto="../sys/sysproto.h"
13 sysproto_h=_SYS_SYSPROTO_H_
14 syshdr="../sys/syscall.h"
15 sysmk="../sys/syscall.mk"
19 namesname="syscallnames"
22 sysdcl="sysent.dcl.$$"
23 syscompat="sysent.compat.$$"
24 syscompatdcl="sysent.compatdcl.$$"
25 sysent="sysent.switch.$$"
26 sysinc="sysinc.switch.$$"
27 sysarg="sysarg.switch.$$"
29 trap "rm $sysdcl $syscompat $syscompatdcl $sysent $sysinc $sysarg" 0
31 touch $sysdcl $syscompat $syscompatdcl $sysent $sysinc $sysarg
34 0) echo "Usage: $0 input-file <config-file>" 1>&2
39 if [ -n "$2" -a -f "$2" ]; then
53 /^#/!s/\([{}()*,]\)/ \1 /g
58 sysproto = \"$sysproto\"
59 sysproto_h = \"$sysproto_h\"
60 syscompat = \"$syscompat\"
61 syscompatdcl = \"$syscompatdcl\"
66 sysnames = \"$sysnames\"
70 syscallprefix = \"$syscallprefix\"
71 switchname = \"$switchname\"
72 namesname = \"$namesname\"
76 printf "/*\n * System call switch table.\n *\n" > syssw
77 printf " * DO NOT EDIT-- this file is automatically generated.\n" > syssw
78 printf " * $%s$\n", "FreeBSD" > syssw
80 printf "/*\n * System call prototypes.\n *\n" > sysarg
81 printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysarg
82 printf " * $%s$\n", "FreeBSD" > sysarg
84 printf "\n#ifdef %s\n\n", compat > syscompat
86 printf "/*\n * System call names.\n *\n" > sysnames
87 printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysnames
88 printf " * $%s$\n", "FreeBSD" > sysnames
90 printf "/*\n * System call numbers.\n *\n" > syshdr
91 printf " * DO NOT EDIT-- this file is automatically generated.\n" > syshdr
92 printf " * $%s$\n", "FreeBSD" > syshdr
93 printf "# FreeBSD system call names.\n" > sysmk
94 printf "# DO NOT EDIT-- this file is automatically generated.\n" > sysmk
95 printf " * $%s$\n", "FreeBSD" > sysmk
98 gsub("[$]FreeBSD: ", "", $0)
101 printf " * created from%s\n */\n\n", $0 > syssw
103 printf "\n/* The casts are bogus but will do for now. */\n" > sysent
104 printf "struct sysent %s[] = {\n",switchname > sysent
106 printf " * created from%s\n */\n\n", $0 > sysarg
107 printf "#ifndef %s\n", sysproto_h > sysarg
108 printf "#define\t%s\n\n", sysproto_h > sysarg
109 printf "#include <sys/signal.h>\n\n" > sysarg
110 printf "#include <sys/acl.h>\n\n" > sysarg
111 printf "struct proc;\n\n" > sysarg
112 printf "struct thread;\n\n" > sysarg
113 printf "#define\tPAD_(t)\t(sizeof(register_t) <= sizeof(t) ? \\\n" > sysarg
114 printf "\t\t0 : sizeof(register_t) - sizeof(t))\n\n" > sysarg
115 printf "#if BYTE_ORDER == LITTLE_ENDIAN\n"> sysarg
116 printf "#define\tPADL_(t)\t0\n" > sysarg
117 printf "#define\tPADR_(t)\tPAD_(t)\n" > sysarg
118 printf "#else\n" > sysarg
119 printf "#define\tPADL_(t)\tPAD_(t)\n" > sysarg
120 printf "#define\tPADR_(t)\t0\n" > sysarg
121 printf "#endif\n\n" > sysarg
123 printf " * created from%s\n */\n\n", $0 > sysnames
124 printf "char *%s[] = {\n", namesname > sysnames
126 printf " * created from%s\n */\n\n", $0 > syshdr
128 printf "# created from%s\nMIASM = ", $0 > sysmk
132 NF == 0 || $1 ~ /^;/ {
135 $1 ~ /^#[ ]*include/ {
145 savesyscall = syscall
154 syscall = savesyscall
166 printf "%s: line %d: syscall number out of sync at %d\n",
172 function align_sysent_comment(column) {
173 printf("\t") > sysent
174 column = column + 8 - column % 8
175 while (column < 56) {
176 printf("\t") > sysent
180 function parserr(was, wanted) {
181 printf "%s: line %d: unexpected %s (expected %s)\n",
182 infile, NR, was, wanted
185 function parseline() {
186 f=4 # toss number and type
202 argssize = "AS(" $6 ")"
218 f++ #function return type
223 if (argalias == "") {
224 argalias = funcname "_args"
226 argalias = "o" argalias
236 parserr($f, "argument definition")
244 while (f < end && $(f+1) != ",") {
245 if (argtype[argc] != "" && oldf != "*")
246 argtype[argc] = argtype[argc]" ";
247 argtype[argc] = argtype[argc]$f;
251 if (argtype[argc] == "")
252 parserr($f, "argument definition")
254 f += 2; # skip name, and any comma
257 argssize = "AS(" argalias ")"
261 for (i = 5; i <= NF; i++)
262 comment = comment " " $i
265 # The 'M' type prefix
268 mpsafe = "SYF_MPSAFE | ";
271 } else if ($2 == "MNODEF") {
273 } else if ($2 == "MNOARGS") {
275 } else if ($2 == "MNOPROTO") {
277 } else if ($2 == "MNOIMPL") {
279 } else if ($2 == "MNOSTD") {
281 } else if ($2 == "MCOMPAT") {
283 } else if ($2 == "MCPT_NOA") {
285 } else if ($2 == "MLIBCOMPAT") {
287 } else if ($2 == "MOBSOL") {
289 } else if ($2 == "MUNIMPL") {
295 $2 == "STD" || $2 == "NODEF" || $2 == "NOARGS" || $2 == "NOPROTO" \
296 || $2 == "NOIMPL" || $2 == "NOSTD" {
298 if ((!nosys || funcname != "nosys") && \
299 (funcname != "lkmnosys") && (funcname != "lkmressys")) {
300 if (argc != 0 && $2 != "NOARGS" && $2 != "NOPROTO") {
301 printf("struct %s {\n", argalias) > sysarg
302 for (i = 1; i <= argc; i++)
303 printf("\tchar %s_l_[PADL_(%s)]; " \
304 "%s %s; char %s_r_[PADR_(%s)];\n",
305 argname[i], argtype[i],
306 argtype[i], argname[i],
307 argname[i], argtype[i]) > sysarg
308 printf("};\n") > sysarg
310 else if ($2 != "NOARGS" && $2 != "NOPROTO" && \
312 printf("struct %s {\n\tregister_t dummy;\n};\n",
315 if (($2 != "NOPROTO" && $2 != "NODEF" && \
316 (funcname != "nosys" || !nosys)) || \
317 (funcname == "lkmnosys" && !lkmnosys) || \
318 funcname == "lkmressys") {
319 printf("%s\t%s __P((struct thread *, struct %s *))",
320 rettype, funcname, argalias) > sysdcl
321 printf(";\n") > sysdcl
323 if (funcname == "nosys")
325 if (funcname == "lkmnosys")
327 printf("\t{ %s%s, (sy_call_t *)", mpsafe, argssize) > sysent
328 column = 8 + 2 + length(mpsafe) + length(argssize) + 15
329 if ($2 == "NOIMPL") {
330 printf("%s },", "nosys") > sysent
331 column = column + length("nosys") + 3
332 } else if ($2 == "NOSTD") {
333 printf("%s },", "lkmressys") > sysent
334 column = column + length("lkmressys") + 3
336 printf("%s },", funcname) > sysent
337 column = column + length(funcname) + 3
339 align_sysent_comment(column)
340 printf("/* %d = %s */\n", syscall, funcalias) > sysent
341 printf("\t\"%s\",\t\t\t/* %d = %s */\n",
342 funcalias, syscall, funcalias) > sysnames
344 printf("#define\t%s%s\t%d\n", syscallprefix,
345 funcalias, syscall) > syshdr
346 printf(" \\\n\t%s.o", funcalias) > sysmk
351 $2 == "COMPAT" || $2 == "CPT_NOA" {
354 if (argc != 0 && $2 != "CPT_NOA") {
355 printf("struct %s {\n", argalias) > syscompat
356 for (i = 1; i <= argc; i++)
357 printf("\tchar %s_l_[PADL_(%s)]; %s %s; " \
358 "char %s_r_[PADR_(%s)];\n",
359 argname[i], argtype[i],
360 argtype[i], argname[i],
361 argname[i], argtype[i]) > syscompat
362 printf("};\n") > syscompat
364 else if($2 != "CPT_NOA")
365 printf("struct %s {\n\tregister_t dummy;\n};\n",
367 printf("%s\to%s __P((struct thread *, struct %s *));\n",
368 rettype, funcname, argalias) > syscompatdcl
369 printf("\t{ compat(%s%s,%s) },",
370 mpsafe, argssize, funcname) > sysent
371 align_sysent_comment(8 + 9 + length(mpsafe) + \
372 length(argssize) + 1 + length(funcname) + 4)
373 printf("/* %d = old %s */\n", syscall, funcalias) > sysent
374 printf("\t\"old.%s\",\t\t/* %d = old %s */\n",
375 funcalias, syscall, funcalias) > sysnames
376 printf("\t\t\t\t/* %d is old %s */\n",
377 syscall, funcalias) > syshdr
384 printf("%s\to%s();\n", rettype, funcname) > syscompatdcl
385 printf("\t{ compat(%s%s,%s) },",
386 mpsafe, argssize, funcname) > sysent
387 align_sysent_comment(8 + 9 + length(mpsafe) + \
388 length(argssize) + 1 + length(funcname) + 4)
389 printf("/* %d = old %s */\n", syscall, funcalias) > sysent
390 printf("\t\"old.%s\",\t\t/* %d = old %s */\n",
391 funcalias, syscall, funcalias) > sysnames
392 printf("#define\t%s%s\t%d\t/* compatibility; still used by libc */\n",
393 syscallprefix, funcalias, syscall) > syshdr
394 printf(" \\\n\t%s.o", funcalias) > sysmk
399 printf("\t{ 0, (sy_call_t *)nosys },") > sysent
400 align_sysent_comment(34)
401 printf("/* %d = obsolete %s */\n", syscall, comment) > sysent
402 printf("\t\"obs_%s\",\t\t\t/* %d = obsolete %s */\n",
403 $4, syscall, comment) > sysnames
404 printf("\t\t\t\t/* %d is obsolete %s */\n",
405 syscall, comment) > syshdr
410 printf("\t{ 0, (sy_call_t *)nosys },\t\t\t/* %d = %s */\n",
411 syscall, comment) > sysent
412 printf("\t\"#%d\",\t\t\t/* %d = %s */\n",
413 syscall, syscall, comment) > sysnames
418 printf "%s: line %d: unrecognized keyword %s\n", infile, NR, $2
422 printf "\n#define AS(name) (sizeof(struct name) / sizeof(register_t))\n" > sysinc
424 printf "#include \"opt_compat.h\"\n\n" > syssw
425 printf "\n#ifdef %s\n", compat > sysinc
426 printf "#define compat(n, name) n, (sy_call_t *)__CONCAT(o,name)\n" > sysinc
427 printf "#else\n" > sysinc
428 printf "#define compat(n, name) 0, (sy_call_t *)nosys\n" > sysinc
429 printf "#endif\n" > sysinc
432 printf("\n#endif /* %s */\n\n", compat) > syscompatdcl
433 printf("#undef PAD_\n") > syscompatdcl
434 printf("#undef PADL_\n") > syscompatdcl
435 printf("#undef PADR_\n") > syscompatdcl
436 printf("\n#endif /* !%s */\n", sysproto_h) > syscompatdcl
439 printf("};\n") > sysent
440 printf("};\n") > sysnames
441 printf("#define\t%sMAXSYSCALL\t%d\n", syscallprefix, syscall) \
445 cat $sysinc $sysent >> $syssw
446 cat $sysarg $sysdcl $syscompat $syscompatdcl > $sysproto