summaryrefslogtreecommitdiffstats
path: root/sys/kern/makesyscalls.sh
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/makesyscalls.sh')
-rw-r--r--sys/kern/makesyscalls.sh360
1 files changed, 360 insertions, 0 deletions
diff --git a/sys/kern/makesyscalls.sh b/sys/kern/makesyscalls.sh
new file mode 100644
index 0000000..a7ded79
--- /dev/null
+++ b/sys/kern/makesyscalls.sh
@@ -0,0 +1,360 @@
+#! /bin/sh -
+# @(#)makesyscalls.sh 8.1 (Berkeley) 6/10/93
+# $FreeBSD$
+
+set -e
+
+# name of compat option:
+compat=COMPAT_43
+
+# output files:
+sysnames="syscalls.c"
+sysproto="../sys/sysproto.h"
+sysproto_h=_SYS_SYSPROTO_H_
+syshdr="../sys/syscall.h"
+syssw="init_sysent.c"
+syshide="../sys/syscall-hide.h"
+syscallprefix="SYS_"
+switchname="sysent"
+namesname="syscallnames"
+
+# tmp files:
+sysdcl="sysent.dcl"
+syscompat="sysent.compat"
+syscompatdcl="sysent.compatdcl"
+sysent="sysent.switch"
+sysinc="sysinc.switch"
+sysarg="sysarg.switch"
+
+trap "rm $sysdcl $syscompat $syscompatdcl $sysent $sysinc $sysarg" 0
+
+case $# in
+ 0) echo "Usage: $0 input-file <config-file>" 1>&2
+ exit 1
+ ;;
+esac
+
+if [ -f $2 ]; then
+ . $2
+fi
+
+sed -e '
+s/\$//g
+:join
+ /\\$/{a\
+
+ N
+ s/\\\n//
+ b join
+ }
+2,${
+ /^#/!s/\([{}()*,]\)/ \1 /g
+}
+' < $1 | awk "
+ BEGIN {
+ sysdcl = \"$sysdcl\"
+ sysproto = \"$sysproto\"
+ sysproto_h = \"$sysproto_h\"
+ syscompat = \"$syscompat\"
+ syscompatdcl = \"$syscompatdcl\"
+ sysent = \"$sysent\"
+ sysinc = \"$sysinc\"
+ sysarg = \"$sysarg\"
+ sysnames = \"$sysnames\"
+ syshdr = \"$syshdr\"
+ compat = \"$compat\"
+ syshide = \"$syshide\"
+ syscallprefix = \"$syscallprefix\"
+ switchname = \"$switchname\"
+ namesname = \"$namesname\"
+ infile = \"$1\"
+ "'
+
+ printf "/*\n * System call switch table.\n *\n" > sysinc
+ printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysinc
+
+ printf "/*\n * System call prototypes.\n *\n" > sysarg
+ printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysarg
+
+ printf "\n#ifdef %s\n\n", compat > syscompat
+
+ printf "/*\n * System call names.\n *\n" > sysnames
+ printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysnames
+
+ printf "/*\n * System call numbers.\n *\n" > syshdr
+ printf " * DO NOT EDIT-- this file is automatically generated.\n" > syshdr
+ printf "/*\n * System call hiders.\n *\n" > syshide
+ printf " * DO NOT EDIT-- this file is automatically generated.\n" > syshide
+ }
+ NR == 1 {
+ gsub("[$]FreeBSD: ", "", $0)
+ gsub(" [$]", "", $0)
+
+ printf " * created from%s\n */\n\n", $0 > sysinc
+
+ printf "\n#ifdef %s\n", compat > sysent
+ printf "#define compat(n, name) n, (sy_call_t *)__CONCAT(o,name)\n" > sysent
+ printf("#else\n") > sysent
+ printf("#define compat(n, name) 0, (sy_call_t *)nosys\n") > sysent
+ printf("#endif\n\n") > sysent
+ printf("/* The casts are bogus but will do for now. */\n") > sysent
+ printf "struct sysent %s[] = {\n",switchname > sysent
+
+ printf " * created from%s\n */\n\n", $0 > sysarg
+ printf("#ifndef %s\n", sysproto_h) > sysarg
+ printf("#define\t%s\n\n", sysproto_h) > sysarg
+ printf "#include <sys/signal.h>\n\n", $0 > sysarg
+
+ printf " * created from%s\n */\n\n", $0 > sysnames
+ printf "char *%s[] = {\n", namesname > sysnames
+
+ printf " * created from%s\n */\n\n", $0 > syshdr
+
+ printf " * created from%s\n */\n\n", $0 > syshide
+ next
+ }
+ NF == 0 || $1 ~ /^;/ {
+ next
+ }
+ $1 ~ /^#[ ]*include/ {
+ print > sysinc
+ next
+ }
+ $1 ~ /^#[ ]*if/ {
+ print > sysent
+ print > sysdcl
+ print > sysarg
+ print > syscompat
+ print > sysnames
+ print > syshide
+ savesyscall = syscall
+ next
+ }
+ $1 ~ /^#[ ]*else/ {
+ print > sysent
+ print > sysdcl
+ print > sysarg
+ print > syscompat
+ print > sysnames
+ print > syshide
+ syscall = savesyscall
+ next
+ }
+ $1 ~ /^#/ {
+ print > sysent
+ print > sysdcl
+ print > sysarg
+ print > syscompat
+ print > sysnames
+ print > syshide
+ next
+ }
+ syscall != $1 {
+ printf "%s: line %d: syscall number out of sync at %d\n", \
+ infile, NR, syscall
+ printf "line is:\n"
+ print
+ exit 1
+ }
+ function parserr(was, wanted) {
+ printf "%s: line %d: unexpected %s (expected %s)\n", \
+ infile, NR, was, wanted
+ exit 1
+ }
+ function parseline() {
+ f=4 # toss number and type
+ argc= 0;
+ bigargc = 0;
+ if ($NF != "}") {
+ funcalias=$(NF-2)
+ argalias=$(NF-1)
+ rettype=$NF
+ end=NF-3
+ } else {
+ funcalias=""
+ argalias=""
+ rettype="int"
+ end=NF
+ }
+ if ($2 == "NODEF") {
+ funcname=$4
+ return
+ }
+ if ($f != "{")
+ parserr($f, "{")
+ f++
+ if ($end != "}")
+ parserr($end, "}")
+ end--
+ if ($end != ";")
+ parserr($end, ";")
+ end--
+ if ($end != ")")
+ parserr($end, ")")
+ end--
+
+ f++ #function return type
+
+ funcname=$f
+ if (funcalias == "")
+ funcalias = funcname
+ if (argalias == "") {
+ argalias = funcname "_args"
+ if ($2 == "COMPAT")
+ argalias = "o" argalias
+ }
+ f++
+
+ if ($f != "(")
+ parserr($f, ")")
+ f++
+
+ if (f == end) {
+ if ($f != "void")
+ parserr($f, "argument definition")
+ return
+ }
+
+ while (f <= end) {
+ argc++
+ argtype[argc]=""
+ oldf=""
+ while (f < end && $(f+1) != ",") {
+ if (argtype[argc] != "" && oldf != "*")
+ argtype[argc] = argtype[argc]" ";
+ argtype[argc] = argtype[argc]$f;
+ oldf = $f;
+ f++
+ }
+ if (argtype[argc] == "")
+ parserr($f, "argument definition")
+ if (argtype[argc] == "off_t")
+ bigargc++
+ argname[argc]=$f;
+ f += 2; # skip name, and any comma
+ }
+ }
+ { comment = $4
+ if (NF < 7)
+ for (i = 5; i <= NF; i++)
+ comment = comment " " $i
+ }
+ $2 == "STD" || $2 == "NODEF" || $2 == "NOARGS" || $2 == "NOPROTO" {
+ parseline()
+ if ((!nosys || funcname != "nosys") && \
+ (funcname != "lkmnosys")) {
+ if (argc != 0 && $2 != "NOARGS" && $2 != "NOPROTO") {
+ printf("struct\t%s {\n", argalias) > sysarg
+ for (i = 1; i <= argc; i++)
+ printf("\t%s %s;\n", argtype[i],
+ argname[i]) > sysarg
+ printf("};\n") > sysarg
+ }
+ else if($2 != "NOARGS" && $2 != "NOPROTO")
+ printf("struct\t%s {\n\tint dummy;\n};\n", \
+ argalias) > sysarg
+ }
+ if ($2 != "NOPROTO" && (!nosys || funcname != "nosys") && \
+ (!lkmnosys || funcname != "lkmnosys")) {
+ printf("%s\t%s __P((struct proc *, struct %s *, int []))", \
+ rettype, funcname, argalias) > sysdcl
+ if (funcname == "exit")
+ printf(" __dead2") > sysdcl
+ printf(";\n") > sysdcl
+ }
+ if (funcname == "nosys")
+ nosys = 1
+ if (funcname == "lkmnosys")
+ lkmnosys = 1
+ printf("\t{ %d, (sy_call_t *)%s },\t\t", \
+ argc+bigargc, funcname) > sysent
+ if(length(funcname) < 11)
+ printf("\t") > sysent
+ printf("/* %d = %s */\n", syscall, funcalias) > sysent
+ printf("\t\"%s\",\t\t\t/* %d = %s */\n", \
+ funcalias, syscall, funcalias) > sysnames
+ if ($2 != "NODEF")
+ printf("#define\t%s%s\t%d\n", syscallprefix, \
+ funcalias, syscall) > syshdr
+ if ($3 != "NOHIDE")
+ printf("HIDE_%s(%s)\n", $3, funcname) > syshide
+ syscall++
+ next
+ }
+ $2 == "COMPAT" || $2 == "CPT_NOA" {
+ parseline()
+ if (argc != 0 && $2 != "CPT_NOA") {
+ printf("struct\t%s {\n", argalias) > syscompat
+ for (i = 1; i <= argc; i++)
+ printf("\t%s %s;\n", argtype[i],
+ argname[i]) > syscompat
+ printf("};\n") > syscompat
+ }
+ else if($2 != "CPT_NOA")
+ printf("struct\t%s {\n\tint dummy;\n};\n", \
+ argalias) > sysarg
+ printf("%s\to%s __P((struct proc *, struct %s *, int []));\n", \
+ rettype, funcname, argalias) > syscompatdcl
+ printf("\t{ compat(%d,%s) },\t\t/* %d = old %s */\n", \
+ argc+bigargc, funcname, syscall, funcalias) > sysent
+ printf("\t\"old.%s\",\t\t/* %d = old %s */\n", \
+ funcalias, syscall, funcalias) > sysnames
+ printf("\t\t\t\t/* %d is old %s */\n", \
+ syscall, funcalias) > syshdr
+ if ($3 != "NOHIDE")
+ printf("HIDE_%s(%s)\n", $3, funcname) > syshide
+ syscall++
+ next
+ }
+ $2 == "LIBCOMPAT" {
+ parseline()
+ printf("%s\to%s();\n", rettype, funcname) > syscompatdcl
+ printf("\t{ compat(%d,%s) },\t\t/* %d = old %s */\n", \
+ argc+bigargc, funcname, syscall, funcalias) > sysent
+ printf("\t\"old.%s\",\t\t/* %d = old %s */\n", \
+ funcalias, syscall, funcalias) > sysnames
+ printf("#define\t%s%s\t%d\t/* compatibility; still used by libc */\n", \
+ syscallprefix, funcalias, syscall) > syshdr
+ if ($3 != "NOHIDE")
+ printf("HIDE_%s(%s)\n", $3, funcname) > syshide
+ syscall++
+ next
+ }
+ $2 == "OBSOL" {
+ printf("\t{ 0, (sy_call_t *)nosys },\t\t\t/* %d = obsolete %s */\n", \
+ syscall, comment) > sysent
+ printf("\t\"obs_%s\",\t\t\t/* %d = obsolete %s */\n", \
+ $4, syscall, comment) > sysnames
+ printf("\t\t\t\t/* %d is obsolete %s */\n", \
+ syscall, comment) > syshdr
+ if ($3 != "NOHIDE")
+ printf("HIDE_%s(%s)\n", $3, $4) > syshide
+ syscall++
+ next
+ }
+ $2 == "UNIMPL" {
+ printf("\t{ 0, (sy_call_t *)nosys },\t\t\t/* %d = %s */\n", \
+ syscall, comment) > sysent
+ printf("\t\"#%d\",\t\t\t/* %d = %s */\n", \
+ syscall, syscall, comment) > sysnames
+ if ($3 != "NOHIDE")
+ printf("HIDE_%s(%s)\n", $3, $4) > syshide
+ syscall++
+ next
+ }
+ {
+ printf "%s: line %d: unrecognized keyword %s\n", infile, NR, $2
+ exit 1
+ }
+ END {
+ printf("\n#endif /* %s */\n", compat) > syscompatdcl
+ printf("\n#endif /* !%s */\n", sysproto_h) > syscompatdcl
+
+ printf("};\n") > sysent
+ printf("};\n") > sysnames
+ printf("#define\t%sMAXSYSCALL\t%d\n", syscallprefix, syscall) \
+ > syshdr
+ } '
+
+cat $sysinc $sysent >$syssw
+cat $sysarg $sysdcl $syscompat $syscompatdcl > $sysproto
OpenPOWER on IntegriCloud