diff options
author | swallace <swallace@FreeBSD.org> | 1995-10-07 06:24:08 +0000 |
---|---|---|
committer | swallace <swallace@FreeBSD.org> | 1995-10-07 06:24:08 +0000 |
commit | 9c1e10e65e2fb3d6657f1a3e4a30e50c626f1f32 (patch) | |
tree | 26e069792f05e98c8dfcade12a00ffb322f0bcb9 /sys/kern/makesyscalls.sh | |
parent | 12cae21615bf4dc96eb144dbe073218bafdd9a85 (diff) | |
download | FreeBSD-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.sh | 285 |
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 |