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.
This commit is contained in:
parent
00288a605e
commit
5b838a859c
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user