summaryrefslogtreecommitdiffstats
path: root/sys/kern/makesyscalls.sh
diff options
context:
space:
mode:
authorswallace <swallace@FreeBSD.org>1995-10-07 06:24:08 +0000
committerswallace <swallace@FreeBSD.org>1995-10-07 06:24:08 +0000
commit9c1e10e65e2fb3d6657f1a3e4a30e50c626f1f32 (patch)
tree26e069792f05e98c8dfcade12a00ffb322f0bcb9 /sys/kern/makesyscalls.sh
parent12cae21615bf4dc96eb144dbe073218bafdd9a85 (diff)
downloadFreeBSD-src-9c1e10e65e2fb3d6657f1a3e4a30e50c626f1f32.zip
FreeBSD-src-9c1e10e65e2fb3d6657f1a3e4a30e50c626f1f32.tar.gz
Add new functionality to makesyscalls.sh:
o optional config-file to set vars: sysnames, sysproto, sysproto_h, syshdr, syssw, syshide, syscallprefix, switchname, namesname, sysvec. o change syntax of syscalls.master entry: remove argument count. add pseudo-prototype field defining function name and arguments. o generates correct structure definitions for all system calls in sys/sysproto.h o add type NOARGS: same as STD except do not create structure in sys/sysproto.h o add type NOPROTO: same as STD except do not create structure or function prototype in sys/sysproto.h New functionality provides complete prototype definitions. Usefull for generating files for emulated systems like my new ibcs2 code. Update syscalls.master to reflect new changes. For example, read() entry now looks like: 3 STD POSIX { int ibcs2_read(int fd, char *buf, u_int nbytes); } This is similar to how NetBSD generates these files.
Diffstat (limited to 'sys/kern/makesyscalls.sh')
-rw-r--r--sys/kern/makesyscalls.sh285
1 files changed, 217 insertions, 68 deletions
diff --git a/sys/kern/makesyscalls.sh b/sys/kern/makesyscalls.sh
index 020c5de..ae80407 100644
--- a/sys/kern/makesyscalls.sh
+++ b/sys/kern/makesyscalls.sh
@@ -1,6 +1,6 @@
#! /bin/sh -
# @(#)makesyscalls.sh 8.1 (Berkeley) 6/10/93
-# $Id: makesyscalls.sh,v 1.13 1995/09/19 13:30:51 bde Exp $
+# $Id: makesyscalls.sh,v 1.14 1995/09/19 13:50:26 bde Exp $
set -e
@@ -14,39 +14,69 @@ sysproto_h=_SYS_SYSPROTO_H_
syshdr="../sys/syscall.h"
syssw="init_sysent.c"
syshide="../sys/syscall-hide.h"
+syscallprefix="SYS_"
+switchname="sysent"
+namesname="syscallnames"
+sysvec=""
# tmp files:
sysdcl="sysent.dcl"
syscompat="sysent.compat"
+syscompatdcl="sysent.compatdcl"
sysent="sysent.switch"
+sysinc="sysinc.switch"
+sysarg="sysarg.switch"
-trap "rm $sysdcl $syscompat $sysent" 0
+trap "rm $sysdcl $syscompat $syscompatdcl $sysent $sysinc $sysarg" 0
case $# in
- 0) echo "Usage: $0 input-file" 1>&2
+ 0) echo "Usage: $0 input-file <config-file>" 1>&2
exit 1
;;
esac
-awk < $1 "
+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\"
+ sysvec = \"$sysvec\"
infile = \"$1\"
"'
- printf "/*\n * System call switch table.\n *\n" > sysent
- printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysent
+ 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" > sysdcl
- printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysdcl
+ 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
@@ -61,26 +91,27 @@ awk < $1 "
NR == 1 {
gsub("[$]Id: ", "", $0)
gsub(" [$]", "", $0)
- printf " * created from%s\n */\n\n", $0 > sysent
- printf "#include <sys/param.h>\n" > sysent
- printf "#include <sys/sysent.h>\n" > sysent
- printf "#include <sys/sysproto.h>\n\n" > sysent
- printf "#ifdef %s\n", compat > sysent
+
+ 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 sysent[] = {\n" > sysent
+ printf "struct sysent %s[] = {\n",switchname > sysent
- printf " * created from%s\n */\n\n", $0 > sysdcl
- printf("#ifndef %s\n", sysproto_h) > sysdcl
- printf("#define\t%s\n\n", sysproto_h) > sysdcl
- printf "#include <sys/types.h>\n\n", $0 > sysdcl
- printf "struct proc;\n\n", $0 > sysdcl
+ 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/types.h>\n", $0 > sysarg
+ printf "#include <sys/param.h>\n", $0 > sysarg
+ printf "#include <sys/mount.h>\n\n", $0 > sysarg
+ printf "struct args { int dummy; };\n\n", $0 > sysarg
printf " * created from%s\n */\n\n", $0 > sysnames
- printf "char *syscallnames[] = {\n" > sysnames
+ printf "char *%s[] = {\n", namesname > sysnames
printf " * created from%s\n */\n\n", $0 > syshdr
@@ -90,9 +121,14 @@ awk < $1 "
NF == 0 || $1 ~ /^;/ {
next
}
+ $1 ~ /^#[ ]*include/ {
+ print > sysinc
+ next
+ }
$1 ~ /^#[ ]*if/ {
print > sysent
print > sysdcl
+ print > sysarg
print > syscompat
print > sysnames
print > syshide
@@ -102,6 +138,7 @@ awk < $1 "
$1 ~ /^#[ ]*else/ {
print > sysent
print > sysdcl
+ print > sysarg
print > syscompat
print > sysnames
print > syshide
@@ -111,6 +148,7 @@ awk < $1 "
$1 ~ /^#/ {
print > sysent
print > sysdcl
+ print > sysarg
print > syscompat
print > sysnames
print > syshide
@@ -123,64 +161,163 @@ awk < $1 "
print
exit 1
}
- { comment = $5
- if (NF < 8)
- for (i = 6; i <= NF; i++)
- comment = comment " " $i
- if (NF < 6) {
- $6 = $5
- $7 = $5 "_args"
- if ($2 == "COMPAT")
- $7 = "o" $7
- $8 = "int"
+ 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 ($4 != "NOHIDE")
- printf("HIDE_%s(%s)\n", $4, $5) > syshide
- }
- $2 == "STD" || $2 == "NODEF" {
- if (( !nosys || $5 != "nosys" ) && ( !lkmnosys ||
- $5 != "lkmnosys")) {
- printf("struct\t%s;\n", $7) > sysdcl
- if ($5 == "exit")
- printf("__dead ") > sysdcl
- printf("%s\t%s __P((struct proc *, struct %s *, int []));\n", \
- $8, $5, $7) > sysdcl
+ 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 ($5 == "nosys")
+ f++
+ if ($2 == "COMPAT")
+ argalias = "o" argalias
+
+ 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" ) && ( !lkmnosys ||
+ 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
+ argalias = "args"
+ if ($2 != "NOPROTO") {
+ if (funcname == "exit")
+ printf("__dead ") > sysdcl
+ printf("%s\t%s __P((struct proc *, struct %s *, int []));\n", \
+ rettype, funcname, argalias) > sysdcl
+ }
+ }
+ if (funcname == "nosys")
nosys = 1
- if ($5 == "lkmnosys")
+ if (funcname == "lkmnosys")
lkmnosys = 1
- printf("\t{ %d, (sy_call_t *)%s },\t\t\t/* %d = %s */\n", \
- $3, $5, syscall, $6) > sysent
+ 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", \
- $6, syscall, $6) > sysnames
- if ($2 == "STD")
- printf("#define\tSYS_%s\t%d\n", \
- $6, syscall) > syshdr
+ 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" {
- printf("struct\t%s;\n", $7) > syscompat
+ parseline()
+ if (argc != 0) {
+ 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
+ argalias = "args"
printf("%s\to%s __P((struct proc *, struct %s *, int []));\n", \
- $8, $5, $7) > syscompat
+ rettype, funcname, argalias) > syscompatdcl
printf("\t{ compat(%d,%s) },\t\t/* %d = old %s */\n", \
- $3, $5, syscall, $6) > sysent
+ argc+bigargc, funcname, syscall, funcalias) > sysent
printf("\t\"old.%s\",\t\t/* %d = old %s */\n", \
- $6, syscall, $6) > sysnames
+ funcalias, syscall, funcalias) > sysnames
printf("\t\t\t\t/* %d is old %s */\n", \
- syscall, comment) > syshdr
+ syscall, funcalias) > syshdr
+ if ($3 != "NOHIDE")
+ printf("HIDE_%s(%s)\n", $3, funcname) > syshide
syscall++
next
}
$2 == "LIBCOMPAT" {
- printf("%s\to%s();\n", $8, $5) > syscompat
+ parseline()
+ printf("%s\to%s();\n", rettype, funcname) > syscompatdcl
printf("\t{ compat(%d,%s) },\t\t/* %d = old %s */\n", \
- $3, $5, syscall, $6) > sysent
+ argc+bigargc, funcname, syscall, funcalias) > sysent
printf("\t\"old.%s\",\t\t/* %d = old %s */\n", \
- $6, syscall, $6) > sysnames
- printf("#define\tSYS_%s\t%d\t/* compatibility; still used by libc */\n", \
- $6, syscall) > syshdr
+ 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
}
@@ -188,9 +325,11 @@ awk < $1 "
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", \
- $5, syscall, comment) > sysnames
+ $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
}
@@ -199,6 +338,8 @@ awk < $1 "
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
}
@@ -207,16 +348,24 @@ awk < $1 "
exit 1
}
END {
- printf("\n#endif /* %s */\n", compat) > syscompat
- printf("\n#endif /* !%s */\n", sysproto_h) > syscompat
+ printf("\n#endif /* %s */\n", compat) > syscompatdcl
+ printf("\n#endif /* !%s */\n", sysproto_h) > syscompatdcl
printf("};\n\n") > sysent
- printf ("struct sysentvec aout_sysvec = {\n") > sysent
- printf ("\tsizeof (sysent) / sizeof (sysent[0]),\n") > sysent
- printf ("\tsysent,\n") > sysent
- printf ("\t0,\n\t0,\n\t0,\n\t0,\n\t0,\n\t0\n};\n") > sysent
+ if(sysvec != "")
+ printf(sysvec) > sysent;
+ else {
+ printf ("struct sysentvec aout_sysvec = {\n") > sysent
+ printf ("\tsizeof (%s) / sizeof (%s[0]),\n", \
+ switchname, switchname) > sysent
+ printf ("\t%s,\n", switchname) > sysent
+ printf ("\t0,\n\t0,\n\t0,\n\t0,\n\t0,\n\t0\n};\n") \
+ > sysent
+ }
printf("};\n") > sysnames
+ printf("#define\t%sMAXSYSCALL\t%d\n", syscallprefix, syscall) \
+ > syshdr
} '
-cat $sysent >$syssw
-cat $sysdcl $syscompat >$sysproto
+cat $sysinc $sysent >$syssw
+cat $sysarg $sysdcl $syscompat $syscompatdcl > $sysproto
OpenPOWER on IntegriCloud