- Add the ability to mix multiple flags seperated by pipe ('|') characters
in the type field of system call tables. Specifically, one can now use the 'NO*' types as flags in addition to the 'COMPAT*' types. For example, to tag 'COMPAT*' system calls as living in a KLD via NOSTD. The COMPAT* type is required to be listed first in this case. - Add new functions 'type()' and 'flag()' to the embedded awk script in makesyscalls.sh that return true if a requested flag is found in the type field ($3). The flag() function checks all of the flags in the field, but type() only checks the first flag. type() is meant to be used in the top-level "switch" statement and flag() should be used otherwise. - Retire the CPT_NOA type, it is now replaced with "COMPAT|NOARGS" using the flags approach. - Tweak the comment descriptions of COMPAT[46] system calls so that they say "freebsd[46] foo" rather than "old foo". - Document the COMPAT6 type. - Sync comments in compat32 syscall table with the master table.
This commit is contained in:
parent
af1efe0490
commit
fd29528e09
@ -5,15 +5,17 @@
|
||||
; System call name/number master file.
|
||||
; Processed to created init_sysent.c, syscalls.c and syscall.h.
|
||||
|
||||
; Columns: number audit type nargs name alt{name,tag,rtyp}/comments
|
||||
; Columns: number audit type name alt{name,tag,rtyp}/comments
|
||||
; number system call number, must be in order
|
||||
; audit the audit event associated with the system call
|
||||
; A value of AUE_NULL means no auditing, but it also means that
|
||||
; there is no audit event for the call at this time. For the
|
||||
; case where the event exists, but we don't want auditing, the
|
||||
; event should be #defined to AUE_NULL in audit_kevents.h.
|
||||
; type one of STD, OBSOL, UNIMPL, COMPAT, CPT_NOA, LIBCOMPAT,
|
||||
; NODEF, NOARGS, NOPROTO, NOIMPL, NOSTD, COMPAT4
|
||||
; type one of STD, OBSOL, UNIMPL, COMPAT, COMPAT4, COMPAT6,
|
||||
; LIBCOMPAT, NODEF, NOARGS, NOPROTO, NOSTD
|
||||
; The COMPAT* options may be combined with one or more NO*
|
||||
; options separated by '|' with no spaces (e.g. COMPAT|NOARGS)
|
||||
; name psuedo-prototype of syscall routine
|
||||
; If one of the following alts is different, then all appear:
|
||||
; altname name of system call if different
|
||||
@ -25,11 +27,12 @@
|
||||
; STD always included
|
||||
; COMPAT included on COMPAT #ifdef
|
||||
; COMPAT4 included on COMPAT4 #ifdef (FreeBSD 4 compat)
|
||||
; COMPAT6 included on COMPAT4 #ifdef (FreeBSD 6 compat)
|
||||
; LIBCOMPAT included on COMPAT #ifdef, and placed in syscall.h
|
||||
; OBSOL obsolete, not included in system, only specifies name
|
||||
; UNIMPL not implemented, placeholder only
|
||||
; NOSTD implemented but as a lkm that can be statically
|
||||
; compiled in; sysent entry will be filled with lkmsys
|
||||
; compiled in; sysent entry will be filled with lkmressys
|
||||
; so the SYSCALL_MODULE macro works
|
||||
; NOARGS same as STD except do not create structure in sys/sysproto.h
|
||||
; NODEF same as STD except only have the entry in the syscall table
|
||||
|
@ -213,6 +213,19 @@ s/\$//g
|
||||
print
|
||||
exit 1
|
||||
}
|
||||
# Returns true if the type "name" is the first flag in the type field
|
||||
function type(name, flags, n) {
|
||||
n = split($3, flags, /\|/)
|
||||
return (n > 0 && flags[1] == name)
|
||||
}
|
||||
# Returns true if the flag "name" is set in the type field
|
||||
function flag(name, flags, i, n) {
|
||||
n = split($3, flags, /\|/)
|
||||
for (i = 1; i <= n; i++)
|
||||
if (flags[i] == name)
|
||||
return 1
|
||||
return 0
|
||||
}
|
||||
function align_sysent_comment(column) {
|
||||
printf("\t") > sysent
|
||||
column = column + 8 - column % 8
|
||||
@ -241,7 +254,7 @@ s/\$//g
|
||||
rettype="int"
|
||||
end=NF
|
||||
}
|
||||
if ($3 == "NODEF") {
|
||||
if (flag("NODEF")) {
|
||||
auditev="AUE_NULL"
|
||||
funcname=$4
|
||||
argssize = "AS(" $6 ")"
|
||||
@ -267,11 +280,11 @@ s/\$//g
|
||||
funcalias = funcname
|
||||
if (argalias == "") {
|
||||
argalias = funcname "_args"
|
||||
if ($3 == "COMPAT")
|
||||
if (flag("COMPAT"))
|
||||
argalias = "o" argalias
|
||||
if ($3 == "COMPAT4")
|
||||
if (flag("COMPAT4"))
|
||||
argalias = "freebsd4_" argalias
|
||||
if ($3 == "COMPAT6")
|
||||
if (flag("COMPAT6"))
|
||||
argalias = "freebsd6_" argalias
|
||||
}
|
||||
f++
|
||||
@ -325,8 +338,8 @@ s/\$//g
|
||||
flags = "0";
|
||||
}
|
||||
|
||||
$3 == "STD" || $3 == "NODEF" || $3 == "NOARGS" || $3 == "NOPROTO" \
|
||||
|| $3 == "NOSTD" {
|
||||
type("STD") || type("NODEF") || type("NOARGS") || type("NOPROTO") \
|
||||
|| type("NOSTD") {
|
||||
parseline()
|
||||
printf("\t/* %s */\n\tcase %d: {\n", funcname, syscall) > systrace
|
||||
printf("\t/* %s */\n\tcase %d:\n", funcname, syscall) > systracetmp
|
||||
@ -352,8 +365,8 @@ s/\$//g
|
||||
}
|
||||
printf("\t\t*n_args = %d;\n\t\tbreak;\n\t}\n", argc) > systrace
|
||||
printf("\t\tbreak;\n") > systracetmp
|
||||
if (argc != 0 && $3 != "NOARGS" && $3 != "NOPROTO" && \
|
||||
$3 != "NODEF") {
|
||||
if (argc != 0 && !flag("NOARGS") && !flag("NOPROTO") && \
|
||||
!flag("NODEF")) {
|
||||
printf("struct %s {\n", argalias) > sysarg
|
||||
for (i = 1; i <= argc; i++)
|
||||
printf("\tchar %s_l_[PADL_(%s)]; " \
|
||||
@ -363,10 +376,10 @@ s/\$//g
|
||||
argname[i], argtype[i]) > sysarg
|
||||
printf("};\n") > sysarg
|
||||
}
|
||||
else if ($3 != "NOARGS" && $3 != "NOPROTO" && $3 != "NODEF")
|
||||
else if (!flag("NOARGS") && !flag("NOPROTO") && !flag("NODEF"))
|
||||
printf("struct %s {\n\tregister_t dummy;\n};\n",
|
||||
argalias) > sysarg
|
||||
if ($3 != "NOPROTO" && $3 != "NODEF") {
|
||||
if (!flag("NOPROTO") && !flag("NODEF")) {
|
||||
printf("%s\t%s(struct thread *, struct %s *)",
|
||||
rettype, funcname, argalias) > sysdcl
|
||||
printf(";\n") > sysdcl
|
||||
@ -375,7 +388,7 @@ s/\$//g
|
||||
}
|
||||
printf("\t{ %s, (sy_call_t *)", argssize) > sysent
|
||||
column = 8 + 2 + length(argssize) + 15
|
||||
if ($3 == "NOSTD") {
|
||||
if (flag("NOSTD")) {
|
||||
printf("%s },", "lkmressys, AUE_NULL, NULL, 0, 0, 0") > sysent
|
||||
column = column + length("lkmressys") + length("AUE_NULL") + 3
|
||||
} else {
|
||||
@ -386,7 +399,7 @@ s/\$//g
|
||||
printf("/* %d = %s */\n", syscall, funcalias) > sysent
|
||||
printf("\t\"%s\",\t\t\t/* %d = %s */\n",
|
||||
funcalias, syscall, funcalias) > sysnames
|
||||
if ($3 != "NODEF") {
|
||||
if (!flag("NODEF")) {
|
||||
printf("#define\t%s%s\t%d\n", syscallprefix,
|
||||
funcalias, syscall) > syshdr
|
||||
printf(" \\\n\t%s.o", funcalias) > sysmk
|
||||
@ -394,28 +407,32 @@ s/\$//g
|
||||
syscall++
|
||||
next
|
||||
}
|
||||
$3 == "COMPAT" || $3 == "COMPAT4" || $3 == "COMPAT6" || $3 == "CPT_NOA" {
|
||||
if ($3 == "COMPAT" || $3 == "CPT_NOA") {
|
||||
type("COMPAT") || type("COMPAT4") || type("COMPAT6") {
|
||||
if (flag("COMPAT")) {
|
||||
ncompat++
|
||||
out = syscompat
|
||||
outdcl = syscompatdcl
|
||||
wrap = "compat"
|
||||
prefix = "o"
|
||||
} else if ($3 == "COMPAT4") {
|
||||
descr = "old"
|
||||
} else if (flag("COMPAT4")) {
|
||||
ncompat4++
|
||||
out = syscompat4
|
||||
outdcl = syscompat4dcl
|
||||
wrap = "compat4"
|
||||
prefix = "freebsd4_"
|
||||
} else if ($3 == "COMPAT6") {
|
||||
descr = "freebsd4"
|
||||
} else if (flag("COMPAT6")) {
|
||||
ncompat6++
|
||||
out = syscompat6
|
||||
outdcl = syscompat6dcl
|
||||
wrap = "compat6"
|
||||
prefix = "freebsd6_"
|
||||
descr = "freebsd6"
|
||||
}
|
||||
parseline()
|
||||
if (argc != 0 && $3 != "CPT_NOA") {
|
||||
if (argc != 0 && !flag("NOARGS") && !flag("NOPROTO") && \
|
||||
!flag("NODEF")) {
|
||||
printf("struct %s {\n", argalias) > out
|
||||
for (i = 1; i <= argc; i++)
|
||||
printf("\tchar %s_l_[PADL_(%s)]; %s %s; " \
|
||||
@ -425,22 +442,32 @@ s/\$//g
|
||||
argname[i], argtype[i]) > out
|
||||
printf("};\n") > out
|
||||
}
|
||||
else if($3 != "CPT_NOA")
|
||||
else if (!flag("NOARGS") && !flag("NOPROTO") && !flag("NODEF"))
|
||||
printf("struct %s {\n\tregister_t dummy;\n};\n",
|
||||
argalias) > sysarg
|
||||
printf("%s\t%s%s(struct thread *, struct %s *);\n",
|
||||
rettype, prefix, funcname, argalias) > outdcl
|
||||
printf("\t{ %s(%s,%s), %s, NULL, 0, 0, %s },",
|
||||
wrap, argssize, funcname, auditev, flags) > sysent
|
||||
align_sysent_comment(8 + 9 + \
|
||||
length(argssize) + 1 + length(funcname) + length(auditev) + length(flags) + 4)
|
||||
printf("/* %d = old %s */\n", syscall, funcalias) > sysent
|
||||
printf("\t\"%s.%s\",\t\t/* %d = old %s */\n",
|
||||
wrap, funcalias, syscall, funcalias) > sysnames
|
||||
if ($3 == "COMPAT" || $3 == "CPT_NOA") {
|
||||
if (!flag("NOPROTO") && !flag("NODEF")) {
|
||||
printf("%s\t%s%s(struct thread *, struct %s *);\n",
|
||||
rettype, prefix, funcname, argalias) > outdcl
|
||||
}
|
||||
if (flag("NOSTD")) {
|
||||
printf("\t{ %s, (sy_call_t *)%s, %s, NULL, 0, 0, 0 },",
|
||||
"0", "lkmressys", "AUE_NULL") > sysent
|
||||
align_sysent_comment(8 + 2 + length("0") + 15 + \
|
||||
length("lkmressys") + length("AUE_NULL") + 3)
|
||||
} else {
|
||||
printf("\t{ %s(%s,%s), %s, NULL, 0, 0, %s },",
|
||||
wrap, argssize, funcname, auditev, flags) > sysent
|
||||
align_sysent_comment(8 + 9 + length(argssize) + 1 + \
|
||||
length(funcname) + length(auditev) + \
|
||||
length(flags) + 4)
|
||||
}
|
||||
printf("/* %d = %s %s */\n", syscall, descr, funcalias) > sysent
|
||||
printf("\t\"%s.%s\",\t\t/* %d = %s %s */\n",
|
||||
wrap, funcalias, syscall, descr, funcalias) > sysnames
|
||||
if (flag("COMPAT")) {
|
||||
printf("\t\t\t\t/* %d is old %s */\n",
|
||||
syscall, funcalias) > syshdr
|
||||
} else {
|
||||
} else if (!flag("NODEF")) {
|
||||
printf("#define\t%s%s%s\t%d\n", syscallprefix,
|
||||
prefix, funcalias, syscall) > syshdr
|
||||
printf(" \\\n\t%s%s.o", prefix, funcalias) > sysmk
|
||||
@ -448,7 +475,7 @@ s/\$//g
|
||||
syscall++
|
||||
next
|
||||
}
|
||||
$3 == "LIBCOMPAT" {
|
||||
type("LIBCOMPAT") {
|
||||
ncompat++
|
||||
parseline()
|
||||
printf("%s\to%s();\n", rettype, funcname) > syscompatdcl
|
||||
@ -465,7 +492,7 @@ s/\$//g
|
||||
syscall++
|
||||
next
|
||||
}
|
||||
$3 == "OBSOL" {
|
||||
type("OBSOL") {
|
||||
printf("\t{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 },") > sysent
|
||||
align_sysent_comment(34)
|
||||
printf("/* %d = obsolete %s */\n", syscall, comment) > sysent
|
||||
@ -476,7 +503,7 @@ s/\$//g
|
||||
syscall++
|
||||
next
|
||||
}
|
||||
$3 == "UNIMPL" {
|
||||
type("UNIMPL") {
|
||||
printf("\t{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 },\t\t\t/* %d = %s */\n",
|
||||
syscall, comment) > sysent
|
||||
printf("\t\"#%d\",\t\t\t/* %d = %s */\n",
|
||||
|
@ -11,8 +11,10 @@
|
||||
; there is no audit event for the call at this time. For the
|
||||
; case where the event exists, but we don't want auditing, the
|
||||
; event should be #defined to AUE_NULL in audit_kevents.h.
|
||||
; type one of STD, OBSOL, UNIMPL, COMPAT, CPT_NOA, LIBCOMPAT,
|
||||
; NODEF, NOARGS, NOPROTO, NOSTD, COMPAT4
|
||||
; type one of STD, OBSOL, UNIMPL, COMPAT, COMPAT4, COMPAT6,
|
||||
; LIBCOMPAT, NODEF, NOARGS, NOPROTO, NOSTD
|
||||
; The COMPAT* options may be combined with one or more NO*
|
||||
; options separated by '|' with no spaces (e.g. COMPAT|NOARGS)
|
||||
; name psuedo-prototype of syscall routine
|
||||
; If one of the following alts is different, then all appear:
|
||||
; altname name of system call if different
|
||||
@ -24,6 +26,7 @@
|
||||
; STD always included
|
||||
; COMPAT included on COMPAT #ifdef
|
||||
; COMPAT4 included on COMPAT4 #ifdef (FreeBSD 4 compat)
|
||||
; COMPAT6 included on COMPAT4 #ifdef (FreeBSD 6 compat)
|
||||
; LIBCOMPAT included on COMPAT #ifdef, and placed in syscall.h
|
||||
; OBSOL obsolete, not included in system, only specifies name
|
||||
; UNIMPL not implemented, placeholder only
|
||||
@ -214,7 +217,7 @@
|
||||
int protocol); }
|
||||
98 AUE_CONNECT STD { int connect(int s, caddr_t name, \
|
||||
int namelen); }
|
||||
99 AUE_ACCEPT CPT_NOA { int accept(int s, caddr_t name, \
|
||||
99 AUE_ACCEPT COMPAT|NOARGS { int accept(int s, caddr_t name, \
|
||||
int *anamelen); } accept accept_args int
|
||||
100 AUE_GETPRIORITY STD { int getpriority(int which, int who); }
|
||||
101 AUE_SEND COMPAT { int send(int s, caddr_t buf, int len, \
|
||||
@ -258,7 +261,7 @@
|
||||
struct timezone *tzp); }
|
||||
123 AUE_FCHOWN STD { int fchown(int fd, int uid, int gid); }
|
||||
124 AUE_FCHMOD STD { int fchmod(int fd, int mode); }
|
||||
125 AUE_RECVFROM CPT_NOA { int recvfrom(int s, caddr_t buf, \
|
||||
125 AUE_RECVFROM COMPAT|NOARGS { int recvfrom(int s, caddr_t buf, \
|
||||
size_t len, int flags, caddr_t from, int \
|
||||
*fromlenaddr); } recvfrom recvfrom_args \
|
||||
int
|
||||
@ -294,7 +297,7 @@
|
||||
148 AUE_QUOTACTL STD { int quotactl(char *path, int cmd, int uid, \
|
||||
caddr_t arg); }
|
||||
149 AUE_O_QUOTA COMPAT { int quota(void); }
|
||||
150 AUE_GETSOCKNAME CPT_NOA { int getsockname(int fdec, \
|
||||
150 AUE_GETSOCKNAME COMPAT|NOARGS { int getsockname(int fdec, \
|
||||
caddr_t asa, int *alen); } getsockname \
|
||||
getsockname_args int
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user