svn commit: r327428 - in head/sys: kern tools

Colin Percival cperciva at FreeBSD.org
Sun Dec 31 09:23:20 UTC 2017


Author: cperciva
Date: Sun Dec 31 09:23:19 2017
New Revision: 327428
URL: https://svnweb.freebsd.org/changeset/base/327428

Log:
  Teach makeobjops.awk to accept PROLOG and EPILOG blocks before
  METHOD and STATICMETHOD declarations; that code will be inserted
  into the dispatch function before and after the method call.
  
  Use this functionality and the TSLOG framework to record DEVICE_ATTACH
  and DEVICE_PROBE entry/exit timestamps.

Modified:
  head/sys/kern/device_if.m
  head/sys/tools/makeobjops.awk

Modified: head/sys/kern/device_if.m
==============================================================================
--- head/sys/kern/device_if.m	Sun Dec 31 09:23:02 2017	(r327427)
+++ head/sys/kern/device_if.m	Sun Dec 31 09:23:19 2017	(r327428)
@@ -39,6 +39,11 @@
  */
 INTERFACE device;
 
+# Needed for timestamping device probe/attach calls
+HEADER {
+	#include <sys/tslog.h>
+}
+
 #
 # Default implementations of some methods.
 #
@@ -142,6 +147,12 @@ CODE {
  *			be returned to indicate the type of error
  * @see DEVICE_ATTACH(), pci_get_vendor(), pci_get_device()
  */
+PROLOG {
+	TSENTER2(device_get_name(dev));
+}
+EPILOG {
+	TSEXIT2(device_get_name(dev));
+}
 METHOD int probe {
 	device_t dev;
 };
@@ -199,6 +210,12 @@ STATICMETHOD void identify {
  *			be returned to indicate the type of error
  * @see DEVICE_PROBE()
  */
+PROLOG {
+	TSENTER2(device_get_name(dev));
+}
+EPILOG {
+	TSEXIT2(device_get_name(dev));
+}
 METHOD int attach {
 	device_t dev;
 };

Modified: head/sys/tools/makeobjops.awk
==============================================================================
--- head/sys/tools/makeobjops.awk	Sun Dec 31 09:23:02 2017	(r327427)
+++ head/sys/tools/makeobjops.awk	Sun Dec 31 09:23:19 2017	(r327428)
@@ -326,11 +326,19 @@ function handle_method (static, doc)
 	}
 	printh("{");
 	printh("\tkobjop_t _m;");
+	if (ret != "void")
+		printh("\t" ret " rc;");
 	if (!static)
 		firstvar = "((kobj_t)" firstvar ")";
+	if (prolog != "")
+		printh(prolog);
 	printh("\tKOBJOPLOOKUP(" firstvar "->ops," mname ");");
-	retrn =  (ret != "void") ? "return " : "";
-	printh("\t" retrn "((" mname "_t *) _m)(" varname_list ");");
+	rceq = (ret != "void") ? "rc = " : "";
+	printh("\t" rceq "((" mname "_t *) _m)(" varname_list ");");
+	if (epilog != "")
+		printh(epilog);
+	if (ret != "void")
+		printh("\treturn (rc);");
 	printh("}\n");
 }
 
@@ -440,6 +448,8 @@ for (file_i = 0; file_i < num_files; file_i++) {
 	lineno = 0;
 	error = 0;		# to signal clean up and gerror setting
 	lastdoc = "";
+	prolog = "";
+	epilog = "";
 
 	while (!error && (getline < src) > 0) {
 		lineno++;
@@ -473,10 +483,18 @@ for (file_i = 0; file_i < num_files; file_i++) {
 		else if (/^METHOD/) {
 			handle_method(0, lastdoc);
 			lastdoc = "";
+			prolog = "";
+			epilog = "";
 		} else if (/^STATICMETHOD/) {
 			handle_method(1, lastdoc);
 			lastdoc = "";
-		} else {
+			prolog = "";
+			epilog = "";
+		} else if (/^PROLOG[ 	]*{$/)
+			prolog = handle_code();
+		else if (/^EPILOG[ 	]*{$/)
+			epilog = handle_code();
+		else {
 			debug($0);
 			warnsrc("Invalid line encountered");
 			error = 1;


More information about the svn-src-all mailing list