svn commit: r194390 - in head/sys: compat/freebsd32 kern

John Baldwin jhb at FreeBSD.org
Wed Jun 17 19:50:39 UTC 2009


Author: jhb
Date: Wed Jun 17 19:50:38 2009
New Revision: 194390
URL: http://svn.freebsd.org/changeset/base/194390

Log:
  - 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.

Modified:
  head/sys/compat/freebsd32/syscalls.master
  head/sys/kern/makesyscalls.sh
  head/sys/kern/syscalls.master

Modified: head/sys/compat/freebsd32/syscalls.master
==============================================================================
--- head/sys/compat/freebsd32/syscalls.master	Wed Jun 17 19:40:53 2009	(r194389)
+++ head/sys/compat/freebsd32/syscalls.master	Wed Jun 17 19:50:38 2009	(r194390)
@@ -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

Modified: head/sys/kern/makesyscalls.sh
==============================================================================
--- head/sys/kern/makesyscalls.sh	Wed Jun 17 19:40:53 2009	(r194389)
+++ head/sys/kern/makesyscalls.sh	Wed Jun 17 19:50:38 2009	(r194390)
@@ -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",

Modified: head/sys/kern/syscalls.master
==============================================================================
--- head/sys/kern/syscalls.master	Wed Jun 17 19:40:53 2009	(r194389)
+++ head/sys/kern/syscalls.master	Wed Jun 17 19:50:38 2009	(r194390)
@@ -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
 


More information about the svn-src-all mailing list