From 6b972e0bddd7eacbfc688044f0ac96eb8261d17b Mon Sep 17 00:00:00 2001 From: Bruce Evans Date: Tue, 9 May 2000 21:18:30 +0000 Subject: [PATCH] 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. --- sys/kern/makesyscalls.sh | 59 +++++++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 25 deletions(-) diff --git a/sys/kern/makesyscalls.sh b/sys/kern/makesyscalls.sh index 090616c790d3..37110a02b9e2 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