summaryrefslogtreecommitdiffstats
path: root/sys/kern/makesyscalls.sh
diff options
context:
space:
mode:
authorbde <bde@FreeBSD.org>2000-05-09 21:18:30 +0000
committerbde <bde@FreeBSD.org>2000-05-09 21:18:30 +0000
commitdc4d8418661bd3c00c580e5c5d67a7497297bc7a (patch)
tree265f1f6f404e9a2180b2b4e7dfae653bc8e38f33 /sys/kern/makesyscalls.sh
parent644c23642152acc1dd5b496517e96db2ed73bea9 (diff)
downloadFreeBSD-src-dc4d8418661bd3c00c580e5c5d67a7497297bc7a.zip
FreeBSD-src-dc4d8418661bd3c00c580e5c5d67a7497297bc7a.tar.gz
Fixed the calculation of sy_nargs in sysent tables. We attempted to do
this in awk using the hack of counting args of type off_t twice and args of all other types once. This is too simple to work. It gave benignly wrong results on alphas (off_t shouldn't be counted twice) and for svr4_sys_mmap64() on i386's (off64_t should be counted twice). It gave fatally wrong results for i386's with 64-bit longs (longs should be counted twice). The correct value for sy_nargs is easier to determine from the size of the args struct anyway, except for complications to make the generated code almost readable. Improved formatting of sysent tables by lining up the comments where possible.
Diffstat (limited to 'sys/kern/makesyscalls.sh')
-rw-r--r--sys/kern/makesyscalls.sh59
1 files changed, 34 insertions, 25 deletions
diff --git a/sys/kern/makesyscalls.sh b/sys/kern/makesyscalls.sh
index 090616c..37110a0 100644
--- a/sys/kern/makesyscalls.sh
+++ b/sys/kern/makesyscalls.sh
@@ -170,6 +170,14 @@ s/\$//g
print
exit 1
}
+ function align_sysent_comment(column) {
+ printf("\t") > sysent
+ column = column + 8 - column % 8
+ while (column < 56) {
+ printf("\t") > sysent
+ column = column + 8
+ }
+ }
function parserr(was, wanted) {
printf "%s: line %d: unexpected %s (expected %s)\n",
infile, NR, was, wanted
@@ -178,7 +186,7 @@ s/\$//g
function parseline() {
f=4 # toss number and type
argc= 0;
- bigargc = 0;
+ argssize = "0"
if ($NF != "}") {
funcalias=$(NF-2)
argalias=$(NF-1)
@@ -242,24 +250,24 @@ s/\$//g
}
if (argtype[argc] == "")
parserr($f, "argument definition")
- if (argtype[argc] == "off_t")
- bigargc++
argname[argc]=$f;
f += 2; # skip name, and any comma
}
+ if (argc != 0)
+ argssize = "AS(" argalias ")"
}
{ comment = $4
if (NF < 7)
for (i = 5; i <= NF; i++)
comment = comment " " $i
}
- mpsafe = 0;
# if the "MPSAFE" keyword is found, note it and shift the line
+ mpsafe = ""
$2 == "MPSAFE" {
for (i = 2; i <= NF; i++)
$i = $(i + 1);
NF -= 1;
- mpsafe = 1;
+ mpsafe = "SYF_MPSAFE | "
}
$2 == "STD" || $2 == "NODEF" || $2 == "NOARGS" || $2 == "NOPROTO" \
|| $2 == "NOIMPL" {
@@ -290,21 +298,16 @@ s/\$//g
nosys = 1
if (funcname == "lkmnosys")
lkmnosys = 1
- printf("\t{ %s%d, (sy_call_t *)",
- mpsafe == 1 ? "SYF_MPSAFE | " : "", argc+bigargc) > sysent
+ printf("\t{ %s%s, (sy_call_t *)", mpsafe, argssize) > sysent
+ column = 8 + 2 + length(mpsafe) + length(argssize) + 15
if ($2 != "NOIMPL") {
- printf("%s },\t",
- funcname) > sysent
- if(length(funcname) < 11)
- printf("\t") > sysent
+ printf("%s },", funcname) > sysent
+ column = column + length(funcname) + 3
} else {
- printf("%s },\t",
- "nosys") > sysent
- if(length("nosys") < 11)
- printf("\t") > sysent
+ printf("%s },", "nosys") > sysent
+ column = column + length("nosys") + 3
}
- if (mpsafe == 0)
- printf("\t") > sysent
+ align_sysent_comment(column)
printf("/* %d = %s */\n", syscall, funcalias) > sysent
printf("\t\"%s\",\t\t\t/* %d = %s */\n",
funcalias, syscall, funcalias) > sysnames
@@ -334,9 +337,11 @@ s/\$//g
argalias) > sysarg
printf("%s\to%s __P((struct proc *, struct %s *));\n",
rettype, funcname, argalias) > syscompatdcl
- printf("\t{ compat(%s%d,%s) },\t\t/* %d = old %s */\n",
- mpsafe == 1 ? "SYF_MPSAFE | " : "",
- argc+bigargc, funcname, syscall, funcalias) > sysent
+ printf("\t{ compat(%s%s,%s) },",
+ mpsafe, argssize, funcname) > sysent
+ align_sysent_comment(8 + 9 + length(mpsafe) + \
+ length(argssize) + 1 + length(funcname) + 4)
+ printf("/* %d = old %s */\n", 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",
@@ -350,9 +355,11 @@ s/\$//g
ncompat++
parseline()
printf("%s\to%s();\n", rettype, funcname) > syscompatdcl
- printf("\t{ compat(%s%d,%s) },\t\t/* %d = old %s */\n",
- mpsafe == 1 ? "SYF_MPSAFE | " : "",
- argc+bigargc, funcname, syscall, funcalias) > sysent
+ printf("\t{ compat(%s%s,%s) },",
+ mpsafe, argssize, funcname) > sysent
+ align_sysent_comment(8 + 9 + length(mpsafe) + \
+ length(argssize) + 1 + length(funcname) + 4)
+ printf("/* %d = old %s */\n", 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",
@@ -364,8 +371,9 @@ s/\$//g
next
}
$2 == "OBSOL" {
- printf("\t{ 0, (sy_call_t *)nosys },\t\t\t/* %d = obsolete %s */\n",
- syscall, comment) > sysent
+ printf("\t{ 0, (sy_call_t *)nosys },") > sysent
+ align_sysent_comment(34)
+ printf("/* %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",
@@ -390,6 +398,7 @@ s/\$//g
exit 1
}
END {
+ printf "\n#define AS(name) (sizeof(struct name) / sizeof(register_t))\n" > sysinc
if (ncompat != 0) {
printf "#include \"opt_compat.h\"\n\n" > syssw
printf "\n#ifdef %s\n", compat > sysinc
OpenPOWER on IntegriCloud