From owner-svn-src-user@FreeBSD.ORG  Sun Oct 14 20:00:01 2012
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52])
 by hub.freebsd.org (Postfix) with ESMTP id 619B7E21;
 Sun, 14 Oct 2012 20:00:01 +0000 (UTC) (envelope-from gnn@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c])
 by mx1.freebsd.org (Postfix) with ESMTP id 31D978FC0A;
 Sun, 14 Oct 2012 20:00:01 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
 by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q9EK01mw032042;
 Sun, 14 Oct 2012 20:00:01 GMT (envelope-from gnn@svn.freebsd.org)
Received: (from gnn@localhost)
 by svn.freebsd.org (8.14.4/8.14.4/Submit) id q9EK00Pv032013;
 Sun, 14 Oct 2012 20:00:00 GMT (envelope-from gnn@svn.freebsd.org)
Message-Id: <201210142000.q9EK00Pv032013@svn.freebsd.org>
From: "George V. Neville-Neil" <gnn@FreeBSD.org>
Date: Sun, 14 Oct 2012 20:00:00 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
Subject: svn commit: r241557 - user/gnn/geom
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.14
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
 src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/options/svn-src-user>,
 <mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
 <mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Sun, 14 Oct 2012 20:00:01 -0000

Author: gnn
Date: Sun Oct 14 20:00:00 2012
New Revision: 241557
URL: http://svn.freebsd.org/changeset/base/241557

Log:
  Create a work area for testing out GEOM direct dispatch changes.

Added:
     - copied from r241556, head/
Directory Properties:
  user/gnn/geom/   (props changed)

From owner-svn-src-user@FreeBSD.ORG  Sun Oct 14 20:26:02 2012
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@FreeBSD.org
Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52])
 by hub.freebsd.org (Postfix) with ESMTP id 48DAF488;
 Sun, 14 Oct 2012 20:26:02 +0000 (UTC) (envelope-from avg@FreeBSD.org)
Received: from citadel.icyb.net.ua (citadel.icyb.net.ua [212.40.38.140])
 by mx1.freebsd.org (Postfix) with ESMTP id 3637D8FC0A;
 Sun, 14 Oct 2012 20:25:57 +0000 (UTC)
Received: from porto.starpoint.kiev.ua (porto-e.starpoint.kiev.ua
 [212.40.38.100])
 by citadel.icyb.net.ua (8.8.8p3/ICyb-2.3exp) with ESMTP id XAA02250;
 Sun, 14 Oct 2012 23:25:56 +0300 (EEST)
 (envelope-from avg@FreeBSD.org)
Received: from localhost ([127.0.0.1])
 by porto.starpoint.kiev.ua with esmtp (Exim 4.34 (FreeBSD))
 id 1TNUl1-000DKj-SY; Sun, 14 Oct 2012 23:25:56 +0300
Message-ID: <507B1FCF.9010105@FreeBSD.org>
Date: Sun, 14 Oct 2012 23:25:51 +0300
From: Andriy Gapon <avg@FreeBSD.org>
User-Agent: Mozilla/5.0 (X11; FreeBSD amd64;
 rv:16.0) Gecko/20121013 Thunderbird/16.0.1
MIME-Version: 1.0
To: "George V. Neville-Neil" <gnn@FreeBSD.org>
Subject: Re: svn commit: r241557 - user/gnn/geom
References: <201210142000.q9EK00Pv032013@svn.freebsd.org>
In-Reply-To: <201210142000.q9EK00Pv032013@svn.freebsd.org>
X-Enigmail-Version: 1.4.5
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: src-committers@FreeBSD.org, svn-src-user@FreeBSD.org
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.14
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
 src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/options/svn-src-user>,
 <mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
 <mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Sun, 14 Oct 2012 20:26:02 -0000

on 14/10/2012 23:00 George V. Neville-Neil said the following:
> Author: gnn
> Date: Sun Oct 14 20:00:00 2012
> New Revision: 241557
> URL: http://svn.freebsd.org/changeset/base/241557
> 
> Log:
>   Create a work area for testing out GEOM direct dispatch changes.

I am intrigued by this commit and would like to subscribe to your newsletter :-)
No, seriously.

> Added:
>      - copied from r241556, head/
> Directory Properties:
>   user/gnn/geom/   (props changed)
> 


-- 
Andriy Gapon

From owner-svn-src-user@FreeBSD.ORG  Sun Oct 14 22:28:57 2012
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52])
 by hub.freebsd.org (Postfix) with ESMTP id 3C067790;
 Sun, 14 Oct 2012 22:28:57 +0000 (UTC)
 (envelope-from crees@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c])
 by mx1.freebsd.org (Postfix) with ESMTP id 240878FC12;
 Sun, 14 Oct 2012 22:28:57 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
 by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q9EMSu0B055102;
 Sun, 14 Oct 2012 22:28:56 GMT (envelope-from crees@svn.freebsd.org)
Received: (from crees@localhost)
 by svn.freebsd.org (8.14.4/8.14.4/Submit) id q9EMSuvW055100;
 Sun, 14 Oct 2012 22:28:56 GMT (envelope-from crees@svn.freebsd.org)
Message-Id: <201210142228.q9EMSuvW055100@svn.freebsd.org>
From: Chris Rees <crees@FreeBSD.org>
Date: Sun, 14 Oct 2012 22:28:56 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
Subject: svn commit: r241560 - in user/crees: . rclint
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.14
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
 src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/options/svn-src-user>,
 <mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
 <mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Sun, 14 Oct 2012 22:28:57 -0000

Author: crees (ports committer)
Date: Sun Oct 14 22:28:56 2012
New Revision: 241560
URL: http://svn.freebsd.org/changeset/base/241560

Log:
  Add the framework for an RC script testing tool.
  
  It will mostly be used by ports developers, but a base mode is possible

Added:
  user/crees/
  user/crees/rclint/
  user/crees/rclint/errors.en
  user/crees/rclint/rclint.py   (contents, props changed)

Added: user/crees/rclint/errors.en
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ user/crees/rclint/errors.en	Sun Oct 14 22:28:56 2012	(r241560)
@@ -0,0 +1,15 @@
+# Rigid format of this file; colon-separated tuples to define
+# error messages and explanations.
+# format as follows:
+error_id:message:explanation
+name_missing:name is set late or not at all:Directly following the sourcing of scripts must follow setting of the variable name.
+name_quoted:name is quoted:Do not quote the value of name.  If it has spaces, use underscores.
+rc_subr_late:rc.subr sourcing late or nonexistent:The first non-comment non-blank line in any rc file must be sourcing /etc/rc.subr.
+rcorder_keyword_freebsd:Do not include FreeBSD in the KEYWORD rcorder line:Historically FreeBSD scripts were marked in the KEYWORD section.  This is no longer necessary.
+rcorder_missing:Missing rcorder block:Following the FreeBSD RCSId keyword must be nothing but empty comment lines and an rcorder block.
+rcorder_order:rcorder block in the wrong order; should be PROVIDE/REQUIRE/BEFORE/KEYWORD:See the article on RC scripting.
+rcvar_incorrect:rcvar is not set correctly:rcvar must be directly set to name_enable.  Do not quote, and do not use indirection; ${name}_enable is slower than example_enable.
+rcvar_missing:rcvar is set late or not at all:Setting rcvar must be done straight after setting name.
+rcvar_quoted:rcvar is quoted:Do not quote the value of rcvar.
+rcsid:Missing FreeBSD RCSId keyword:All rc scripts must contain a line beginning # $FreeBSD$.  Do not include blank lines without comment markers at the beginning (#) until the script begins.
+shebang:Incorrect shebang used:All rc scripts must start with the correct shebang; #!/bin/sh.

Added: user/crees/rclint/rclint.py
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ user/crees/rclint/rclint.py	Sun Oct 14 22:28:56 2012	(r241560)
@@ -0,0 +1,161 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2012 The FreeBSD Project. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE PROJECT ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE PROJECT BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+major = 0
+minor = 0
+micro = 0
+
+import argparse
+import logging
+import re
+
+def error_explain(error):
+	if verbosity > 0: print error['explanation']
+
+def error(type, line_number, filename):
+	logging.error("[%d]%s: %s " % (line_number, filename, errors[type]['message']))
+	error_explain(errors[type])
+
+def check_quoted(string):
+	return True if string[0] == '"' or string[0] == "'" else False
+
+def get_value(var, line):
+	n = re.match('%s=(\S*)$' % var, line)
+	if n:
+		value=n.group(1)
+		return value
+	else:
+		return False
+
+def do_rclint(filename):
+	logging.debug('Suck in file %s' % filename)
+	lines=[line.rstrip('\n') for line in open(filename)]
+	num = 0
+
+	# Basic order; shebang, copyright, RCSId, gap, rcorder
+
+	logging.debug('Check shebang')
+	if lines[num] != '#!/bin/sh':
+		error('shebang', num, filename)
+
+	logging.debug('Skipping license')
+	num += 1
+	while (not re.match('# \$FreeBSD[:$]', lines[num]) and
+	    (lines[num] == '' or lines[num][0] == '#')):
+		num += 1
+
+	logging.debug('Checking for RCSId')
+	if not re.match('# \$FreeBSD[:$]', lines[num]):
+		error('rcsid', num, filename)
+
+	num += 1
+	while lines[num] == '#' or lines[num] == '': num += 1
+
+	logging.debug('Checking rcorder order and sucking in names')
+	if not re.match('# [PRBK]', lines[num]):
+		error('rcorder_missing', num, filename)
+	orders = ['provide', 'require', 'before', 'keyword']
+	index = 0
+	rcorder = { o: [] for o in orders }
+	while index < 4:
+		order = orders[index]
+		try:
+			for result in re.match('# %s: (.*)' % order.upper(),
+			    lines[num]).group(1).split(' '):
+				rcorder[order].append(result)
+			num += 1
+		except:
+			index += 1
+
+	if 'FreeBSD' in rcorder['keyword']:
+		error('rcorder_keyword_freebsd', num, filename)
+
+	if re.match('# [PRBK]', lines[num]):
+		error('rcorder_order', num, filename)
+
+	documentation_line = num
+
+	logging.debug('Checking sourcing lines')
+	while lines[num] == '' or lines[num][0] == '#':
+		num += 1
+
+	if lines[num] != '. /etc/rc.subr':
+		error('rc_subr_late', num, filename)
+
+	logging.debug('Checking name assignment')
+	while lines[num] == '' or lines[num][0] == '#' or lines[num][0] == '.':
+		num += 1
+
+	name = get_value('name', lines[num])
+	if not name:
+		error('name_missing', num, filename)
+	elif check_quoted(name):
+		error('name_quoted', num, filename)
+	else:
+		logging.debug('name discovered as %s' % name)
+		num += 1
+
+	logging.debug('Checking rcvar')
+	rcvar = get_value('rcvar', lines[num])
+	logging.debug('rcvar discovered as %s' % rcvar if rcvar else 'rcvar not discovered')
+	if not rcvar:
+		error('rcvar_missing', num, filename)
+	elif check_quoted(rcvar):
+		error('rcvar_quoted', num, filename)
+	elif rcvar != '%s_enable' % name:
+		error('rcvar_incorrect', num, filename)
+	else:
+		num += 1
+	
+
+parser = argparse.ArgumentParser()
+parser.add_argument('filenames', nargs = '+')
+parser.add_argument('--language', nargs = 1, type=str, default = ['en'], help = 'sets the language that errors are reported in')
+parser.add_argument('-v', action='count', help='raises debug level; provides detailed explanations of errors')
+
+args = parser.parse_args()
+
+verbosity = args.v
+errordb = 'errors.%s' % args.language[0]
+
+logging.basicConfig(level=(logging.DEBUG if verbosity > 1 else logging.ERROR))
+
+try:
+	with open(errordb) as f:
+		logging.debug('Sucking in error database')
+		errors = {}
+		for e in f.readlines():
+			if e[0] == '#' or len(e) == 1:
+				continue
+			e = e.split(':')
+			errors[e[0]] = { 'message': e[1], 'explanation': e[2] }
+except:
+	logging.error('Cannot open database for language %s' % errordb)
+	exit()
+
+for file in args.filenames:
+	do_rclint(file)

From owner-svn-src-user@FreeBSD.ORG  Mon Oct 15 17:02:04 2012
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52])
 by hub.freebsd.org (Postfix) with ESMTP id 0BAE7B45;
 Mon, 15 Oct 2012 17:02:04 +0000 (UTC) (envelope-from np@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c])
 by mx1.freebsd.org (Postfix) with ESMTP id E42978FC16;
 Mon, 15 Oct 2012 17:02:03 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
 by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q9FH2342033223;
 Mon, 15 Oct 2012 17:02:03 GMT (envelope-from np@svn.freebsd.org)
Received: (from np@localhost)
 by svn.freebsd.org (8.14.4/8.14.4/Submit) id q9FH23dP033215;
 Mon, 15 Oct 2012 17:02:03 GMT (envelope-from np@svn.freebsd.org)
Message-Id: <201210151702.q9FH23dP033215@svn.freebsd.org>
From: Navdeep Parhar <np@FreeBSD.org>
Date: Mon, 15 Oct 2012 17:02:03 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
Subject: svn commit: r241594 - in user/np/stable_9_toe: sys/conf sys/dev/cxgbe
 sys/dev/cxgbe/common sys/dev/cxgbe/firmware sys/dev/cxgbe/tom sys/kern
 sys/modules/cxgbe/firmware tools/tools/cxgbetool
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.14
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
 src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/options/svn-src-user>,
 <mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
 <mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Mon, 15 Oct 2012 17:02:04 -0000

Author: np
Date: Mon Oct 15 17:02:03 2012
New Revision: 241594
URL: http://svn.freebsd.org/changeset/base/241594

Log:
  Pull in fixes that affect cxgbe(4).

Added:
  user/np/stable_9_toe/sys/dev/cxgbe/firmware/t4fw-1.6.2.0.bin.uu
     - copied unchanged from r240443, head/sys/dev/cxgbe/firmware/t4fw-1.6.2.0.bin.uu
Modified:
  user/np/stable_9_toe/sys/conf/files
  user/np/stable_9_toe/sys/conf/kern.pre.mk
  user/np/stable_9_toe/sys/dev/cxgbe/adapter.h
  user/np/stable_9_toe/sys/dev/cxgbe/common/common.h
  user/np/stable_9_toe/sys/dev/cxgbe/common/t4_hw.c
  user/np/stable_9_toe/sys/dev/cxgbe/firmware/t4fw_interface.h
  user/np/stable_9_toe/sys/dev/cxgbe/osdep.h
  user/np/stable_9_toe/sys/dev/cxgbe/t4_ioctl.h
  user/np/stable_9_toe/sys/dev/cxgbe/t4_l2t.h
  user/np/stable_9_toe/sys/dev/cxgbe/t4_main.c
  user/np/stable_9_toe/sys/dev/cxgbe/t4_sge.c
  user/np/stable_9_toe/sys/dev/cxgbe/tom/t4_ddp.c
  user/np/stable_9_toe/sys/kern/kern_mbuf.c
  user/np/stable_9_toe/sys/kern/subr_firmware.c
  user/np/stable_9_toe/sys/modules/cxgbe/firmware/Makefile
  user/np/stable_9_toe/tools/tools/cxgbetool/cxgbetool.c
Directory Properties:
  user/np/stable_9_toe/sys/   (props changed)
  user/np/stable_9_toe/sys/conf/   (props changed)
  user/np/stable_9_toe/sys/dev/   (props changed)
  user/np/stable_9_toe/sys/modules/   (props changed)
  user/np/stable_9_toe/tools/tools/cxgbetool/   (props changed)

Modified: user/np/stable_9_toe/sys/conf/files
==============================================================================
--- user/np/stable_9_toe/sys/conf/files	Mon Oct 15 16:29:08 2012	(r241593)
+++ user/np/stable_9_toe/sys/conf/files	Mon Oct 15 17:02:03 2012	(r241594)
@@ -923,6 +923,40 @@ dev/cxgbe/t4_l2t.c		optional cxgbe pci \
 	compile-with "${NORMAL_C} -I$S/dev/cxgbe"
 dev/cxgbe/common/t4_hw.c	optional cxgbe pci \
 	compile-with "${NORMAL_C} -I$S/dev/cxgbe"
+t4fw_cfg.c		optional cxgbe					\
+	compile-with	"${AWK} -f $S/tools/fw_stub.awk t4fw_cfg.fw:t4fw_cfg t4fw_cfg_uwire.fw:t4fw_cfg_uwire t4fw.fw:t4fw -mt4fw_cfg -c${.TARGET}" \
+	no-implicit-rule before-depend local				\
+	clean		"t4fw_cfg.c"
+t4fw_cfg.fwo		optional cxgbe					\
+	dependency	"t4fw_cfg.fw"					\
+	compile-with	"${NORMAL_FWO}"					\
+	no-implicit-rule						\
+	clean		"t4fw_cfg.fwo"
+t4fw_cfg.fw		optional cxgbe					\
+	dependency	"$S/dev/cxgbe/firmware/t4fw_cfg.txt"		\
+	compile-with	"${CP} ${.ALLSRC} ${.TARGET}"			\
+	no-obj no-implicit-rule						\
+	clean		"t4fw_cfg.fw"
+t4fw_cfg_uwire.fwo	optional cxgbe					\
+	dependency	"t4fw_cfg_uwire.fw"				\
+	compile-with	"${NORMAL_FWO}"					\
+	no-implicit-rule						\
+	clean		"t4fw_cfg_uwire.fwo"
+t4fw_cfg_uwire.fw	optional cxgbe					\
+	dependency	"$S/dev/cxgbe/firmware/t4fw_cfg_uwire.txt"	\
+	compile-with	"${CP} ${.ALLSRC} ${.TARGET}"			\
+	no-obj no-implicit-rule						\
+	clean		"t4fw_cfg_uwire.fw"
+t4fw.fwo		optional cxgbe					\
+	dependency	"t4fw.fw"					\
+	compile-with	"${NORMAL_FWO}"					\
+	no-implicit-rule						\
+	clean		"t4fw.fwo"
+t4fw.fw			optional cxgbe					\
+	dependency	"$S/dev/cxgbe/firmware/t4fw-1.6.2.0.bin.uu"	\
+	compile-with	"${NORMAL_FW}"					\
+	no-obj no-implicit-rule						\
+	clean		"t4fw.fw"
 dev/cy/cy.c			optional cy
 dev/cy/cy_isa.c			optional cy isa
 dev/cy/cy_pci.c			optional cy pci

Modified: user/np/stable_9_toe/sys/conf/kern.pre.mk
==============================================================================
--- user/np/stable_9_toe/sys/conf/kern.pre.mk	Mon Oct 15 16:29:08 2012	(r241593)
+++ user/np/stable_9_toe/sys/conf/kern.pre.mk	Mon Oct 15 17:02:03 2012	(r241594)
@@ -18,6 +18,7 @@ LDSCRIPT?=	$S/conf/${LDSCRIPT_NAME}
 M=		${MACHINE_CPUARCH}
 
 AWK?=		awk
+CP?=		cp
 LINT?=		lint
 NM?=		nm
 OBJCOPY?=	objcopy

Modified: user/np/stable_9_toe/sys/dev/cxgbe/adapter.h
==============================================================================
--- user/np/stable_9_toe/sys/dev/cxgbe/adapter.h	Mon Oct 15 16:29:08 2012	(r241593)
+++ user/np/stable_9_toe/sys/dev/cxgbe/adapter.h	Mon Oct 15 17:02:03 2012	(r241594)
@@ -282,7 +282,6 @@ struct sge_iq {
 	bus_dma_tag_t desc_tag;
 	bus_dmamap_t desc_map;
 	bus_addr_t ba;		/* bus address of descriptor ring */
-	char lockname[16];
 	uint32_t flags;
 	uint16_t abs_id;	/* absolute SGE id for the iq */
 	int8_t   intr_pktc_idx;	/* packet count threshold index */

Modified: user/np/stable_9_toe/sys/dev/cxgbe/common/common.h
==============================================================================
--- user/np/stable_9_toe/sys/dev/cxgbe/common/common.h	Mon Oct 15 16:29:08 2012	(r241593)
+++ user/np/stable_9_toe/sys/dev/cxgbe/common/common.h	Mon Oct 15 17:02:03 2012	(r241594)
@@ -64,7 +64,7 @@ enum {
 };
 
 #define FW_VERSION_MAJOR 1
-#define FW_VERSION_MINOR 5
+#define FW_VERSION_MINOR 6
 #define FW_VERSION_MICRO 2
 
 struct port_stats {
@@ -521,6 +521,8 @@ int t4_enable_vi(struct adapter *adap, u
 		 bool rx_en, bool tx_en);
 int t4_identify_port(struct adapter *adap, unsigned int mbox, unsigned int viid,
 		     unsigned int nblinks);
+int t4_i2c_rd(struct adapter *adap, unsigned int mbox, unsigned int port_id,
+	      u8 dev_addr, u8 offset, u8 *valp);
 int t4_mdio_rd(struct adapter *adap, unsigned int mbox, unsigned int phy_addr,
 	       unsigned int mmd, unsigned int reg, unsigned int *valp);
 int t4_mdio_wr(struct adapter *adap, unsigned int mbox, unsigned int phy_addr,

Modified: user/np/stable_9_toe/sys/dev/cxgbe/common/t4_hw.c
==============================================================================
--- user/np/stable_9_toe/sys/dev/cxgbe/common/t4_hw.c	Mon Oct 15 16:29:08 2012	(r241593)
+++ user/np/stable_9_toe/sys/dev/cxgbe/common/t4_hw.c	Mon Oct 15 17:02:03 2012	(r241594)
@@ -3885,6 +3885,36 @@ int t4_fwaddrspace_write(struct adapter 
 }
 
 /**
+ *	t4_i2c_rd - read a byte from an i2c addressable device
+ *	@adap: the adapter
+ *	@mbox: mailbox to use for the FW command
+ *	@port_id: the port id
+ *	@dev_addr: the i2c device address
+ *	@offset: the byte offset to read from
+ *	@valp: where to store the value
+ */
+int t4_i2c_rd(struct adapter *adap, unsigned int mbox, unsigned int port_id,
+	       u8 dev_addr, u8 offset, u8 *valp)
+{
+	int ret;
+	struct fw_ldst_cmd c;
+
+	memset(&c, 0, sizeof(c));
+	c.op_to_addrspace = htonl(V_FW_CMD_OP(FW_LDST_CMD) | F_FW_CMD_REQUEST |
+		F_FW_CMD_READ |
+		V_FW_LDST_CMD_ADDRSPACE(FW_LDST_ADDRSPC_FUNC_I2C));
+	c.cycles_to_len16 = htonl(FW_LEN16(c));
+	c.u.i2c.pid_pkd = V_FW_LDST_CMD_PID(port_id);
+	c.u.i2c.base = dev_addr;
+	c.u.i2c.boffset = offset;
+
+	ret = t4_wr_mbox(adap, mbox, &c, sizeof(c), &c);
+	if (ret == 0)
+		*valp = c.u.i2c.data;
+	return ret;
+}
+
+/**
  *	t4_mdio_rd - read a PHY register through MDIO
  *	@adap: the adapter
  *	@mbox: mailbox to use for the FW command

Copied: user/np/stable_9_toe/sys/dev/cxgbe/firmware/t4fw-1.6.2.0.bin.uu (from r240443, head/sys/dev/cxgbe/firmware/t4fw-1.6.2.0.bin.uu)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ user/np/stable_9_toe/sys/dev/cxgbe/firmware/t4fw-1.6.2.0.bin.uu	Mon Oct 15 17:02:03 2012	(r241594, copy of r240443, head/sys/dev/cxgbe/firmware/t4fw-1.6.2.0.bin.uu)
@@ -0,0 +1,7600 @@
+/*-
+ * Copyright (c) 2012 Chelsio Communications, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+begin-base64 644 t4fw
+AAADSwEGAgAAAQkBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAzADPwNGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAENoZWxzaW8gRlcgUlVOTUVNIERFQlVHPTAgKEJ1aWx0IE1vbiBBdWcgMTMgMTM6
+MjU6MDYgUERUIDIwMTIgb24gY2xlb3BhdHJhLmFzaWNkZXNpZ25lcnMuY29tOi9ob21lL2ZlbGl4
+L3cvdDRmdy1yZWxlYXNlKSwgVmVyc2lvbiBUNHh4IDAxLjA2LjAyLjAwAAAAAAAAAAAAAGp9qktg
+ALwAH/zhQIAAAAHhAHtwAAAQAB//9fjhAGAQ4QGUcCAAAADhAZwE4QB5AAACAEDhAHmAAAYAQAAC
+AAoABgAK4QB5BAAKAACAAAEA4QB7POEAe0ThAHvk4gAAAAABAADhAHuQIAAAAAAAgADhAHsAAABA
+AeEAe5wAAEAAREREQuAAAADjAARjREREQOMACAAgAAJcAAAAAB//ixAAAAAAH/+LFAAAAAAf/4sY
+AAAAAB//ixwf/8AAAAAAAAAAAADAABH/0BL/0JIQEf/QEv/QkhAR/9AB9DER/9CQEBH/zyIK/5IQ
+AOQxAAUxAQIAEv/MAucxAhYAEf/LgRABAV/AIQIRAckREf/IEv/IkhAR/8gS/8iSEGAADxH/wxL/
+x5IQEf/DEv/GkhCBEBH/xcAgkhES/8SSEsAgkhMS/8OSEIIQAvJQZS/3Ef/Bxy+SEBH/wJIQEv/A
+E//AkyDAMpMhE/+/kyKCIhL/vhP/vpMgIyIhFP+9BDMByTgT/7yDMAODFAgzERT/uqQzkyET/66T
+ImAACMIwkyET/6uTIhL/tZAgkCGQIpAjkCSQJZAmkCeQKJApkCqQK5AskC2QLpAvICYQICYRgiIS
+/6jAMC03MC03NC03OC03PCM9AXIz7QACABL/pSMKAC83AC83EC83IC83MCM9AXIz7QACABL/msAw
+KDcwKDc0KDc4KDc8Iz0BcjPtAwIAEv+YwDAnNwAnNxAnNyAnNzAjPQFyM+0DAgAS/5IV/5MW/5PA
+MNcgBWYBYAAeAAAAAAAAAAAAAAAABDYFAAIA0w/TDwUzDG47FAdHFAcEQ3Yx5gQ2BQUzDG877QAC
+ABL/hBX/giMKAAInAgcEQwQ+BQUzDAdHFG878AMCABL/fskugyCEIYUivCJ0Ow6GULRVljC0M3Qz
+9GP/5gBlP+JlX98S/3LAMgMuBQMCABL/acAwKDdAKDdEKDdIKDdMIz0BcjPtAwIAAAIAEv9sLScA
+wBEBSTEASDEBAgDAABT/aATSMRX/Z5RQFP9nBNMxFf9nlFAU/2YE1DEV/2aUUBT/ZgTVMRX/ZZRQ
+EP9lAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAA
+H/wAAOMACfgf/AAAH/wAAOMACfgf/AAAH/wAAOMACfgf/4AAH/+F4OMACfgf/4XgH/+F4OMAD9gf
+/4XgH/+F4OMAD9gf/4XgH/+HFOMAD9gf/4cUH/+LEOMAEQwf/4sQH/+gNOMAFQgf/6A0H/+gNOMA
+Kiwf/8AAH//29eMAKiwgAAAAIAABauMAYSQgAAF4IAABfOMAYpAgAAF8IAABheMAYpQgAAGYIAAB
+nOMAYqAgAAGcIAABpeMAYqQgAAG4IAABvOMAYrAgAAG8IAABxeMAYrQgAAHYIAAB2OMAYsAgAAHc
+IAAB4uMAYsAgAAH4IAAB+OMAYsggAAH8IAAB/OMAYsggAAIYIAACGOMAYsggAAIcIAACHOMAYsgg
+AAI4IAACOOMAYsggAAI8IAACPOMAYsggAAJYIAACWOMAYsggAAJcIAACYuMAYsggAAJ4IAACeOMA
+YtAgAAJ8IAACguMAYtAgAAKYIAEewOMAYtggAoAAIAKTUOMBfwAgApNQIAKTUOMBklAgApNQIAYW
+sOMBklAgBhawIAYbIOMFFbAgBoAAIAaNQOMFGiAgBo1AIAdScOMFJ2AgB1JwIAdTPOMF7JAgCMAA
+IAjAAOMF7VwgCMAAIAjAAOMF7VwgCMAAIAkyJeMF7VwAAAAAAAAAAAAAAAAgAA8nIAAPGCAAEz0g
+AA8YIAASqCAADxggAA/RIAASQiAAEcIgAA8YIAARbSAAERwgABCxIAAPBSAAEFwgAA8YIAAPGCAA
+DxggAA/yAAAAACAAHk4gACCkIAAglSAAIIUgACB1IAAfpyAAH5ggAB47IAAeOyAAHjsgAB47IAAe
+OyAAHjsgAB47IAAeOyAAHjsgAB47IAAe+CAAHukgAB47IAAeOyAAHjsgAB47IAAeOyAAHjsgAB47
+IAAeOyAAHjsgAB47IAAeOyAAHjsgAB5I////////D/z///D///8A/CAAZysgAGhrIABomyAAaGEg
+AGghIABoFyAAZ9wgAGfSIABnyCAAZ3ggAGiZIABnbiAAZ1QAAAAAAAAAAAAAAAAAAAAUAAAAFAAA
+ACgAAAAKAAAACgAAAAAAAAAAAAAAAAAACAAAABAAAABAAAABAAAAAAgAAAAQAAAAQAAAAQAAAAQA
+AAAQAAAAQAAAAQAAACAGwCYgBr9iIAbAvCAGwKMgBsCKIAbAcSAGwFggBsA/IECAAAAAAAD/GDBg
+YAAAAP8AAQICAAAAECBAAAAAAAAEAAIAAQAAgABAACAAEAAIIAKKlAAAAAEgAoqYAAAAAiACjegA
+AAD/IAKJ7AAAAP8gAonsAAAAACACjegAAAAAIAKJ8AAAAAEgAon4AAAABCACigAAAAAIIAKKDAAA
+ABAgAooUAAAAICACihwAAABAIAKKJAAAAIAgAoo4AAABACACikwAAAIAIAKKZAAABAAgAop4AAAI
+ACACiogAABAAIAKJ2AAAABAgAongAAAAESACiVgAAAEAIAKJZAAAAIAgAol0AAAAQCACiYQAAAAg
+IAKJlAAAABAgAomkAAAACCACibAAAAAEIAKJvAAAAAIgAonIAAAAAQAAAAAAAAAAIAKI+AAAAAEg
+Ao30AAAAAiACiQAAAAAEIAKJCAAAAAggAokQAAAAECACjfwAAAAgIAKJFAAAAEAgAokgAAAAgCAC
+iSwAAAEAIAKJOAAAAgAAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAA
+AQAAAAEAAAABAAAAAQAAAAEAAAABAAAABwAAAAcAAAAGAAAABgAMNQAAEEaqABRYVQAYagAAACto
+AAAjgwAAGGoAAA0GAAALKgAAAAAAAAAAAAAAAAAAaCsAAGgrAABsggAAb5wAAEpoAABKaAAATSkA
+AEpoAABO6gAATJgAAFI9AABPuAABhqAAAYagAAII1gACCNYAAgjVAAII1QACiwsAAosLAAII1QAC
+tnIAArZyAAMNQAAEBgcAAAAAAAAAAAAAAAAAAgIFBQgICwsODhERFBQXFxoaHR0gICMjJiYpKSws
+Ly8yMjU1ODg7OwAAAAAAAAAgBJFYIAD1GCAAJlAgAN8QIADxAB//54AgANXYIAOfFB//4ygf/9+4
+IABpKB//1UggAEgMIAA7yAAAAAAAAAAAIADk0CAAWCgAAAAAAAAAAB//0Hwf/8RYH//CPB//wDAg
+ADhUIAAxZCAAL2AgAGBEH//aHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAIACWZCAA6MwgAHBIIABvfB//6vAf/8xEH//IwCAD+JQgBOgQIAC9XCAAosAgAJm8IACY
+HCAAjcAgAIRcIAByTCAElLQgA7eAIACzSCAD0iggARvEIABHzAAAAAAgAHCkIAVToCAAZtgAAAAA
+AAAAAAAAAAAAAAAAAAAAAB//7hggAHBoIAO6MAAAAAAAAAAAIAMZACAAJWQgAxawIAAkoAAAAAAg
+AAqgIAAaxCADAQggAAkwIAC28AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAgAtZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIALh3CADI5ggAtoEAAAA
+AAAAAAAAAAAAH//AAAAEACAgBhsgIAYfUB/83gAf/5IAA4AAAIEAAAAf/5HwAP/4AAEAAAAAEAAA
+gQQBAIEEAAABBAAAAQQBAIAAAAAAB///H/+D8AYAAAAqAAAAH//LsCAD6nACAAAAgBAAAEFAAABB
+QAEAgwAAAf//v/8EAAAIgYAAAAABAAAf/5B4BEEACAQBAAgf/51QMAAAAKUAAAAf/4tg//8AAP//
+AP8f/4wAAAAI0B//kWAf/4+0H/+UfB//lHQf/ODgH/+OhA////8f/4xsH/+RGB//kCQf/5CQAAD/
+gCAJAIAf/5CE4QAuAOEAXgDhAZIA3//+AL////+f////H/+RVB//kBQf/OFA4AAAoB//n/Qf/5/s
+H/zgCB//n/Af/6AMH/+gBB//oAgf/6AkH/+gHB//oCAf/5FgH/+PrB//kfAf/4tgH/zeAAAAQAAE
+AAAIgYAAAAwAAAAABgAAAAAIAIIAAAAgCMAAA4AAAIEAAAAgCMWQVAAAAAQBAAjgAAAAIAjF8FEA
+AAAgBhskBQAAAIP/AAAgCMZgKgAAACAADOQgAomgH/+AACAIyEAgCMegIAjIYCACkKzP////EAAA
+ACAIx8A/////AgAAACACitwgAorgIAKQqCACiuRAAAAAIAjIADAAAABSAAAAH/+PoAfgAD8f/4BQ
+IAjNkCAJDjAgAoigAAAn/w0AAAAgACLgD/7//wAP//8gCM6QH/+OCCAI4KAUAAAAgAAAAIAAAAJ4
+AAAAgAAABoAAsAAAAAoAAOMwkv//8ACAALEA4QGaAAACAAAgCOBgAAB+QAABAAAf/4wQBgAAAAWA
+AAAf/5IAH/+N1CsAAAAgADOoNQAAAAMAAAAf/43YB////wA///+AQAAACA///x////8A////H/+P
+kD0AAAABAAAAABAAAAcAAACBBAEAgQQAAAAAOpjDAAAAGAAAAB//jFAAAA//AEMAAB//j2QEAAAA
+H/+D8B//n2gf/51w4QB6AB//j7wgCOLQIAjjQAADB4AIAAAAACAAAABAAAAAAAkAAAAwAv/8+H/A
+AAAAD////w//+AD/AAAAAAoAAAAPAAD//wAPH/+PmAD/wADgAwAAH/+QEB/84gAf/5R8H/+dUB//
+neD/YPAAH/+dwB//lIAf/4sgBIAACB//gNAARAAA/x///wDAAAAABAAAAACBAB/84gwAAP//DwAA
+AP//AAAf/4+wH/+UeB//nTAgCObgH/+A4CAGGTAAADAAH/+OhAAAJxAAAIAAH//UwB//jnjerb7v
+NAAAAD8AAAAAAIkGAJkAAB//nSgQAAcC7gAAAAHAgAAf/5v4mQAAAB//neQAiAAIgoAAAR//nXgf
+/5yEAA8D/wMRAAADFQAAKQAAAAAPQkAgA9gYIAkgUCAJIKAf/5AYAAkAAACAAAAf/438AABIACAG
+G2AgCOtQIAjr4B//j4gACQAIH/+c7B//jWAf/500AAAIBgAAiMwAAIkUH/+NhDMAAADhAAAAH/+c
+9B//jgQf/508A//gAAA/9pAAABPUABAAAR//nzwf/504H/+PjB//nPAgBhbAH/+ODB//kAgf/40Y
+H/+UIB//k5SD/7AAH/+NFOABAAAgCSYgIAjysCAAYcggAGRAIAkl8CAJJdAf/4+oH/+QAB//jqAg
+CP6AIAj+sEgAAAAgAP4IH/+PcCAA/+gf/48cH/+QJB//kWgf/5FkAAD/gB//kVwf/5HIIAEFlCAB
+DQQD/wAA/7///x//kMQ8AAAAAAf//4MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBgAAAAAAAAB//88Qf//PE
+H//ziB//84gf//OIH//ziB//7zAf//G0H//wYB//8GAf//BgIAXwAAAAAAAAAAAAAAAAAAAAAAAg
+BfJoIAXyaAAAAAAAAAAAAAAAAAAAAAAgAQdgIAXwAB//8rQf//K0H//ytB//8rQf//K0H//ytAAA
+AAAf/+84AAAAAAAAAAAAAAAAAAAAAAIBAAAAAAAAAAAAAAAAAAAEAAAAAAAAAIGAAAAAAAAQBQAA
+AAAAAAQAAAAAAAAAAAAAAAAAAAAAgQAAAAAAABgFAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAQAAAAAAAACgQAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgCgAR8XcT8XfTDwPmMQECABbxdRfxdndrBpBgtGZ3Y/hU
+DRVVlXsPFABj//kAAABsEAYpIAUqIAf4YKQVoBtFAPsgCt1hqgEAiyIuIBQc8WjxcjwN4AeVAAym
+EaxmLWKe96AKW+IAnQAtYp3r1AAGilGAACnCrmSRFS3CrWTRD6TuDg5HLiQU9cALpdIAnQAf8Vku
+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

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***

From owner-svn-src-user@FreeBSD.ORG  Mon Oct 15 20:19:58 2012
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52])
 by hub.freebsd.org (Postfix) with ESMTP id 4683F2B1;
 Mon, 15 Oct 2012 20:19:58 +0000 (UTC)
 (envelope-from crees@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c])
 by mx1.freebsd.org (Postfix) with ESMTP id 2637B8FC08;
 Mon, 15 Oct 2012 20:19:58 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
 by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q9FKJwt5064876;
 Mon, 15 Oct 2012 20:19:58 GMT (envelope-from crees@svn.freebsd.org)
Received: (from crees@localhost)
 by svn.freebsd.org (8.14.4/8.14.4/Submit) id q9FKJvAJ064874;
 Mon, 15 Oct 2012 20:19:57 GMT (envelope-from crees@svn.freebsd.org)
Message-Id: <201210152019.q9FKJvAJ064874@svn.freebsd.org>
From: Chris Rees <crees@FreeBSD.org>
Date: Mon, 15 Oct 2012 20:19:57 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
Subject: svn commit: r241598 - user/crees/rclint
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.14
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
 src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/options/svn-src-user>,
 <mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
 <mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Mon, 15 Oct 2012 20:19:58 -0000

Author: crees (ports committer)
Date: Mon Oct 15 20:19:57 2012
New Revision: 241598
URL: http://svn.freebsd.org/changeset/base/241598

Log:
  Split into functions; code is only used once, but separating makes it easier
  to read
  
  Check default variable assignments and be very fussy
  
  Use \ instead of : as error delimiter

Modified:
  user/crees/rclint/errors.en
  user/crees/rclint/rclint.py

Modified: user/crees/rclint/errors.en
==============================================================================
--- user/crees/rclint/errors.en	Mon Oct 15 18:15:18 2012	(r241597)
+++ user/crees/rclint/errors.en	Mon Oct 15 20:19:57 2012	(r241598)
@@ -1,15 +1,31 @@
-# Rigid format of this file; colon-separated tuples to define
+# Rigid format of this file; backslash-separated tuples to define
 # error messages and explanations.
 # format as follows:
-error_id:message:explanation
-name_missing:name is set late or not at all:Directly following the sourcing of scripts must follow setting of the variable name.
-name_quoted:name is quoted:Do not quote the value of name.  If it has spaces, use underscores.
-rc_subr_late:rc.subr sourcing late or nonexistent:The first non-comment non-blank line in any rc file must be sourcing /etc/rc.subr.
-rcorder_keyword_freebsd:Do not include FreeBSD in the KEYWORD rcorder line:Historically FreeBSD scripts were marked in the KEYWORD section.  This is no longer necessary.
-rcorder_missing:Missing rcorder block:Following the FreeBSD RCSId keyword must be nothing but empty comment lines and an rcorder block.
-rcorder_order:rcorder block in the wrong order; should be PROVIDE/REQUIRE/BEFORE/KEYWORD:See the article on RC scripting.
-rcvar_incorrect:rcvar is not set correctly:rcvar must be directly set to name_enable.  Do not quote, and do not use indirection; ${name}_enable is slower than example_enable.
-rcvar_missing:rcvar is set late or not at all:Setting rcvar must be done straight after setting name.
-rcvar_quoted:rcvar is quoted:Do not quote the value of rcvar.
-rcsid:Missing FreeBSD RCSId keyword:All rc scripts must contain a line beginning # $FreeBSD$.  Do not include blank lines without comment markers at the beginning (#) until the script begins.
-shebang:Incorrect shebang used:All rc scripts must start with the correct shebang; #!/bin/sh.
+error_id\message\explanation
+
+defaults_invalid\Invalid lines in defaults block.\Allowed are variable assignments (including eval statements) and comments.  A blank line ends the block.
+defaults_mandatory_colon\Override blanks in mandatory values (:=/:- vs =/-)\Values that must not be blank (such as _enable) should be set by default as ${var:=value}; thus disallowing blank values (man sh)
+defaults_non_mandatory_colon\Do not clobber blank values for non-mandatory variables\Syntax for variables that are not mandatory is ${var=value}; including := will override var="" set in rc.conf (man sh)
+defaults_old_style\Prefer condensed version for setting default values of variables\When setting the default value for a variable, it is much less verbose and clearer to use the : ${variable=var} notation, as well as it being obvious that the source and destination variable are the same
+defaults_value_quoted\Do not quote values set by default\With the syntax ${variable=value}, value can even contain spaces and does not need quoting
+
+load_rc_config_extra\load_rc_config not followed by blank line\The load_rc_config line must form its own block
+load_rc_config_missing\load_rc_config is late, incorrect or missing\Directly following the name/rcvar block must be load_rc_config $name, unquoted
+
+name_missing\name is set late or not at all\Directly following the sourcing of scripts must follow setting of the variable name
+name_quoted\name is quoted\Do not quote the value of name.  If it has spaces, use underscores
+
+rc_subr_late\rc.subr sourcing late or nonexistent\The first non-comment non-blank line in any rc file must be sourcing /etc/rc.subr
+
+rcorder_keyword_freebsd\Do not include FreeBSD in the KEYWORD rcorder line\Historically FreeBSD scripts were marked in the KEYWORD section.  This is no longer necessary
+rcorder_missing\Missing rcorder block\Following the FreeBSD RCSId keyword must be nothing but empty comment lines and an rcorder block
+rcorder_order\rcorder block in the wrong order; should be PROVIDE/REQUIRE/BEFORE/KEYWORD\See the article on RC scripting
+
+rcvar_extra\extra lines in name/rcvar block\Order should be [blank line]/name=/rcvar=/[blank line]
+rcvar_incorrect\rcvar is not set correctly\rcvar must be directly set to name_enable.  Do not quote, and do not use indirection; ${name}_enable is slower than example_enable
+rcvar_missing\rcvar is set late or not at all\Setting rcvar must be done straight after setting name
+rcvar_quoted\rcvar is quoted\Do not quote the value of rcvar
+
+rcsid\Missing FreeBSD RCSId keyword\All rc scripts must contain a line beginning # $FreeBSD$.  Do not include blank lines without comment markers at the beginning (#) until the script begins
+
+shebang\Incorrect shebang used\All rc scripts must start with the correct shebang; #!/bin/sh

Modified: user/crees/rclint/rclint.py
==============================================================================
--- user/crees/rclint/rclint.py	Mon Oct 15 18:15:18 2012	(r241597)
+++ user/crees/rclint/rclint.py	Mon Oct 15 20:19:57 2012	(r241598)
@@ -32,9 +32,10 @@ micro = 0
 import argparse
 import logging
 import re
+import textwrap
 
 def error_explain(error):
-	if verbosity > 0: print error['explanation']
+	if verbosity > 0: print textwrap.fill(error['explanation'], initial_indent='==> ', subsequent_indent='    ')
 
 def error(type, line_number, filename):
 	logging.error("[%d]%s: %s " % (line_number, filename, errors[type]['message']))
@@ -43,6 +44,10 @@ def error(type, line_number, filename):
 def check_quoted(string):
 	return True if string[0] == '"' or string[0] == "'" else False
 
+def mandatory(var):
+	mand = ['enable']
+	return True if var.split('_')[-1] in mand else False
+
 def get_value(var, line):
 	n = re.match('%s=(\S*)$' % var, line)
 	if n:
@@ -51,11 +56,7 @@ def get_value(var, line):
 	else:
 		return False
 
-def do_rclint(filename):
-	logging.debug('Suck in file %s' % filename)
-	lines=[line.rstrip('\n') for line in open(filename)]
-	num = 0
-
+def check_header(lines, num, filename):
 	# Basic order; shebang, copyright, RCSId, gap, rcorder
 
 	logging.debug('Check shebang')
@@ -97,8 +98,9 @@ def do_rclint(filename):
 	if re.match('# [PRBK]', lines[num]):
 		error('rcorder_order', num, filename)
 
-	documentation_line = num
+	return num
 
+def check_intro(lines, num, filename):
 	logging.debug('Checking sourcing lines')
 	while lines[num] == '' or lines[num][0] == '#':
 		num += 1
@@ -130,7 +132,67 @@ def do_rclint(filename):
 		error('rcvar_incorrect', num, filename)
 	else:
 		num += 1
-	
+
+	logging.debug('Checking load_rc_config')
+	if lines[num] == '':
+		num += 1
+	else:
+		error('rcvar_extra', num, filename)
+
+	if re.match('load_rc_config (?:\$name|%s)' % name, lines[num]):
+		num += 1
+	else:
+		error('load_rc_config_missing', num, filename)
+
+	if lines[num] == '':
+		num += 1
+	else:
+		error('load_rc_config_extra', num, filename)
+
+	return num
+
+def check_defaults(lines, num, filename):
+	logging.debug('Checking defaults set')
+
+	default = { }
+	try:
+	    while lines[num] != '':
+		while lines[num][0] == '#' or lines[num][:4] == 'eval': num += 1
+		if lines[num][0] == ':':
+			# Shorthand set self-default assignment
+			(target, operator, value) = re.match(': \${([^:=]+)(:?=)([^}]+)}', lines[num]).groups()
+			if operator == ':=' and not mandatory(target):
+				error('defaults_non_mandatory_colon', num, filename)
+			elif operator == '=' and mandatory(target):
+				error('defaults_mandatory_colon', num, filename)
+
+		else:
+			# Longhand set default assignment
+			(target, source, operator, value) = re.match('([^=]+)=\${([^:-]+)(:?-)([^}]+)}', lines[num]).groups()
+			if target == source:
+				error('defaults_old_style', num, filename)
+
+			if operator == ':-' and not mandatory(target):
+				error('defaults_non_mandatory_colon', num, filename)
+			elif operator == '-' and mandatory(target):
+				error('defaults_mandatory_colon', num, filename)
+
+		if check_quoted(value):
+			error('defaults_value_quoted', num, filename)
+
+		num += 1
+	except:
+		error('defaults_invalid', num, filename)
+
+def do_rclint(filename):
+	logging.debug('Suck in file %s' % filename)
+	lines=[line.rstrip('\n') for line in open(filename)]
+	begin_num = 0
+
+	endofheader_num = check_header(lines, begin_num, filename)
+	endofintro_num = check_intro(lines, endofheader_num, filename)
+	endofdefaults_num = check_defaults(lines, endofintro_num, filename)
+
 
 parser = argparse.ArgumentParser()
 parser.add_argument('filenames', nargs = '+')
@@ -151,7 +213,7 @@ try:
 		for e in f.readlines():
 			if e[0] == '#' or len(e) == 1:
 				continue
-			e = e.split(':')
+			e = e.split('\\')
 			errors[e[0]] = { 'message': e[1], 'explanation': e[2] }
 except:
 	logging.error('Cannot open database for language %s' % errordb)

From owner-svn-src-user@FreeBSD.ORG  Tue Oct 16 20:24:55 2012
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52])
 by hub.freebsd.org (Postfix) with ESMTP id 8E91F75C;
 Tue, 16 Oct 2012 20:24:55 +0000 (UTC)
 (envelope-from crees@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c])
 by mx1.freebsd.org (Postfix) with ESMTP id 6D4C88FC0A;
 Tue, 16 Oct 2012 20:24:55 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
 by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q9GKOtTw014005;
 Tue, 16 Oct 2012 20:24:55 GMT (envelope-from crees@svn.freebsd.org)
Received: (from crees@localhost)
 by svn.freebsd.org (8.14.4/8.14.4/Submit) id q9GKOt8k014001;
 Tue, 16 Oct 2012 20:24:55 GMT (envelope-from crees@svn.freebsd.org)
Message-Id: <201210162024.q9GKOt8k014001@svn.freebsd.org>
From: Chris Rees <crees@FreeBSD.org>
Date: Tue, 16 Oct 2012 20:24:55 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
Subject: svn commit: r241617 - user/crees/rclint
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.14
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
 src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/options/svn-src-user>,
 <mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
 <mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Tue, 16 Oct 2012 20:24:55 -0000

Author: crees (ports committer)
Date: Tue Oct 16 20:24:54 2012
New Revision: 241617
URL: http://svn.freebsd.org/changeset/base/241617

Log:
  Allow line breaks in large blocks
  
  Do basic checking of definitions
  
  Use tab as delimiter; regexes need colons and backslashes
  
  Check style and position of functions
  
  Handle missing rc files more gracefully
  
  Make regex checks for the whole file

Added:
  user/crees/rclint/problems.en
Modified:
  user/crees/rclint/errors.en
  user/crees/rclint/rclint.py

Modified: user/crees/rclint/errors.en
==============================================================================
--- user/crees/rclint/errors.en	Tue Oct 16 20:18:15 2012	(r241616)
+++ user/crees/rclint/errors.en	Tue Oct 16 20:24:54 2012	(r241617)
@@ -1,31 +1,42 @@
-# Rigid format of this file; backslash-separated tuples to define
+# Rigid format of this file; tab-separated tuples to define
 # error messages and explanations.
+# Yes, tab isn't a great separator; alternatives that aren't
+# regex chars would be gratefully heard
 # format as follows:
-error_id\message\explanation
+error_id	message	explanation
 
-defaults_invalid\Invalid lines in defaults block.\Allowed are variable assignments (including eval statements) and comments.  A blank line ends the block.
-defaults_mandatory_colon\Override blanks in mandatory values (:=/:- vs =/-)\Values that must not be blank (such as _enable) should be set by default as ${var:=value}; thus disallowing blank values (man sh)
-defaults_non_mandatory_colon\Do not clobber blank values for non-mandatory variables\Syntax for variables that are not mandatory is ${var=value}; including := will override var="" set in rc.conf (man sh)
-defaults_old_style\Prefer condensed version for setting default values of variables\When setting the default value for a variable, it is much less verbose and clearer to use the : ${variable=var} notation, as well as it being obvious that the source and destination variable are the same
-defaults_value_quoted\Do not quote values set by default\With the syntax ${variable=value}, value can even contain spaces and does not need quoting
+defaults_invalid	Invalid lines in defaults block.	Allowed are variable assignments (including eval statements) and comments.  A blank line ends the block.
+defaults_mandatory_colon	Override blanks in mandatory values (:=/:- vs =/-)	Values that must not be blank (such as _enable) should be set by default as ${var:=value}; thus disallowing blank values (man sh)
+defaults_non_mandatory_colon	Do not clobber blank values for non-mandatory variables	Syntax for variables that are not mandatory is ${var=value}; including := will override var="" set in rc.conf (man sh)
+defaults_old_style	Prefer condensed version for setting default values of variables	When setting the default value for a variable, it is much less verbose and clearer to use the : ${variable=var} notation, as well as it being obvious that the source and destination variable are the same
+defaults_value_quoted	Do not quote values set by default	With the syntax ${variable=value}, value can even contain spaces and does not need quoting
 
-load_rc_config_extra\load_rc_config not followed by blank line\The load_rc_config line must form its own block
-load_rc_config_missing\load_rc_config is late, incorrect or missing\Directly following the name/rcvar block must be load_rc_config $name, unquoted
+definitions_missing	Definitions block missing	Following the default definitions must be other definitions (such as command, command_args)
+definitions_quoted	Do not quote values of variables	Unless the value contains spaces/tabs, do not quote variable assignments
 
-name_missing\name is set late or not at all\Directly following the sourcing of scripts must follow setting of the variable name
-name_quoted\name is quoted\Do not quote the value of name.  If it has spaces, use underscores
+functions_brace_inline	Braces should have their own lines	Do not put a brace on the same line as the function definition; it should have its own line
+functions_brace_missing	Function definition does not start with a brace	The function definition must begin with an opening brace on its own line, and end with a closing brace on its own line
+functions_neverending	Unclosed function block	Functions must end with a closing brace on its own line
+functions_short	One-line functions discouraged; put command directly in variable	It is wasteful to write a function just for one command.  It is possible to put commands directly inside declarations; name_prestart="install -d -o $name_user /var/run/$name" for example
+functions_spaces	No spaces allowed in function definitions	Do not separate the function name from the parentheses with spaces; func() not func ()
 
-rc_subr_late\rc.subr sourcing late or nonexistent\The first non-comment non-blank line in any rc file must be sourcing /etc/rc.subr
+load_rc_config_extra	load_rc_config not followed by blank line	The load_rc_config line must form its own block
+load_rc_config_missing	load_rc_config is late, incorrect or missing	Directly following the name/rcvar block must be load_rc_config $name, unquoted
 
-rcorder_keyword_freebsd\Do not include FreeBSD in the KEYWORD rcorder line\Historically FreeBSD scripts were marked in the KEYWORD section.  This is no longer necessary
-rcorder_missing\Missing rcorder block\Following the FreeBSD RCSId keyword must be nothing but empty comment lines and an rcorder block
-rcorder_order\rcorder block in the wrong order; should be PROVIDE/REQUIRE/BEFORE/KEYWORD\See the article on RC scripting
+name_missing	name is set late or not at all	Directly following the sourcing of scripts must follow setting of the variable name
+name_quoted	name is quoted	Do not quote the value of name.  If it has spaces, use underscores
 
-rcvar_extra\extra lines in name/rcvar block\Order should be [blank line]/name=/rcvar=/[blank line]
-rcvar_incorrect\rcvar is not set correctly\rcvar must be directly set to name_enable.  Do not quote, and do not use indirection; ${name}_enable is slower than example_enable
-rcvar_missing\rcvar is set late or not at all\Setting rcvar must be done straight after setting name
-rcvar_quoted\rcvar is quoted\Do not quote the value of rcvar
+rc_subr_late	rc.subr sourcing late or nonexistent	The first non-comment non-blank line in any rc file must be sourcing /etc/rc.subr
 
-rcsid\Missing FreeBSD RCSId keyword\All rc scripts must contain a line beginning # $FreeBSD$.  Do not include blank lines without comment markers at the beginning (#) until the script begins
+rcorder_keyword_freebsd	Do not include FreeBSD in the KEYWORD rcorder line	Historically FreeBSD scripts were marked in the KEYWORD section.  This is no longer necessary
+rcorder_missing	Missing rcorder block	Following the FreeBSD RCSId keyword must be nothing but empty comment lines and an rcorder block
+rcorder_order	rcorder block in the wrong order; should be PROVIDE/REQUIRE/BEFORE/KEYWORD	See the article on RC scripting
 
-shebang\Incorrect shebang used\All rc scripts must start with the correct shebang; #!/bin/sh
+rcvar_extra	extra lines in name/rcvar block	Order should be [blank line]/name=/rcvar=/[blank line]
+rcvar_incorrect	rcvar is not set correctly	rcvar must be directly set to name_enable.  Do not quote, and do not use indirection; ${name}_enable is slower than example_enable
+rcvar_missing	rcvar is set late or not at all	Setting rcvar must be done straight after setting name
+rcvar_quoted	rcvar is quoted	Do not quote the value of rcvar
+
+rcsid	Missing FreeBSD RCSId keyword	All rc scripts must contain a line beginning # $FreeBSD$.  Do not include blank lines without comment markers at the beginning (#) until the script begins
+
+shebang	Incorrect shebang used	All rc scripts must start with the correct shebang; #!/bin/sh

Added: user/crees/rclint/problems.en
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ user/crees/rclint/problems.en	Tue Oct 16 20:24:54 2012	(r241617)
@@ -0,0 +1,2 @@
+# Format of this file: regex<TAB>short_explanation<TAB>explanation
+regex	explain	explanation

Modified: user/crees/rclint/rclint.py
==============================================================================
--- user/crees/rclint/rclint.py	Tue Oct 16 20:18:15 2012	(r241616)
+++ user/crees/rclint/rclint.py	Tue Oct 16 20:24:54 2012	(r241617)
@@ -34,12 +34,27 @@ import logging
 import re
 import textwrap
 
-def error_explain(error):
-	if verbosity > 0: print textwrap.fill(error['explanation'], initial_indent='==> ', subsequent_indent='    ')
+def read_db(dbname, language):
+    try:
+	with open('%s.%s' % (dbname, language)) as f:
+		logging.debug('Sucking in %s database' % dbname)
+		contents = { }
+		for e in f.readlines():
+			if not e or e[0] == '#':
+				continue
+			e = e.split('	')
+			contents[e[0]] = e[1:]
+    except:
+	logging.error('Cannot open %s database for language %s' % (dbname, language))
+	exit()
+    return contents
+
+def explain(error):
+	if verbosity > 0: print textwrap.fill(error[1], initial_indent='==> ', subsequent_indent='    ')
 
 def error(type, line_number, filename):
-	logging.error("[%d]%s: %s " % (line_number, filename, errors[type]['message']))
-	error_explain(errors[type])
+	logging.error("[%d]%s: %s " % (line_number, filename, errors[type][0]))
+	explain(errors[type])
 
 def check_quoted(string):
 	return True if string[0] == '"' or string[0] == "'" else False
@@ -49,12 +64,12 @@ def mandatory(var):
 	return True if var.split('_')[-1] in mand else False
 
 def get_value(var, line):
-	n = re.match('%s=(\S*)$' % var, line)
-	if n:
-		value=n.group(1)
-		return value
-	else:
-		return False
+	try:	return re.match('%s=(\S+)$' % var, line).group(1)
+	except:	return False
+
+def get_assignment(line):
+	try: return re.match('(\S+)=(\S+)$', line).groups()
+	except: return False
 
 def check_header(lines, num, filename):
 	# Basic order; shebang, copyright, RCSId, gap, rcorder
@@ -156,7 +171,7 @@ def check_defaults(lines, num, filename)
 
 	default = { }
 	try:
-	    while lines[num] != '':
+	    while lines[num]:
 		while lines[num][0] == '#' or lines[num][:4] == 'eval': num += 1
 		if lines[num][0] == ':':
 			# Shorthand set self-default assignment
@@ -184,15 +199,99 @@ def check_defaults(lines, num, filename)
 	except:
 		error('defaults_invalid', num, filename)
 
+	# Allow line breaks in the middle; if we put
+	# gaps in that's usually good style.  Lookahead!
+	if lines[num+1] and (':' in lines[num+1] or '-' in lines[num+1]):
+		return check_defaults(lines, num, filename)
+	else:
+		return num
+
+def check_definitions(lines, num, filename):
+	logging.debug('Checking the basic definitions')
+
+	num += 1
+
+	while lines[num]:
+		while lines[num][0] == '#' or lines[num][:4] == 'eval': num += 1
+		try:
+			(var, value) = get_assignment(lines[num])
+		except:
+			error('definitions_missing', num, filename)
+			return num
+
+		if check_quoted(value):
+			if ' ' not in lines[num] and '	' not in lines[num]:
+				error('definitions_quoted', num, filename)
+		num += 1
+
+	# As in check_defaults, allow line breaks in the middle; if we put
+	# gaps in that's usually good style.  Lookahead!
+	if lines[num+1] and '=' in lines[num+1]:
+		return check_definitions(lines, num, filename)
+	else:
+		return num
+
+def check_functions(lines, num, filename):
+	logging.debug('Now checking functions')
+
+	num += 1
+	func = { }
+
+	while lines[num]:
+		while not lines[num] or lines[num][0] == '#': num += 1
+
+		if lines[num][-2:] != '()':
+			if lines[num][-1] == '{':
+				error('functions_brace_inline', num, filename)
+			else:
+				logging.debug('No functions left!')
+				return num
+		if ' ' in lines[num]:
+			error('functions_spaces', num, filename)
+		func['name'] = lines[num][:-2]
+
+		num += 1
+		if lines[num] != '{':
+			error('functions_brace_missing', num, filename)
+
+		num += 1
+		tmp = num
+		try:
+			while lines[num] != '}':
+				tmp += 1
+				if lines[num] and lines[num][0] != '#':
+					func['length'] += 1 
+		except:
+			error('functions_neverending', num, filename)
+			return num
+
+		if func['length'] == 1:
+			error('functions_short', num, filename)
+
+def general_checks(lines, filename):
+	logging.debug('Checking for unrecommended sequences')
+	for num in range(0, len(lines)):
+		for regex in problems.keys():
+			if lines[num] and re.search(regex, lines[num]):
+				logging.warn("[%d]%s: %s " % (num, filename, problems[key][1]))
+				explain(problem)
+
 def do_rclint(filename):
 	logging.debug('Suck in file %s' % filename)
-	lines=[line.rstrip('\n') for line in open(filename)]
-	begin_num = 0
-
-	endofheader_num = check_header(lines, begin_num, filename)
-	endofintro_num = check_intro(lines, endofheader_num, filename)
-	endofdefaults_num = check_defaults(lines, endofintro_num, filename)
+	try:
+		lines=[line.rstrip('\n') for line in open(filename)]
+	except: 
+		logging.error('Cannot open %s for testing' % filename)
+		return
+	lineno = { 'begin': 0 }
+
+	lineno['header'] = check_header(lines, lineno['begin'], filename)
+	lineno['intro'] = check_intro(lines, lineno['header'], filename)
+	lineno['defaults'] = check_defaults(lines, lineno['intro'], filename)
+	lineno['definitions'] = check_definitions(lines, lineno['defaults'], filename)
+	lineno['functions'] = check_functions(lines, lineno['definitions'], filename)
 
+	general_checks(lines, filename)
 
 parser = argparse.ArgumentParser()
 parser.add_argument('filenames', nargs = '+')
@@ -202,22 +301,10 @@ parser.add_argument('-v', action='count'
 args = parser.parse_args()
 
 verbosity = args.v
-errordb = 'errors.%s' % args.language[0]
+logging.basicConfig(level=logging.DEBUG if verbosity > 1 else logging.ERROR)
 
-logging.basicConfig(level=(logging.DEBUG if verbosity > 1 else logging.ERROR))
-
-try:
-	with open(errordb) as f:
-		logging.debug('Sucking in error database')
-		errors = {}
-		for e in f.readlines():
-			if e[0] == '#' or len(e) == 1:
-				continue
-			e = e.split('\\')
-			errors[e[0]] = { 'message': e[1], 'explanation': e[2] }
-except:
-	logging.error('Cannot open database for language %s' % errordb)
-	exit()
+errors = read_db('errors', args.language[0])
+problems = read_db('problems', args.language[0])
 
 for file in args.filenames:
 	do_rclint(file)

From owner-svn-src-user@FreeBSD.ORG  Wed Oct 17 19:16:25 2012
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52])
 by hub.freebsd.org (Postfix) with ESMTP id 7794E408;
 Wed, 17 Oct 2012 19:16:25 +0000 (UTC)
 (envelope-from crees@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c])
 by mx1.freebsd.org (Postfix) with ESMTP id 5CC768FC08;
 Wed, 17 Oct 2012 19:16:25 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
 by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q9HJGP5m043019;
 Wed, 17 Oct 2012 19:16:25 GMT (envelope-from crees@svn.freebsd.org)
Received: (from crees@localhost)
 by svn.freebsd.org (8.14.4/8.14.4/Submit) id q9HJGPKu043017;
 Wed, 17 Oct 2012 19:16:25 GMT (envelope-from crees@svn.freebsd.org)
Message-Id: <201210171916.q9HJGPKu043017@svn.freebsd.org>
From: Chris Rees <crees@FreeBSD.org>
Date: Wed, 17 Oct 2012 19:16:25 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
Subject: svn commit: r241644 - user/crees/rclint
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.14
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
 src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/options/svn-src-user>,
 <mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
 <mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Wed, 17 Oct 2012 19:16:25 -0000

Author: crees (ports committer)
Date: Wed Oct 17 19:16:24 2012
New Revision: 241644
URL: http://svn.freebsd.org/changeset/base/241644

Log:
  Style; 4 spaces instead of tabs, no one-line if/whiles
  
  Submitted by:	eadler

Modified:
  user/crees/rclint/rclint.py

Modified: user/crees/rclint/rclint.py
==============================================================================
--- user/crees/rclint/rclint.py	Wed Oct 17 18:21:14 2012	(r241643)
+++ user/crees/rclint/rclint.py	Wed Oct 17 19:16:24 2012	(r241644)
@@ -36,262 +36,270 @@ import textwrap
 
 def read_db(dbname, language):
     try:
-	with open('%s.%s' % (dbname, language)) as f:
-		logging.debug('Sucking in %s database' % dbname)
-		contents = { }
-		for e in f.readlines():
-			if not e or e[0] == '#':
-				continue
-			e = e.split('	')
-			contents[e[0]] = e[1:]
+        with open('%s.%s' % (dbname, language)) as f:
+            logging.debug('Sucking in %s database' % dbname)
+            contents = { }
+            for e in f.readlines():
+                if not e or e[0] == '#':
+                    continue
+                e = e.split('	')
+                contents[e[0]] = e[1:]
     except:
-	logging.error('Cannot open %s database for language %s' % (dbname, language))
-	exit()
+        logging.error('Cannot open %s database for language %s' % (dbname, language))
+        exit()
     return contents
 
 def explain(error):
-	if verbosity > 0: print textwrap.fill(error[1], initial_indent='==> ', subsequent_indent='    ')
+    if verbosity > 0:
+        print textwrap.fill(error[1],
+                            initial_indent='==> ', subsequent_indent='    ')
 
 def error(type, line_number, filename):
-	logging.error("[%d]%s: %s " % (line_number, filename, errors[type][0]))
-	explain(errors[type])
+    logging.error("[%d]%s: %s " % (line_number, filename, errors[type][0]))
+    explain(errors[type])
 
 def check_quoted(string):
-	return True if string[0] == '"' or string[0] == "'" else False
+    return True if string[0] == '"' or string[0] == "'" else False
 
 def mandatory(var):
-	mand = ['enable']
-	return True if var.split('_')[-1] in mand else False
+    mand = ['enable']
+    return True if var.split('_')[-1] in mand else False
 
 def get_value(var, line):
-	try:	return re.match('%s=(\S+)$' % var, line).group(1)
-	except:	return False
+    try:
+        return re.match('%s=(\S+)$' % var, line).group(1)
+    except:
+        return False
 
 def get_assignment(line):
-	try: return re.match('(\S+)=(\S+)$', line).groups()
-	except: return False
+    try:
+        return re.match('(\S+)=(\S+)$', line).groups()
+    except:
+        return False
 
 def check_header(lines, num, filename):
-	# Basic order; shebang, copyright, RCSId, gap, rcorder
+    # Basic order; shebang, copyright, RCSId, gap, rcorder
 
-	logging.debug('Check shebang')
-	if lines[num] != '#!/bin/sh':
-		error('shebang', num, filename)
-
-	logging.debug('Skipping license')
-	num += 1
-	while (not re.match('# \$FreeBSD[:$]', lines[num]) and
-	    (lines[num] == '' or lines[num][0] == '#')):
-		num += 1
-
-	logging.debug('Checking for RCSId')
-	if not re.match('# \$FreeBSD[:$]', lines[num]):
-		error('rcsid', num, filename)
-
-	num += 1
-	while lines[num] == '#' or lines[num] == '': num += 1
-
-	logging.debug('Checking rcorder order and sucking in names')
-	if not re.match('# [PRBK]', lines[num]):
-		error('rcorder_missing', num, filename)
-	orders = ['provide', 'require', 'before', 'keyword']
-	index = 0
-	rcorder = { o: [] for o in orders }
-	while index < 4:
-		order = orders[index]
-		try:
-			for result in re.match('# %s: (.*)' % order.upper(),
-			    lines[num]).group(1).split(' '):
-				rcorder[order].append(result)
-			num += 1
-		except:
-			index += 1
+    logging.debug('Check shebang')
+    if lines[num] != '#!/bin/sh':
+        error('shebang', num, filename)
+
+    logging.debug('Skipping license')
+    num += 1
+    while (not re.match('# \$FreeBSD[:$]', lines[num]) and
+          (lines[num] == '' or lines[num][0] == '#')):
+        num += 1
+
+    logging.debug('Checking for RCSId')
+    if not re.match('# \$FreeBSD[:$]', lines[num]):
+        error('rcsid', num, filename)
+
+    num += 1
+    while lines[num] == '#' or lines[num] == '': num += 1
+
+    logging.debug('Checking rcorder order and sucking in names')
+    if not re.match('# [PRBK]', lines[num]):
+        error('rcorder_missing', num, filename)
+    orders = ['provide', 'require', 'before', 'keyword']
+    index = 0
+    rcorder = {o: [] for o in orders}
+    while index < 4:
+        order = orders[index]
+        try:
+            for result in re.match('# %s: (.*)' % order.upper(),
+                                   lines[num]).group(1).split(' '):
+                rcorder[order].append(result)
+            num += 1
+        except:
+            index += 1
 
-	if 'FreeBSD' in rcorder['keyword']:
-		error('rcorder_keyword_freebsd', num, filename)
+    if 'FreeBSD' in rcorder['keyword']:
+        error('rcorder_keyword_freebsd', num, filename)
 
-	if re.match('# [PRBK]', lines[num]):
-		error('rcorder_order', num, filename)
+    if re.match('# [PRBK]', lines[num]):
+        error('rcorder_order', num, filename)
 
-	return num
+    return num
 
 def check_intro(lines, num, filename):
-	logging.debug('Checking sourcing lines')
-	while lines[num] == '' or lines[num][0] == '#':
-		num += 1
-
-	if lines[num] != '. /etc/rc.subr':
-		error('rc_subr_late', num, filename)
-
-	logging.debug('Checking name assignment')
-	while lines[num] == '' or lines[num][0] == '#' or lines[num][0] == '.':
-		num += 1
-
-	name = get_value('name', lines[num])
-	if not name:
-		error('name_missing', num, filename)
-	elif check_quoted(name):
-		error('name_quoted', num, filename)
-	else:
-		logging.debug('name discovered as %s' % name)
-		num += 1
-
-	logging.debug('Checking rcvar')
-	rcvar = get_value('rcvar', lines[num])
-	logging.debug('rcvar discovered as %s' % rcvar if rcvar else 'rcvar not discovered')
-	if not rcvar:
-		error('rcvar_missing', num, filename)
-	elif check_quoted(rcvar):
-		error('rcvar_quoted', num, filename)
-	elif rcvar != '%s_enable' % name:
-		error('rcvar_incorrect', num, filename)
-	else:
-		num += 1
-
-	logging.debug('Checking load_rc_config')
-	if lines[num] == '':
-		num += 1
-	else:
-		error('rcvar_extra', num, filename)
-
-	if re.match('load_rc_config (?:\$name|%s)' % name, lines[num]):
-		num += 1
-	else:
-		error('load_rc_config_missing', num, filename)
-
-	if lines[num] == '':
-		num += 1
-	else:
-		error('load_rc_config_extra', num, filename)
+    logging.debug('Checking sourcing lines')
+    while lines[num] == '' or lines[num][0] == '#':
+        num += 1
+
+    if lines[num] != '. /etc/rc.subr':
+        error('rc_subr_late', num, filename)
+
+    logging.debug('Checking name assignment')
+    while lines[num] == '' or lines[num][0] == '#' or lines[num][0] == '.':
+        num += 1
+
+    name = get_value('name', lines[num])
+    if not name:
+        error('name_missing', num, filename)
+    elif check_quoted(name):
+        error('name_quoted', num, filename)
+    else:
+        logging.debug('name discovered as %s' % name)
+        num += 1
+
+    logging.debug('Checking rcvar')
+    rcvar = get_value('rcvar', lines[num])
+    logging.debug('rcvar discovered as %s' % rcvar if rcvar else 'rcvar not discovered')
+
+    if not rcvar:
+        error('rcvar_missing', num, filename)
+    elif check_quoted(rcvar):
+        error('rcvar_quoted', num, filename)
+    elif rcvar != '%s_enable' % name:
+        error('rcvar_incorrect', num, filename)
+    else:
+        num += 1
+
+    logging.debug('Checking load_rc_config')
+    if lines[num] == '':
+        num += 1
+    else:
+        error('rcvar_extra', num, filename)
+
+    if re.match('load_rc_config (?:\$name|%s)' % name, lines[num]):
+        num += 1
+    else:
+        error('load_rc_config_missing', num, filename)
+
+    if lines[num] == '':
+        num += 1
+    else:
+        error('load_rc_config_extra', num, filename)
 
-	return num
+    return num
 
 def check_defaults(lines, num, filename):
-	logging.debug('Checking defaults set')
+    logging.debug('Checking defaults set')
+
+    default = { }
+    try:
+        while lines[num]:
+            while lines[num][0] == '#' or lines[num][:4] == 'eval':
+                num += 1
+            if lines[num][0] == ':':
+                # Shorthand set self-default assignment
+                (target, operator, value) = re.match(': \${([^:=]+)(:?=)([^}]+)}', lines[num]).groups()
+                if operator == ':=' and not mandatory(target):
+                    error('defaults_non_mandatory_colon', num, filename)
+                elif operator == '=' and mandatory(target):
+                    error('defaults_mandatory_colon', num, filename)
+
+            else:
+                # Longhand set default assignment
+                (target, source, operator, value) = re.match('([^=]+)=\${([^:-]+)(:?-)([^}]+)}', lines[num]).groups()
+                if target == source:
+                    error('defaults_old_style', num, filename)
+
+                if operator == ':-' and not mandatory(target):
+                    error('defaults_non_mandatory_colon', num, filename)
+                elif operator == '-' and mandatory(target):
+                    error('defaults_mandatory_colon', num, filename)
+
+            if check_quoted(value):
+                error('defaults_value_quoted', num, filename)
 
-	default = { }
-	try:
-	    while lines[num]:
-		while lines[num][0] == '#' or lines[num][:4] == 'eval': num += 1
-		if lines[num][0] == ':':
-			# Shorthand set self-default assignment
-			(target, operator, value) = re.match(': \${([^:=]+)(:?=)([^}]+)}', lines[num]).groups()
-			if operator == ':=' and not mandatory(target):
-				error('defaults_non_mandatory_colon', num, filename)
-			elif operator == '=' and mandatory(target):
-				error('defaults_mandatory_colon', num, filename)
-
-		else:
-			# Longhand set default assignment
-			(target, source, operator, value) = re.match('([^=]+)=\${([^:-]+)(:?-)([^}]+)}', lines[num]).groups()
-			if target == source:
-				error('defaults_old_style', num, filename)
-
-			if operator == ':-' and not mandatory(target):
-				error('defaults_non_mandatory_colon', num, filename)
-			elif operator == '-' and mandatory(target):
-				error('defaults_mandatory_colon', num, filename)
-
-		if check_quoted(value):
-			error('defaults_value_quoted', num, filename)
-
-		num += 1
-	except:
-		error('defaults_invalid', num, filename)
-
-	# Allow line breaks in the middle; if we put
-	# gaps in that's usually good style.  Lookahead!
-	if lines[num+1] and (':' in lines[num+1] or '-' in lines[num+1]):
-		return check_defaults(lines, num, filename)
-	else:
-		return num
+            num += 1
+    except:
+        error('defaults_invalid', num, filename)
+
+    # Allow line breaks in the middle; if we put
+    # gaps in that's usually good style.  Lookahead!
+    if lines[num+1] and (':' in lines[num+1] or '-' in lines[num+1]):
+        return check_defaults(lines, num, filename)
+    else:
+        return num
 
 def check_definitions(lines, num, filename):
-	logging.debug('Checking the basic definitions')
+    logging.debug('Checking the basic definitions')
 
-	num += 1
+    num += 1
 
-	while lines[num]:
-		while lines[num][0] == '#' or lines[num][:4] == 'eval': num += 1
-		try:
-			(var, value) = get_assignment(lines[num])
-		except:
-			error('definitions_missing', num, filename)
-			return num
-
-		if check_quoted(value):
-			if ' ' not in lines[num] and '	' not in lines[num]:
-				error('definitions_quoted', num, filename)
-		num += 1
-
-	# As in check_defaults, allow line breaks in the middle; if we put
-	# gaps in that's usually good style.  Lookahead!
-	if lines[num+1] and '=' in lines[num+1]:
-		return check_definitions(lines, num, filename)
-	else:
-		return num
+    while lines[num]:
+        while lines[num][0] == '#' or lines[num][:4] == 'eval': num += 1
+        try:
+            (var, value) = get_assignment(lines[num])
+        except:
+            error('definitions_missing', num, filename)
+            return num
+
+        if check_quoted(value):
+            if ' ' not in lines[num] and '	' not in lines[num]:
+                error('definitions_quoted', num, filename)
+        num += 1
+
+    # As in check_defaults, allow line breaks in the middle; if we put
+    # gaps in that's usually good style.  Lookahead!
+    if lines[num+1] and '=' in lines[num+1]:
+        return check_definitions(lines, num, filename)
+    else:
+        return num
 
 def check_functions(lines, num, filename):
-	logging.debug('Now checking functions')
+    logging.debug('Now checking functions')
 
-	num += 1
-	func = { }
+    num += 1
+    func = { }
 
-	while lines[num]:
-		while not lines[num] or lines[num][0] == '#': num += 1
+    while lines[num]:
+        while not lines[num] or lines[num][0] == '#': num += 1
 
-		if lines[num][-2:] != '()':
-			if lines[num][-1] == '{':
-				error('functions_brace_inline', num, filename)
-			else:
-				logging.debug('No functions left!')
-				return num
-		if ' ' in lines[num]:
-			error('functions_spaces', num, filename)
-		func['name'] = lines[num][:-2]
-
-		num += 1
-		if lines[num] != '{':
-			error('functions_brace_missing', num, filename)
-
-		num += 1
-		tmp = num
-		try:
-			while lines[num] != '}':
-				tmp += 1
-				if lines[num] and lines[num][0] != '#':
-					func['length'] += 1 
-		except:
-			error('functions_neverending', num, filename)
-			return num
+        if lines[num][-2:] != '()':
+            if lines[num][-1] == '{':
+                error('functions_brace_inline', num, filename)
+            else:
+                logging.debug('No functions left!')
+                return num
+        if ' ' in lines[num]:
+            error('functions_spaces', num, filename)
+        func['name'] = lines[num][:-2]
+
+        num += 1
+        if lines[num] != '{':
+            error('functions_brace_missing', num, filename)
+
+        num += 1
+        tmp = num
+        try:
+            while lines[num] != '}':
+                tmp += 1
+                if lines[num] and lines[num][0] != '#':
+                    func['length'] += 1 
+        except:
+            error('functions_neverending', num, filename)
+            return num
 
-		if func['length'] == 1:
-			error('functions_short', num, filename)
+        if func['length'] == 1:
+            error('functions_short', num, filename)
 
 def general_checks(lines, filename):
-	logging.debug('Checking for unrecommended sequences')
-	for num in range(0, len(lines)):
-		for regex in problems.keys():
-			if lines[num] and re.search(regex, lines[num]):
-				logging.warn("[%d]%s: %s " % (num, filename, problems[key][1]))
-				explain(problem)
+    logging.debug('Checking for unrecommended sequences')
+    for num in range(0, len(lines)):
+        for regex in problems.keys():
+            if lines[num] and re.search(regex, lines[num]):
+                logging.warn("[%d]%s: %s " % (num, filename, problems[key][1]))
+                explain(problem)
 
 def do_rclint(filename):
-	logging.debug('Suck in file %s' % filename)
-	try:
-		lines=[line.rstrip('\n') for line in open(filename)]
-	except: 
-		logging.error('Cannot open %s for testing' % filename)
-		return
-	lineno = { 'begin': 0 }
-
-	lineno['header'] = check_header(lines, lineno['begin'], filename)
-	lineno['intro'] = check_intro(lines, lineno['header'], filename)
-	lineno['defaults'] = check_defaults(lines, lineno['intro'], filename)
-	lineno['definitions'] = check_definitions(lines, lineno['defaults'], filename)
-	lineno['functions'] = check_functions(lines, lineno['definitions'], filename)
+    logging.debug('Suck in file %s' % filename)
+    try:
+        lines=[line.rstrip('\n') for line in open(filename)]
+    except: 
+        logging.error('Cannot open %s for testing' % filename)
+        return
+    lineno = {'begin': 0}
+
+    lineno['header'] = check_header(lines, lineno['begin'], filename)
+    lineno['intro'] = check_intro(lines, lineno['header'], filename)
+    lineno['defaults'] = check_defaults(lines, lineno['intro'], filename)
+    lineno['definitions'] = check_definitions(lines, lineno['defaults'], filename)
+    lineno['functions'] = check_functions(lines, lineno['definitions'], filename)
 
-	general_checks(lines, filename)
+    general_checks(lines, filename)
 
 parser = argparse.ArgumentParser()
 parser.add_argument('filenames', nargs = '+')
@@ -307,4 +315,4 @@ errors = read_db('errors', args.language
 problems = read_db('problems', args.language[0])
 
 for file in args.filenames:
-	do_rclint(file)
+    do_rclint(file)

From owner-svn-src-user@FreeBSD.ORG  Wed Oct 17 20:17:57 2012
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52])
 by hub.freebsd.org (Postfix) with ESMTP id 202D6E0C;
 Wed, 17 Oct 2012 20:17:57 +0000 (UTC)
 (envelope-from crees@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c])
 by mx1.freebsd.org (Postfix) with ESMTP id 074498FC08;
 Wed, 17 Oct 2012 20:17:57 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
 by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q9HKHuxs054848;
 Wed, 17 Oct 2012 20:17:56 GMT (envelope-from crees@svn.freebsd.org)
Received: (from crees@localhost)
 by svn.freebsd.org (8.14.4/8.14.4/Submit) id q9HKHuPT054844;
 Wed, 17 Oct 2012 20:17:56 GMT (envelope-from crees@svn.freebsd.org)
Message-Id: <201210172017.q9HKHuPT054844@svn.freebsd.org>
From: Chris Rees <crees@FreeBSD.org>
Date: Wed, 17 Oct 2012 20:17:56 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
Subject: svn commit: r241647 - user/crees/rclint
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.14
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
 src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/options/svn-src-user>,
 <mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
 <mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Wed, 17 Oct 2012 20:17:57 -0000

Author: crees (ports committer)
Date: Wed Oct 17 20:17:56 2012
New Revision: 241647
URL: http://svn.freebsd.org/changeset/base/241647

Log:
  Fix regex code
  
  Submitted by:	eadler
  
  Check that last line of file contains check_run_rc
  
  Functions checking still edgy

Modified:
  user/crees/rclint/errors.en
  user/crees/rclint/problems.en
  user/crees/rclint/rclint.py

Modified: user/crees/rclint/errors.en
==============================================================================
--- user/crees/rclint/errors.en	Wed Oct 17 19:24:13 2012	(r241646)
+++ user/crees/rclint/errors.en	Wed Oct 17 20:17:56 2012	(r241647)
@@ -39,4 +39,9 @@ rcvar_quoted	rcvar is quoted	Do not quot
 
 rcsid	Missing FreeBSD RCSId keyword	All rc scripts must contain a line beginning # $FreeBSD$.  Do not include blank lines without comment markers at the beginning (#) until the script begins
 
+run_rc_argument	Incorrect argument to run_rc_command	The last line of the file should be run_rc_command $1
+run_rc_cruft	Order of rc file incorrect	Order of the rc file should be shebang/header/$FreeBSD$/setting defaults/setting other definitions/defining functions.  Do not include unassociated shell commands, and blocks must be separated by single blank lines.  Single blank lines may appear inside the defaults, definitions and functions blocks.
+run_rc_followed	run_rc_command line is not the last line in the file	Do not write anything after the run_rc_command line
+run_rc_quoted	Quoted argument to run_rc_command	No need to quote the argument to run_rc_command
+
 shebang	Incorrect shebang used	All rc scripts must start with the correct shebang; #!/bin/sh

Modified: user/crees/rclint/problems.en
==============================================================================
--- user/crees/rclint/problems.en	Wed Oct 17 19:24:13 2012	(r241646)
+++ user/crees/rclint/problems.en	Wed Oct 17 20:17:56 2012	(r241647)
@@ -1,2 +1,3 @@
 # Format of this file: regex<TAB>short_explanation<TAB>explanation
-regex	explain	explanation
+#regex	explain	explanation
+^[^#{}.l\s][^-=()]*[^)]$	Unassociated shell command	Do not put shell commands outside functions-- it slows down rc on boot and every invocation of the rc file

Modified: user/crees/rclint/rclint.py
==============================================================================
--- user/crees/rclint/rclint.py	Wed Oct 17 19:24:13 2012	(r241646)
+++ user/crees/rclint/rclint.py	Wed Oct 17 20:17:56 2012	(r241647)
@@ -55,7 +55,7 @@ def explain(error):
                             initial_indent='==> ', subsequent_indent='    ')
 
 def error(type, line_number, filename):
-    logging.error("[%d]%s: %s " % (line_number, filename, errors[type][0]))
+    logging.error("[%d]%s: %s " % (line_number + 1, filename, errors[type][0]))
     explain(errors[type])
 
 def check_quoted(string):
@@ -73,7 +73,7 @@ def get_value(var, line):
 
 def get_assignment(line):
     try:
-        return re.match('(\S+)=(\S+)$', line).groups()
+        return re.match('(\S+)=(.+)$', line).groups()
     except:
         return False
 
@@ -246,7 +246,8 @@ def check_functions(lines, num, filename
     func = { }
 
     while lines[num]:
-        while not lines[num] or lines[num][0] == '#': num += 1
+        while not lines[num] or lines[num][0] == '#':
+            num += 1
 
         if lines[num][-2:] != '()':
             if lines[num][-1] == '{':
@@ -257,16 +258,18 @@ def check_functions(lines, num, filename
         if ' ' in lines[num]:
             error('functions_spaces', num, filename)
         func['name'] = lines[num][:-2]
+        func['length'] = 0
 
         num += 1
         if lines[num] != '{':
             error('functions_brace_missing', num, filename)
 
         num += 1
-        tmp = num
+
         try:
             while lines[num] != '}':
-                tmp += 1
+                print lines[num]
+                num += 1
                 if lines[num] and lines[num][0] != '#':
                     func['length'] += 1 
         except:
@@ -276,13 +279,43 @@ def check_functions(lines, num, filename
         if func['length'] == 1:
             error('functions_short', num, filename)
 
+    print lines[num]
+    print lines[num+1]
+    print lines[num+2]
+
+    if lines[num+2] and '{' in lines[num+2]:
+        return check_functions(lines, num, filename)
+    else:
+        return num
+
+def check_run_rc(lines, num, filename):
+    logging.debug('Checking the last line of the file contains run_rc_command')
+
+    while not lines[num] or lines[num][0] == '#':
+        num += 1
+
+    try:
+        arg = re.match('run_rc_command (.*)$', lines[num]).group(1)
+        if check_quoted(arg):
+            error('run_rc_quoted', num, filename)
+        elif arg != r'$1':
+            error('run_rc_argument', num, filename)
+
+        if num < len(lines) - 1:
+            error('run_rc_followed', num, filename)
+    except:
+        error('run_rc_cruft', num, filename)
+
 def general_checks(lines, filename):
-    logging.debug('Checking for unrecommended sequences')
-    for num in range(0, len(lines)):
+    logging.debug('Checking for unrecommended sequences and orphan commands')
+    # Don't use regex on last line, it must contain run_rc_command, which fails
+    # unassociated shell command test.  We already hacked for load_rc_config
+    for num in range(0, len(lines) - 1):
         for regex in problems.keys():
             if lines[num] and re.search(regex, lines[num]):
-                logging.warn("[%d]%s: %s " % (num, filename, problems[key][1]))
-                explain(problem)
+                logging.warn("[%d]%s: %s " % (num + 1, filename,
+                             problems[regex][0]))
+                explain(problems[regex])
 
 def do_rclint(filename):
     logging.debug('Suck in file %s' % filename)
@@ -298,6 +331,7 @@ def do_rclint(filename):
     lineno['defaults'] = check_defaults(lines, lineno['intro'], filename)
     lineno['definitions'] = check_definitions(lines, lineno['defaults'], filename)
     lineno['functions'] = check_functions(lines, lineno['definitions'], filename)
+    check_run_rc(lines, lineno['functions'], filename)
 
     general_checks(lines, filename)
 
@@ -309,7 +343,7 @@ parser.add_argument('-v', action='count'
 args = parser.parse_args()
 
 verbosity = args.v
-logging.basicConfig(level=logging.DEBUG if verbosity > 1 else logging.ERROR)
+logging.basicConfig(level=logging.DEBUG if verbosity > 1 else logging.WARN)
 
 errors = read_db('errors', args.language[0])
 problems = read_db('problems', args.language[0])

From owner-svn-src-user@FreeBSD.ORG  Wed Oct 17 23:51:52 2012
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52])
 by hub.freebsd.org (Postfix) with ESMTP id 4FD60ED6
 for <svn-src-user@freebsd.org>; Wed, 17 Oct 2012 23:51:52 +0000 (UTC)
 (envelope-from lists@eitanadler.com)
Received: from mail-pa0-f54.google.com (mail-pa0-f54.google.com
 [209.85.220.54])
 by mx1.freebsd.org (Postfix) with ESMTP id 16CEE8FC16
 for <svn-src-user@freebsd.org>; Wed, 17 Oct 2012 23:51:48 +0000 (UTC)
Received: by mail-pa0-f54.google.com with SMTP id bi1so8283762pad.13
 for <svn-src-user@freebsd.org>; Wed, 17 Oct 2012 16:51:48 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=eitanadler.com; s=0xdeadbeef;
 h=mime-version:sender:in-reply-to:references:from:date
 :x-google-sender-auth:message-id:subject:to:cc:content-type;
 bh=+BxYtDb4BrKiyOxBHt+j6LU7KABjtP7KNwD3UvO+qio=;
 b=G9hosPlHNydb8de2CRPu9+QsYJamTiIFJDrHYKDeXNLBDT3j0WLu41QAVyVqwyc0hl
 DYEOcMytUBZVWh+nDlWbj0CYaDLRsrPnKjajQLDvgMKt/Uz0drIS8fJytkS54n02Zqdt
 NeZwc7h/d/OCrOofN3E2elFKY/KLHs+0GpP3k=
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=google.com; s=20120113;
 h=mime-version:sender:in-reply-to:references:from:date
 :x-google-sender-auth:message-id:subject:to:cc:content-type
 :x-gm-message-state;
 bh=+BxYtDb4BrKiyOxBHt+j6LU7KABjtP7KNwD3UvO+qio=;
 b=QOcpoELdFgar4lG4CTMnl7/QmjV9D2b8kjtyeh+52rbz6POLdrm6aq4CMBveH8ofIC
 y1E1qe+P1pqfybX4pGBD83FjzOVXDTs7GdXQHXdtaD4r6rYt518byZYAqevE1viSNytP
 BoSgvM9FH6NDDYEiVh6DjkR3Irp0LgtihxE4kFCkvJHqmS8pcr7jpS5b+jrXPkVIxZRJ
 k1ODBDM2TdF3PQZAf4YfXVz6vtWGNIrHrai4/ux29Zl3ne1OnKOEcn7juKf4pg1ddRrj
 HaM8ZNSkK8kd6gAUyHSrRq7EiaFDy0UCVfVBrDsjbT0tqLAzTj/2vOj7WoQg5H8+S8vd
 hXtA==
Received: by 10.68.242.231 with SMTP id wt7mr60527104pbc.99.1350517908507;
 Wed, 17 Oct 2012 16:51:48 -0700 (PDT)
MIME-Version: 1.0
Sender: lists@eitanadler.com
Received: by 10.66.161.163 with HTTP; Wed, 17 Oct 2012 16:51:18 -0700 (PDT)
In-Reply-To: <201210172017.q9HKHuPT054844@svn.freebsd.org>
References: <201210172017.q9HKHuPT054844@svn.freebsd.org>
From: Eitan Adler <eadler@freebsd.org>
Date: Wed, 17 Oct 2012 19:51:18 -0400
X-Google-Sender-Auth: 35cxcH-goDllZUxAB6x75OzkP3I
Message-ID: <CAF6rxgm142pL-wxQXdyO0YQ5nfpMuZuwXyyP2W82DTYAhNGvZQ@mail.gmail.com>
Subject: Re: svn commit: r241647 - user/crees/rclint
To: Chris Rees <crees@freebsd.org>
Content-Type: text/plain; charset=UTF-8
X-Gm-Message-State: ALoCoQmu4JyoJHlmugBEvPHRm5yV3e3fuE9w41vMFE8Btk7o9X36UkTpql2IX6YMi9g8J2UmXIAR
Cc: src-committers@freebsd.org, svn-src-user@freebsd.org
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.14
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
 src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/options/svn-src-user>,
 <mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
 <mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Wed, 17 Oct 2012 23:51:52 -0000

more fun!

On 17 October 2012 16:17, Chris Rees <crees@freebsd.org> wrote:
> +#regex explain explanation
> +^[^#{}.l\s][^-=()]*[^)]$       Unassociated shell command      Do not put shell commands outside functions-- it slows down rc on boot and every invocation of the rc file

is this missing a \ before the \?

>  def get_assignment(line):
>      try:
> -        return re.match('(\S+)=(\S+)$', line).groups()
> +        return re.match('(\S+)=(.+)$', line).groups()

ditto

-- 
Eitan Adler
Source & Ports committer
X11, Bugmeister, Ports Security teams

From owner-svn-src-user@FreeBSD.ORG  Thu Oct 18 08:11:15 2012
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52])
 by hub.freebsd.org (Postfix) with ESMTP id 81D8CEBC;
 Thu, 18 Oct 2012 08:11:15 +0000 (UTC) (envelope-from uqs@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c])
 by mx1.freebsd.org (Postfix) with ESMTP id 680988FC17;
 Thu, 18 Oct 2012 08:11:15 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
 by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q9I8BFCX086235;
 Thu, 18 Oct 2012 08:11:15 GMT (envelope-from uqs@svn.freebsd.org)
Received: (from uqs@localhost)
 by svn.freebsd.org (8.14.4/8.14.4/Submit) id q9I8BFsF086230;
 Thu, 18 Oct 2012 08:11:15 GMT (envelope-from uqs@svn.freebsd.org)
Message-Id: <201210180811.q9I8BFsF086230@svn.freebsd.org>
From: Ulrich Spoerlein <uqs@FreeBSD.org>
Date: Thu, 18 Oct 2012 08:11:15 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
Subject: svn commit: r241674 - in user/uqs: . git_conv
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.14
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
 src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/options/svn-src-user>,
 <mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
 <mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Thu, 18 Oct 2012 08:11:15 -0000

Author: uqs
Date: Thu Oct 18 08:11:14 2012
New Revision: 241674
URL: http://svn.freebsd.org/changeset/base/241674

Log:
  Add git_conv scripts and rules, as used on git.freebsd.org
  
  The modified svn2git sources are at
  https://gitorious.org/~uqs/svn2git/uqs-svn2git
  
  This should make it easier for other people to re-do the conversions and
  verify their authenticity.

Added:
  user/uqs/
  user/uqs/git_conv/
  user/uqs/git_conv/freebsd-doc.rules
  user/uqs/git_conv/freebsd-ports.rules
  user/uqs/git_conv/freebsd.rules
  user/uqs/git_conv/git_conv   (contents, props changed)
  user/uqs/git_conv/git_conv_cron   (contents, props changed)

Added: user/uqs/git_conv/freebsd-doc.rules
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ user/uqs/git_conv/freebsd-doc.rules	Thu Oct 18 08:11:14 2012	(r241674)
@@ -0,0 +1,49 @@
+# vi:ft=perl:
+create repository freebsd-doc.git
+end repository
+
+match /head/
+  repository freebsd-doc.git
+  branch master
+end match
+
+# ignore this stuff
+match /svnadmin/.*
+end match
+match /doc-branch-policy.txt
+end match
+
+# Used during cvs2svn conversion
+match /(branches)/([A-Z0-9_]+)/
+  repository freebsd-doc.git
+  branch \1/\2
+end match
+
+match /(stable|releng|release)/([A-Z0-9.]+)/
+  repository freebsd-doc.git
+  branch \1/\2
+end match
+
+match /(www)/
+  repository freebsd-doc.git
+  branch \1
+end match
+
+match /(projects|release)/([^/]+)/
+  repository freebsd-doc.git
+  branch \1/\2
+end match
+
+match /(translations)/
+  repository freebsd-doc.git
+  branch \1
+end match
+
+match /(user)/([^/]+)/([^/]+)/
+  repository freebsd-doc.git
+  branch \1/\2/\3
+end match
+
+# ignore the rest, XXX temp only
+#match .*
+#end match

Added: user/uqs/git_conv/freebsd-ports.rules
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ user/uqs/git_conv/freebsd-ports.rules	Thu Oct 18 08:11:14 2012	(r241674)
@@ -0,0 +1,21 @@
+# vi:ft=perl:
+create repository freebsd-ports.git
+end repository
+
+match /head/
+  repository freebsd-ports.git
+  branch master
+end match
+
+# ignore this stuff
+match /svnadmin/.*
+end match
+
+match /(branches|tags)/([A-Z0-9_]+)/
+  repository freebsd-ports.git
+  branch \1/\2
+end match
+
+# ignore the rest, XXX temp only
+#match .*
+#end match

Added: user/uqs/git_conv/freebsd.rules
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ user/uqs/git_conv/freebsd.rules	Thu Oct 18 08:11:14 2012	(r241674)
@@ -0,0 +1,104 @@
+# vi:ft=perl:
+create repository freebsd.git
+end repository
+
+match /head/
+  repository freebsd.git
+  branch master
+end match
+
+# ignore this stuff
+match /ROADMAP.txt
+end match
+match /projects/GUIDELINES.txt
+end match
+match /user/GUIDELINES.txt
+end match
+match /vendor/atf/(README.txt|FREEBSD-Xlist)
+end match
+
+match /svnadmin/.*
+end match
+
+match /(cvs2svn)/([^/]+)/([^/]+)/
+  repository freebsd.git
+  branch \1/\2/\3
+end match
+
+match /(stable|releng|release)/([0-9.]+)/
+  repository freebsd.git
+  branch \1/\2
+end match
+
+match /(releng)/ALPHA_2_0/
+  repository freebsd.git
+  branch \1/2.0a
+end match
+
+match /(releng)/BETA_2_0/
+  repository freebsd.git
+  branch \1/2.0b
+end match
+
+# special nesting for these
+match /(projects)/(graid|ofed)/([^/]+)/
+  repository freebsd.git
+  branch \1/\2/\3
+end match
+
+match /(projects)/([^/]+)/
+  repository freebsd.git
+  branch \1/\2
+end match
+
+# /user/piso was created wrong
+match /(user)/(piso)/
+  repository freebsd.git
+  branch \1/\2/ipfw_old
+  min revision 186541
+  max revision 190858
+end match
+match /(user)/(piso)/([^/]+)/
+  repository freebsd.git
+  branch \1/\2/\3
+  min revision 190859
+end match
+# ignore stuff, no branch for these
+match /user/gad/README.txt
+end match
+match /user/des/Makefile.inc
+end match
+match /user/simon/test.txt
+end match
+match /user/peter/foo.txt
+end match
+match /vendor/(bzip2|flex)/FREEBSD-(Xlist|upgrade)
+end match
+match /vendor/v4l/README
+end match
+
+# fixup trailing dot
+match /vendor/(clang|llvm)/(clang|llvm)-(r73070)\./
+  repository freebsd.git
+  branch vendor/\1/\2-\3
+end match
+
+# wrong tag, ignore r210074 and r210075
+match /vendor/(clang|llvm)-(r108243)/
+end match
+
+# unknown vendor is one level short
+match /(vendor)/(unknown)/
+  repository freebsd.git
+  branch \1/\2
+end match
+
+# XXX drop the different vendor-* prefixes?
+match /(user|vendor|vendor-sys|vendor-cddl|vendor-crypto)/([^/]+)/([^/]+)/
+  repository freebsd.git
+  branch \1/\2/\3
+end match
+
+# ignore the rest, XXX temp only
+#match .*
+#end match

Added: user/uqs/git_conv/git_conv
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ user/uqs/git_conv/git_conv	Thu Oct 18 08:11:14 2012	(r241674)
@@ -0,0 +1,94 @@
+#!/bin/sh
+#
+# Repository creation and setup
+#
+# Simple for svn2git repos, need to run against local paths, using rules files in ~uqs/svn2git
+# - First svn2git run will create target git repo
+# - git remote add github github.com:freebsd/freebsd.git
+# - git config --add remote.github.push '+refs/heads/master:refs/heads/master'
+# - git config --add remote.github.push '+refs/heads/stable/*:refs/heads/stable/*'
+# - git config --add remote.github.push '+refs/heads/projects/*:refs/heads/projects/*'
+# - git config --add remote.github.push '+refs/notes/*:refs/notes/*'
+# - etc.
+# - touch freebsd.git/git-daemon-export-ok
+# - ~uqs/svn2git/svn-all-fast-export --rules ~uqs/svn2git/freebsd.rules --add-metadata-notes --identity-domain FreeBSD.org /home/svn/base
+# - git push github
+# done. Analog steps needed for doc and ports.
+#
+# For git-svn it's a bit more involved. We use separate working dirs, but push to the same destination repo.
+# - git svn init -Thead -rewrite-root=svn+ssh://svn.freebsd.org/base file:///home/svn/base src-head.git
+# - cd src-head.git
+# - git svn fetch -r 0:1000
+# - git remote add github github.com:freebsd/freebsd.git
+# - git config --add remote.github.push '+refs/remotes/trunk:refs/heads/svn_head'
+# - git svn rebase
+# - git push github
+
+LOCK=/tmp/gitconv.lock
+RULES=/home/uqs/svn2git
+SVN2GIT=/home/uqs/svn2git/svn-all-fast-export
+BASE=/home/git
+
+trap 'rm -f ${LOCK} ; exit 1' 1 2 3 15
+if ! shlock -p $$ -f ${LOCK}; then
+    echo "Locked by `cat ${LOCK}`, running too long? Please fix ..." >&2
+    exit 1
+fi
+
+svn2git()
+{
+    local rules source target dest
+    rules=$1; shift
+    source=$1; shift
+    dest="$@"
+
+    # FIXME: error prone, yuck
+    target=${rules%.rules}.git
+    target=`basename $target`
+
+    echo "Converting $source to $target using svn2git"
+    cd $BASE
+    $SVN2GIT --add-metadata-notes --identity-domain FreeBSD.org \
+	--rules $rules $source
+    if [ $? != 0 ]; then
+	echo "Error in svn2git conversion of $source" >&2
+	exit 1
+    fi
+
+    echo "Pushing $target to $dest"
+    cd $target && for d in $dest; do git push $d || break; done
+    if [ $? != 0 ]; then
+	echo "Error in pushing to $dest" >&2
+	exit 1
+    fi
+}
+
+gitsvn()
+{
+    local target dest
+    target=$1; shift
+    dest="$@"
+
+    echo "Converting $target using git-svn"
+    cd $BASE/$target
+    git svn rebase
+    if [ $? != 0 ]; then
+	echo "Error in git-svn conversion of $target" >&2
+	exit 1
+    fi
+
+    echo "Pushing $target to $dest"
+    for d in $dest; do git push $d || break; done
+    if [ $? != 0 ]; then
+	echo "Error in pushing to $dest" >&2
+	exit 1
+    fi
+}
+
+svn2git $RULES/freebsd.rules /home/svn/base github
+svn2git $RULES/freebsd-doc.rules /home/svn/doc github
+svn2git $RULES/freebsd-ports.rules /home/svn/ports github
+
+gitsvn src-head.git github
+gitsvn doc-head.git github
+gitsvn ports-head.git github

Added: user/uqs/git_conv/git_conv_cron
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ user/uqs/git_conv/git_conv_cron	Thu Oct 18 08:11:14 2012	(r241674)
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+today="`date +%Y-%m-%d`"
+log="$today.log"
+
+cd /home/git
+
+# TODO cleanup old logs
+
+git_conv >> $log 2>&1
+
+if [ $? != 0 ]; then
+    echo "Error during git_conv" >&2
+    tail $log
+    exit 1
+fi
+

From owner-svn-src-user@FreeBSD.ORG  Fri Oct 19 08:53:07 2012
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52])
 by hub.freebsd.org (Postfix) with ESMTP id E73BB3AD;
 Fri, 19 Oct 2012 08:53:07 +0000 (UTC) (envelope-from des@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c])
 by mx1.freebsd.org (Postfix) with ESMTP id D00EE8FC12;
 Fri, 19 Oct 2012 08:53:07 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
 by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q9J8r75W042759;
 Fri, 19 Oct 2012 08:53:07 GMT (envelope-from des@svn.freebsd.org)
Received: (from des@localhost)
 by svn.freebsd.org (8.14.4/8.14.4/Submit) id q9J8r7SB042756;
 Fri, 19 Oct 2012 08:53:07 GMT (envelope-from des@svn.freebsd.org)
Message-Id: <201210190853.q9J8r7SB042756@svn.freebsd.org>
From: Dag-Erling Smørgrav <des@FreeBSD.org>
Date: Fri, 19 Oct 2012 08:53:07 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
Subject: svn commit: r241722 - user/des/tinderbox/etc
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.14
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
 src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/options/svn-src-user>,
 <mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
 <mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Fri, 19 Oct 2012 08:53:08 -0000

Author: des
Date: Fri Oct 19 08:53:07 2012
New Revision: 241722
URL: http://svn.freebsd.org/changeset/base/241722

Log:
  Add mips64 to the mix

Modified:
  user/des/tinderbox/etc/head.rc
  user/des/tinderbox/etc/update_head.rc

Modified: user/des/tinderbox/etc/head.rc
==============================================================================
--- user/des/tinderbox/etc/head.rc	Fri Oct 19 05:50:56 2012	(r241721)
+++ user/des/tinderbox/etc/head.rc	Fri Oct 19 08:53:07 2012	(r241722)
@@ -5,5 +5,5 @@
 #
 
 branches	= HEAD
-platforms	= amd64, arm, i386, i386/pc98, ia64, mips, powerpc, powerpc64/powerpc, sparc64
+platforms	= amd64, arm, i386, i386/pc98, ia64, mips, mips64/mips, powerpc, powerpc64/powerpc, sparc64
 recipient	= %%SENDER%%,<current@freebsd.org>,<%%arch%%@freebsd.org>

Modified: user/des/tinderbox/etc/update_head.rc
==============================================================================
--- user/des/tinderbox/etc/update_head.rc	Fri Oct 19 05:50:56 2012	(r241721)
+++ user/des/tinderbox/etc/update_head.rc	Fri Oct 19 08:53:07 2012	(r241722)
@@ -1,4 +1,4 @@
 # $FreeBSD$
 branches	= HEAD
-platforms	= amd64, arm, i386, i386/pc98, ia64, mips, powerpc, powerpc64/powerpc, sparc64
+platforms	= amd64, arm, i386, i386/pc98, ia64, mips, mips64/mips, powerpc, powerpc64/powerpc, sparc64
 targets		= update

From owner-svn-src-user@FreeBSD.ORG  Fri Oct 19 13:05:52 2012
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52])
 by hub.freebsd.org (Postfix) with ESMTP id C1990C66;
 Fri, 19 Oct 2012 13:05:52 +0000 (UTC)
 (envelope-from andre@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c])
 by mx1.freebsd.org (Postfix) with ESMTP id A25468FC16;
 Fri, 19 Oct 2012 13:05:52 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
 by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q9JD5q9v096260;
 Fri, 19 Oct 2012 13:05:52 GMT (envelope-from andre@svn.freebsd.org)
Received: (from andre@localhost)
 by svn.freebsd.org (8.14.4/8.14.4/Submit) id q9JD5qub096243;
 Fri, 19 Oct 2012 13:05:52 GMT (envelope-from andre@svn.freebsd.org)
Message-Id: <201210191305.q9JD5qub096243@svn.freebsd.org>
From: Andre Oppermann <andre@FreeBSD.org>
Date: Fri, 19 Oct 2012 13:05:52 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
Subject: svn commit: r241732 - in user/andre/tcp_workqueue/sys: amd64/amd64
 amd64/conf amd64/include amd64/include/pc amd64/pci arm/arm arm/at91
 arm/broadcom/bcm2835 arm/conf arm/econa arm/include arm/lpc a...
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.14
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
 src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/options/svn-src-user>,
 <mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
 <mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Fri, 19 Oct 2012 13:05:53 -0000

Author: andre
Date: Fri Oct 19 13:05:51 2012
New Revision: 241732
URL: http://svn.freebsd.org/changeset/base/241732

Log:
  Integrate from HEAD @241731.

Added:
  user/andre/tcp_workqueue/sys/arm/broadcom/bcm2835/dwc_otg_brcm.c
     - copied unchanged from r241731, head/sys/arm/broadcom/bcm2835/dwc_otg_brcm.c
  user/andre/tcp_workqueue/sys/arm/conf/AC100
     - copied unchanged from r241731, head/sys/arm/conf/AC100
  user/andre/tcp_workqueue/sys/boot/fdt/dts/db78460.dts
     - copied unchanged from r241731, head/sys/boot/fdt/dts/db78460.dts
  user/andre/tcp_workqueue/sys/boot/fdt/dts/tegra20-paz00.dts
     - copied unchanged from r241731, head/sys/boot/fdt/dts/tegra20-paz00.dts
  user/andre/tcp_workqueue/sys/boot/fdt/dts/tegra20.dtsi
     - copied unchanged from r241731, head/sys/boot/fdt/dts/tegra20.dtsi
  user/andre/tcp_workqueue/sys/cddl/compat/opensolaris/sys/assfail.h
     - copied unchanged from r241731, head/sys/cddl/compat/opensolaris/sys/assfail.h
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/trim_map.h
     - copied unchanged from r241731, head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/trim_map.h
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/trim_map.c
     - copied unchanged from r241731, head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/trim_map.c
  user/andre/tcp_workqueue/sys/dev/cxgbe/firmware/t4fw-1.6.2.0.bin.uu
     - copied unchanged from r241731, head/sys/dev/cxgbe/firmware/t4fw-1.6.2.0.bin.uu
  user/andre/tcp_workqueue/sys/dev/nvd/
     - copied from r241731, head/sys/dev/nvd/
  user/andre/tcp_workqueue/sys/dev/nvme/
     - copied from r241731, head/sys/dev/nvme/
  user/andre/tcp_workqueue/sys/dev/sdhci/sdhci_if.m
     - copied unchanged from r241731, head/sys/dev/sdhci/sdhci_if.m
  user/andre/tcp_workqueue/sys/dev/sdhci/sdhci_pci.c
     - copied unchanged from r241731, head/sys/dev/sdhci/sdhci_pci.c
  user/andre/tcp_workqueue/sys/dev/virtio/scsi/
     - copied from r241731, head/sys/dev/virtio/scsi/
  user/andre/tcp_workqueue/sys/fs/fuse/
     - copied from r241731, head/sys/fs/fuse/
  user/andre/tcp_workqueue/sys/modules/fuse/
     - copied from r241731, head/sys/modules/fuse/
  user/andre/tcp_workqueue/sys/modules/nvd/
     - copied from r241731, head/sys/modules/nvd/
  user/andre/tcp_workqueue/sys/modules/nvme/
     - copied from r241731, head/sys/modules/nvme/
  user/andre/tcp_workqueue/sys/modules/sdhci_pci/
     - copied from r241731, head/sys/modules/sdhci_pci/
  user/andre/tcp_workqueue/sys/modules/virtio/scsi/
     - copied from r241731, head/sys/modules/virtio/scsi/
  user/andre/tcp_workqueue/sys/net/if_pflog.h
     - copied unchanged from r241731, head/sys/net/if_pflog.h
  user/andre/tcp_workqueue/sys/net/if_pfsync.h
     - copied unchanged from r241731, head/sys/net/if_pfsync.h
  user/andre/tcp_workqueue/sys/net/pf_mtag.h
     - copied unchanged from r241731, head/sys/net/pf_mtag.h
  user/andre/tcp_workqueue/sys/net/pfvar.h
     - copied unchanged from r241731, head/sys/net/pfvar.h
  user/andre/tcp_workqueue/sys/netpfil/
     - copied from r241731, head/sys/netpfil/
Deleted:
  user/andre/tcp_workqueue/sys/boot/fdt/dts/db88f78160.dts
  user/andre/tcp_workqueue/sys/cam/scsi/scsi_low_pisa.c
  user/andre/tcp_workqueue/sys/cam/scsi/scsi_low_pisa.h
  user/andre/tcp_workqueue/sys/compat/netbsd/physio_proc.h
  user/andre/tcp_workqueue/sys/contrib/pf/
  user/andre/tcp_workqueue/sys/dev/mlx/mlx_compat.h
  user/andre/tcp_workqueue/sys/netinet/ipfw/
Modified:
  user/andre/tcp_workqueue/sys/amd64/amd64/identcpu.c
  user/andre/tcp_workqueue/sys/amd64/amd64/machdep.c
  user/andre/tcp_workqueue/sys/amd64/amd64/mp_machdep.c
  user/andre/tcp_workqueue/sys/amd64/amd64/pmap.c
  user/andre/tcp_workqueue/sys/amd64/amd64/trap.c
  user/andre/tcp_workqueue/sys/amd64/conf/GENERIC
  user/andre/tcp_workqueue/sys/amd64/conf/NOTES
  user/andre/tcp_workqueue/sys/amd64/include/atomic.h
  user/andre/tcp_workqueue/sys/amd64/include/intr_machdep.h
  user/andre/tcp_workqueue/sys/amd64/include/pc/bios.h
  user/andre/tcp_workqueue/sys/amd64/pci/pci_cfgreg.c
  user/andre/tcp_workqueue/sys/arm/arm/cpufunc.c
  user/andre/tcp_workqueue/sys/arm/arm/identcpu.c
  user/andre/tcp_workqueue/sys/arm/arm/machdep.c
  user/andre/tcp_workqueue/sys/arm/arm/pmap-v6.c
  user/andre/tcp_workqueue/sys/arm/arm/pmap.c
  user/andre/tcp_workqueue/sys/arm/arm/vm_machdep.c
  user/andre/tcp_workqueue/sys/arm/at91/at91_machdep.c
  user/andre/tcp_workqueue/sys/arm/at91/at91_rtc.c
  user/andre/tcp_workqueue/sys/arm/at91/at91_rtcreg.h
  user/andre/tcp_workqueue/sys/arm/broadcom/bcm2835/bcm2835_machdep.c
  user/andre/tcp_workqueue/sys/arm/broadcom/bcm2835/files.bcm2835
  user/andre/tcp_workqueue/sys/arm/conf/ARMADAXP
  user/andre/tcp_workqueue/sys/arm/conf/BEAGLEBONE
  user/andre/tcp_workqueue/sys/arm/conf/CNS11XXNAS
  user/andre/tcp_workqueue/sys/arm/conf/DOCKSTAR
  user/andre/tcp_workqueue/sys/arm/conf/EA3250
  user/andre/tcp_workqueue/sys/arm/conf/GUMSTIX-QEMU
  user/andre/tcp_workqueue/sys/arm/conf/HL201
  user/andre/tcp_workqueue/sys/arm/conf/KB920X
  user/andre/tcp_workqueue/sys/arm/conf/LN2410SBC
  user/andre/tcp_workqueue/sys/arm/conf/PANDABOARD
  user/andre/tcp_workqueue/sys/arm/conf/QILA9G20
  user/andre/tcp_workqueue/sys/arm/conf/RPI-B
  user/andre/tcp_workqueue/sys/arm/conf/SAM9G20EK
  user/andre/tcp_workqueue/sys/arm/conf/SAM9X25EK
  user/andre/tcp_workqueue/sys/arm/conf/SHEEVAPLUG
  user/andre/tcp_workqueue/sys/arm/conf/SN9G45
  user/andre/tcp_workqueue/sys/arm/conf/TS7800
  user/andre/tcp_workqueue/sys/arm/econa/econa_machdep.c
  user/andre/tcp_workqueue/sys/arm/include/armreg.h
  user/andre/tcp_workqueue/sys/arm/include/atomic.h
  user/andre/tcp_workqueue/sys/arm/include/intr.h
  user/andre/tcp_workqueue/sys/arm/include/machdep.h
  user/andre/tcp_workqueue/sys/arm/include/pmap.h
  user/andre/tcp_workqueue/sys/arm/lpc/lpc_machdep.c
  user/andre/tcp_workqueue/sys/arm/mv/armadaxp/armadaxp.c
  user/andre/tcp_workqueue/sys/arm/mv/common.c
  user/andre/tcp_workqueue/sys/arm/mv/mpic.c
  user/andre/tcp_workqueue/sys/arm/mv/mv_machdep.c
  user/andre/tcp_workqueue/sys/arm/mv/mv_pci.c
  user/andre/tcp_workqueue/sys/arm/mv/mvreg.h
  user/andre/tcp_workqueue/sys/arm/mv/mvvar.h
  user/andre/tcp_workqueue/sys/arm/mv/mvwin.h
  user/andre/tcp_workqueue/sys/arm/mv/timer.c
  user/andre/tcp_workqueue/sys/arm/s3c2xx0/s3c24x0_machdep.c
  user/andre/tcp_workqueue/sys/arm/sa11x0/assabet_machdep.c
  user/andre/tcp_workqueue/sys/arm/tegra/common.c
  user/andre/tcp_workqueue/sys/arm/tegra/std.tegra2
  user/andre/tcp_workqueue/sys/arm/tegra/tegra2_machdep.c
  user/andre/tcp_workqueue/sys/arm/ti/cpsw/if_cpsw.c
  user/andre/tcp_workqueue/sys/arm/ti/ti_machdep.c
  user/andre/tcp_workqueue/sys/arm/ti/ti_scm.c
  user/andre/tcp_workqueue/sys/arm/ti/usb/omap_ehci.c
  user/andre/tcp_workqueue/sys/arm/xscale/i80321/ep80219_machdep.c
  user/andre/tcp_workqueue/sys/arm/xscale/i80321/iq31244_machdep.c
  user/andre/tcp_workqueue/sys/arm/xscale/i8134x/crb_machdep.c
  user/andre/tcp_workqueue/sys/arm/xscale/ixp425/avila_machdep.c
  user/andre/tcp_workqueue/sys/arm/xscale/pxa/pxa_machdep.c
  user/andre/tcp_workqueue/sys/boot/arm/uboot/Makefile
  user/andre/tcp_workqueue/sys/boot/common/bootstrap.h
  user/andre/tcp_workqueue/sys/boot/common/console.c
  user/andre/tcp_workqueue/sys/boot/common/disk.c
  user/andre/tcp_workqueue/sys/boot/common/disk.h
  user/andre/tcp_workqueue/sys/boot/common/load_elf.c
  user/andre/tcp_workqueue/sys/boot/common/module.c
  user/andre/tcp_workqueue/sys/boot/common/part.c
  user/andre/tcp_workqueue/sys/boot/common/reloc_elf.c
  user/andre/tcp_workqueue/sys/boot/forth/beastie.4th
  user/andre/tcp_workqueue/sys/boot/forth/color.4th.8
  user/andre/tcp_workqueue/sys/boot/forth/loader.4th
  user/andre/tcp_workqueue/sys/boot/forth/loader.conf
  user/andre/tcp_workqueue/sys/boot/forth/menu-commands.4th
  user/andre/tcp_workqueue/sys/boot/forth/menu.4th
  user/andre/tcp_workqueue/sys/boot/forth/menu.rc
  user/andre/tcp_workqueue/sys/boot/i386/boot2/boot2.c
  user/andre/tcp_workqueue/sys/boot/i386/boot2/lib.h
  user/andre/tcp_workqueue/sys/boot/i386/boot2/sio.S
  user/andre/tcp_workqueue/sys/boot/i386/btx/btx/btx.S
  user/andre/tcp_workqueue/sys/boot/i386/gptboot/gptboot.c
  user/andre/tcp_workqueue/sys/boot/i386/libi386/biosdisk.c
  user/andre/tcp_workqueue/sys/boot/i386/libi386/comconsole.c
  user/andre/tcp_workqueue/sys/boot/i386/libi386/pxe.c
  user/andre/tcp_workqueue/sys/boot/i386/libi386/pxe.h
  user/andre/tcp_workqueue/sys/boot/i386/loader/Makefile
  user/andre/tcp_workqueue/sys/boot/i386/loader/conf.c
  user/andre/tcp_workqueue/sys/boot/i386/loader/main.c
  user/andre/tcp_workqueue/sys/boot/i386/zfsboot/zfsboot.c
  user/andre/tcp_workqueue/sys/boot/ofw/libofw/devicename.c
  user/andre/tcp_workqueue/sys/boot/pc98/loader/main.c
  user/andre/tcp_workqueue/sys/boot/powerpc/uboot/Makefile
  user/andre/tcp_workqueue/sys/boot/sparc64/loader/main.c
  user/andre/tcp_workqueue/sys/boot/uboot/common/main.c
  user/andre/tcp_workqueue/sys/boot/uboot/lib/Makefile
  user/andre/tcp_workqueue/sys/boot/uboot/lib/devicename.c
  user/andre/tcp_workqueue/sys/boot/uboot/lib/disk.c
  user/andre/tcp_workqueue/sys/boot/uboot/lib/libuboot.h
  user/andre/tcp_workqueue/sys/boot/userboot/test/test.c
  user/andre/tcp_workqueue/sys/boot/userboot/userboot.h
  user/andre/tcp_workqueue/sys/boot/userboot/userboot/libuserboot.h
  user/andre/tcp_workqueue/sys/boot/userboot/userboot/main.c
  user/andre/tcp_workqueue/sys/boot/userboot/userboot/userboot_disk.c
  user/andre/tcp_workqueue/sys/boot/zfs/libzfs.h
  user/andre/tcp_workqueue/sys/boot/zfs/zfs.c
  user/andre/tcp_workqueue/sys/boot/zfs/zfsimpl.c
  user/andre/tcp_workqueue/sys/cam/ata/ata_da.c
  user/andre/tcp_workqueue/sys/cam/ata/ata_pmp.c
  user/andre/tcp_workqueue/sys/cam/ata/ata_xpt.c
  user/andre/tcp_workqueue/sys/cam/cam_periph.c
  user/andre/tcp_workqueue/sys/cam/cam_queue.c
  user/andre/tcp_workqueue/sys/cam/cam_xpt.c
  user/andre/tcp_workqueue/sys/cam/ctl/ctl.c
  user/andre/tcp_workqueue/sys/cam/ctl/ctl_backend_block.c
  user/andre/tcp_workqueue/sys/cam/ctl/ctl_backend_ramdisk.c
  user/andre/tcp_workqueue/sys/cam/ctl/ctl_frontend_cam_sim.c
  user/andre/tcp_workqueue/sys/cam/ctl/scsi_ctl.c
  user/andre/tcp_workqueue/sys/cam/scsi/scsi_cd.c
  user/andre/tcp_workqueue/sys/cam/scsi/scsi_ch.c
  user/andre/tcp_workqueue/sys/cam/scsi/scsi_da.c
  user/andre/tcp_workqueue/sys/cam/scsi/scsi_enc.c
  user/andre/tcp_workqueue/sys/cam/scsi/scsi_enc_ses.c
  user/andre/tcp_workqueue/sys/cam/scsi/scsi_low.c
  user/andre/tcp_workqueue/sys/cam/scsi/scsi_low.h
  user/andre/tcp_workqueue/sys/cam/scsi/scsi_pass.c
  user/andre/tcp_workqueue/sys/cam/scsi/scsi_sa.c
  user/andre/tcp_workqueue/sys/cam/scsi/scsi_sg.c
  user/andre/tcp_workqueue/sys/cam/scsi/scsi_xpt.c
  user/andre/tcp_workqueue/sys/cddl/boot/zfs/zfsimpl.h
  user/andre/tcp_workqueue/sys/cddl/compat/opensolaris/kern/opensolaris_cmn_err.c
  user/andre/tcp_workqueue/sys/cddl/compat/opensolaris/sys/debug.h
  user/andre/tcp_workqueue/sys/cddl/compat/opensolaris/sys/dkio.h
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/common/nvpair/fnvpair.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/bpobj.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/bptree.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_traverse.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_tx.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode_sync.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dir.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_pool.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_scan.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_synctask.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/metaslab.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sa.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/space_map.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/sa_impl.h
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa.h
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa_impl.h
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/vdev.h
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/vdev_impl.h
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_debug.h
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio_impl.h
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_label.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_mirror.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_raidz.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zap.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zap_micro.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_debug.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_rlock.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zil.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/uts/common/sys/debug.h
  user/andre/tcp_workqueue/sys/compat/linux/linux_file.c
  user/andre/tcp_workqueue/sys/compat/linux/linux_misc.c
  user/andre/tcp_workqueue/sys/conf/Makefile.amd64
  user/andre/tcp_workqueue/sys/conf/Makefile.arm
  user/andre/tcp_workqueue/sys/conf/Makefile.powerpc
  user/andre/tcp_workqueue/sys/conf/NOTES
  user/andre/tcp_workqueue/sys/conf/files
  user/andre/tcp_workqueue/sys/conf/files.amd64
  user/andre/tcp_workqueue/sys/conf/files.arm
  user/andre/tcp_workqueue/sys/conf/files.i386
  user/andre/tcp_workqueue/sys/conf/files.ia64
  user/andre/tcp_workqueue/sys/conf/files.mips
  user/andre/tcp_workqueue/sys/conf/files.pc98
  user/andre/tcp_workqueue/sys/conf/files.powerpc
  user/andre/tcp_workqueue/sys/conf/files.sparc64
  user/andre/tcp_workqueue/sys/conf/kern.mk
  user/andre/tcp_workqueue/sys/conf/kern.pre.mk
  user/andre/tcp_workqueue/sys/conf/kmod.mk
  user/andre/tcp_workqueue/sys/conf/newvers.sh
  user/andre/tcp_workqueue/sys/conf/options
  user/andre/tcp_workqueue/sys/conf/options.amd64
  user/andre/tcp_workqueue/sys/conf/options.i386
  user/andre/tcp_workqueue/sys/contrib/altq/altq/altq_cbq.c
  user/andre/tcp_workqueue/sys/contrib/altq/altq/altq_hfsc.c
  user/andre/tcp_workqueue/sys/contrib/altq/altq/altq_priq.c
  user/andre/tcp_workqueue/sys/contrib/altq/altq/altq_red.c
  user/andre/tcp_workqueue/sys/contrib/altq/altq/altq_rio.c
  user/andre/tcp_workqueue/sys/contrib/altq/altq/altq_rmclass.c
  user/andre/tcp_workqueue/sys/contrib/altq/altq/altq_subr.c
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/changes.txt   (contents, props changed)
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/common/dmrestag.c
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/compiler/aslcompile.c
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/compiler/aslcompiler.h
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/compiler/aslerror.c
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/compiler/aslfiles.c
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/compiler/aslfold.c
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/compiler/aslglobal.h
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/compiler/aslmain.c
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/compiler/aslmessages.h
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/compiler/asloperands.c
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/compiler/aslopt.c
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/compiler/aslstartup.c
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/compiler/aslsupport.l
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/compiler/asltypes.h
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/compiler/aslutils.c
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/compiler/dtio.c
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/compiler/preprocess.h
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/components/debugger/dbexec.c
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/components/debugger/dbinput.c
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/components/debugger/dbmethod.c
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/components/debugger/dbnames.c
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/components/debugger/dbstats.c
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/components/debugger/dbutils.c
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/components/disassembler/dmopcode.c
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/components/tables/tbinstal.c
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/components/tables/tbxface.c
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/include/acdebug.h
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/include/acpixf.h
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/include/actbl1.h
  user/andre/tcp_workqueue/sys/contrib/ipfilter/netinet/fil.c
  user/andre/tcp_workqueue/sys/contrib/ipfilter/netinet/ip_auth.c
  user/andre/tcp_workqueue/sys/contrib/ipfilter/netinet/ip_fil_freebsd.c
  user/andre/tcp_workqueue/sys/contrib/rdma/rdma_addr.c
  user/andre/tcp_workqueue/sys/dev/aac/aac_cam.c
  user/andre/tcp_workqueue/sys/dev/acpi_support/acpi_wmi.c
  user/andre/tcp_workqueue/sys/dev/acpica/acpi_cpu.c
  user/andre/tcp_workqueue/sys/dev/acpica/acpi_hpet.c
  user/andre/tcp_workqueue/sys/dev/acpica/acpi_pcib_acpi.c
  user/andre/tcp_workqueue/sys/dev/acpica/acpi_thermal.c
  user/andre/tcp_workqueue/sys/dev/advansys/adv_eisa.c
  user/andre/tcp_workqueue/sys/dev/advansys/adv_isa.c
  user/andre/tcp_workqueue/sys/dev/advansys/adv_pci.c
  user/andre/tcp_workqueue/sys/dev/advansys/advansys.c
  user/andre/tcp_workqueue/sys/dev/advansys/advansys.h
  user/andre/tcp_workqueue/sys/dev/advansys/advlib.c
  user/andre/tcp_workqueue/sys/dev/advansys/advlib.h
  user/andre/tcp_workqueue/sys/dev/advansys/adw_pci.c
  user/andre/tcp_workqueue/sys/dev/advansys/adwcam.c
  user/andre/tcp_workqueue/sys/dev/advansys/adwlib.c
  user/andre/tcp_workqueue/sys/dev/advansys/adwlib.h
  user/andre/tcp_workqueue/sys/dev/advansys/adwvar.h
  user/andre/tcp_workqueue/sys/dev/aha/aha.c
  user/andre/tcp_workqueue/sys/dev/aha/aha_isa.c
  user/andre/tcp_workqueue/sys/dev/aha/aha_mca.c
  user/andre/tcp_workqueue/sys/dev/aha/ahareg.h
  user/andre/tcp_workqueue/sys/dev/ahb/ahb.c
  user/andre/tcp_workqueue/sys/dev/ahb/ahbreg.h
  user/andre/tcp_workqueue/sys/dev/ahci/ahci.c
  user/andre/tcp_workqueue/sys/dev/aic/aic.c
  user/andre/tcp_workqueue/sys/dev/aic/aic_cbus.c
  user/andre/tcp_workqueue/sys/dev/aic/aic_isa.c
  user/andre/tcp_workqueue/sys/dev/aic/aic_pccard.c
  user/andre/tcp_workqueue/sys/dev/aic/aicvar.h
  user/andre/tcp_workqueue/sys/dev/alc/if_alc.c
  user/andre/tcp_workqueue/sys/dev/ale/if_ale.c
  user/andre/tcp_workqueue/sys/dev/altera/jtag_uart/altera_jtag_uart_cons.c
  user/andre/tcp_workqueue/sys/dev/amr/amr.c
  user/andre/tcp_workqueue/sys/dev/arcmsr/arcmsr.c
  user/andre/tcp_workqueue/sys/dev/ata/ata-all.c
  user/andre/tcp_workqueue/sys/dev/ata/ata-all.h
  user/andre/tcp_workqueue/sys/dev/ata/ata-lowlevel.c
  user/andre/tcp_workqueue/sys/dev/ata/ata-sata.c
  user/andre/tcp_workqueue/sys/dev/ath/ath_hal/ah.c
  user/andre/tcp_workqueue/sys/dev/ath/ath_hal/ah.h
  user/andre/tcp_workqueue/sys/dev/ath/ath_hal/ah_internal.h
  user/andre/tcp_workqueue/sys/dev/ath/ath_hal/ar5416/ar2133.c
  user/andre/tcp_workqueue/sys/dev/ath/ath_hal/ar5416/ar5416_ani.c
  user/andre/tcp_workqueue/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c
  user/andre/tcp_workqueue/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c
  user/andre/tcp_workqueue/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c
  user/andre/tcp_workqueue/sys/dev/ath/ath_hal/ar5416/ar5416reg.h
  user/andre/tcp_workqueue/sys/dev/ath/ath_hal/ar9002/ar9280.c
  user/andre/tcp_workqueue/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c
  user/andre/tcp_workqueue/sys/dev/ath/ath_rate/sample/sample.c
  user/andre/tcp_workqueue/sys/dev/ath/if_ath.c
  user/andre/tcp_workqueue/sys/dev/ath/if_ath_debug.c
  user/andre/tcp_workqueue/sys/dev/ath/if_ath_debug.h
  user/andre/tcp_workqueue/sys/dev/ath/if_ath_misc.h
  user/andre/tcp_workqueue/sys/dev/ath/if_ath_rx.c
  user/andre/tcp_workqueue/sys/dev/ath/if_ath_rx_edma.c
  user/andre/tcp_workqueue/sys/dev/ath/if_ath_sysctl.c
  user/andre/tcp_workqueue/sys/dev/ath/if_ath_tx.c
  user/andre/tcp_workqueue/sys/dev/ath/if_ath_tx.h
  user/andre/tcp_workqueue/sys/dev/ath/if_ath_tx_ht.c
  user/andre/tcp_workqueue/sys/dev/ath/if_athioctl.h
  user/andre/tcp_workqueue/sys/dev/ath/if_athvar.h
  user/andre/tcp_workqueue/sys/dev/atkbdc/psm.c
  user/andre/tcp_workqueue/sys/dev/bge/if_bge.c
  user/andre/tcp_workqueue/sys/dev/bge/if_bgereg.h
  user/andre/tcp_workqueue/sys/dev/buslogic/bt.c
  user/andre/tcp_workqueue/sys/dev/buslogic/bt_eisa.c
  user/andre/tcp_workqueue/sys/dev/buslogic/bt_isa.c
  user/andre/tcp_workqueue/sys/dev/buslogic/bt_mca.c
  user/andre/tcp_workqueue/sys/dev/buslogic/bt_pci.c
  user/andre/tcp_workqueue/sys/dev/buslogic/btreg.h
  user/andre/tcp_workqueue/sys/dev/bxe/if_bxe.c
  user/andre/tcp_workqueue/sys/dev/ct/bshw_machdep.c
  user/andre/tcp_workqueue/sys/dev/ct/ct.c
  user/andre/tcp_workqueue/sys/dev/ct/ct_isa.c
  user/andre/tcp_workqueue/sys/dev/ct/ct_machdep.h
  user/andre/tcp_workqueue/sys/dev/ct/ctvar.h
  user/andre/tcp_workqueue/sys/dev/cxgb/cxgb_main.c
  user/andre/tcp_workqueue/sys/dev/cxgb/cxgb_osdep.h
  user/andre/tcp_workqueue/sys/dev/cxgbe/adapter.h
  user/andre/tcp_workqueue/sys/dev/cxgbe/common/common.h
  user/andre/tcp_workqueue/sys/dev/cxgbe/common/t4_hw.c
  user/andre/tcp_workqueue/sys/dev/cxgbe/firmware/t4fw_interface.h
  user/andre/tcp_workqueue/sys/dev/cxgbe/osdep.h
  user/andre/tcp_workqueue/sys/dev/cxgbe/t4_ioctl.h
  user/andre/tcp_workqueue/sys/dev/cxgbe/t4_l2t.h
  user/andre/tcp_workqueue/sys/dev/cxgbe/t4_main.c
  user/andre/tcp_workqueue/sys/dev/cxgbe/t4_sge.c
  user/andre/tcp_workqueue/sys/dev/cxgbe/tom/t4_cpl_io.c
  user/andre/tcp_workqueue/sys/dev/cxgbe/tom/t4_ddp.c
  user/andre/tcp_workqueue/sys/dev/cxgbe/tom/t4_listen.c
  user/andre/tcp_workqueue/sys/dev/dpt/dpt.h
  user/andre/tcp_workqueue/sys/dev/dpt/dpt_eisa.c
  user/andre/tcp_workqueue/sys/dev/dpt/dpt_isa.c
  user/andre/tcp_workqueue/sys/dev/dpt/dpt_pci.c
  user/andre/tcp_workqueue/sys/dev/dpt/dpt_scsi.c
  user/andre/tcp_workqueue/sys/dev/drm2/drm_gem.c
  user/andre/tcp_workqueue/sys/dev/drm2/i915/i915_drv.c
  user/andre/tcp_workqueue/sys/dev/drm2/i915/i915_drv.h
  user/andre/tcp_workqueue/sys/dev/e1000/e1000_82575.c
  user/andre/tcp_workqueue/sys/dev/e1000/e1000_ich8lan.c
  user/andre/tcp_workqueue/sys/dev/e1000/if_em.c
  user/andre/tcp_workqueue/sys/dev/e1000/if_igb.c
  user/andre/tcp_workqueue/sys/dev/e1000/if_igb.h
  user/andre/tcp_workqueue/sys/dev/e1000/if_lem.c
  user/andre/tcp_workqueue/sys/dev/et/if_et.c
  user/andre/tcp_workqueue/sys/dev/etherswitch/arswitch/arswitch.c
  user/andre/tcp_workqueue/sys/dev/etherswitch/arswitch/arswitch_phy.c
  user/andre/tcp_workqueue/sys/dev/etherswitch/arswitch/arswitch_reg.c
  user/andre/tcp_workqueue/sys/dev/etherswitch/arswitch/arswitchvar.h
  user/andre/tcp_workqueue/sys/dev/etherswitch/etherswitch.c
  user/andre/tcp_workqueue/sys/dev/etherswitch/etherswitch_if.m
  user/andre/tcp_workqueue/sys/dev/fdt/fdt_common.c
  user/andre/tcp_workqueue/sys/dev/fdt/fdt_common.h
  user/andre/tcp_workqueue/sys/dev/fdt/fdt_pci.c
  user/andre/tcp_workqueue/sys/dev/flash/mx25l.c
  user/andre/tcp_workqueue/sys/dev/hptmv/entry.c
  user/andre/tcp_workqueue/sys/dev/hwpmc/hwpmc_amd.c
  user/andre/tcp_workqueue/sys/dev/hwpmc/hwpmc_arm.c
  user/andre/tcp_workqueue/sys/dev/hwpmc/hwpmc_core.c
  user/andre/tcp_workqueue/sys/dev/hwpmc/hwpmc_x86.c
  user/andre/tcp_workqueue/sys/dev/ie/if_ie_isa.c
  user/andre/tcp_workqueue/sys/dev/iicbus/pcf8563.c
  user/andre/tcp_workqueue/sys/dev/iicbus/s35390a.c
  user/andre/tcp_workqueue/sys/dev/ipmi/ipmi_smbios.c
  user/andre/tcp_workqueue/sys/dev/isci/isci.c
  user/andre/tcp_workqueue/sys/dev/isci/isci.h
  user/andre/tcp_workqueue/sys/dev/isci/isci_controller.c
  user/andre/tcp_workqueue/sys/dev/isci/scil/sati.c
  user/andre/tcp_workqueue/sys/dev/isci/scil/sati_callbacks.h
  user/andre/tcp_workqueue/sys/dev/isci/scil/sati_util.c
  user/andre/tcp_workqueue/sys/dev/isci/scil/sati_write_buffer.c
  user/andre/tcp_workqueue/sys/dev/isci/scil/sci_base_controller.h
  user/andre/tcp_workqueue/sys/dev/isci/scil/sci_base_domain.h
  user/andre/tcp_workqueue/sys/dev/isci/scil/sci_base_phy.h
  user/andre/tcp_workqueue/sys/dev/isci/scil/sci_base_remote_device.h
  user/andre/tcp_workqueue/sys/dev/isci/scil/scic_io_request.h
  user/andre/tcp_workqueue/sys/dev/isci/scil/scic_sds_phy.c
  user/andre/tcp_workqueue/sys/dev/isci/scil/scic_sds_port.h
  user/andre/tcp_workqueue/sys/dev/isci/scil/scic_sds_remote_device.h
  user/andre/tcp_workqueue/sys/dev/isci/scil/scic_sds_remote_node_context.h
  user/andre/tcp_workqueue/sys/dev/isci/scil/scic_sds_request.c
  user/andre/tcp_workqueue/sys/dev/isci/scil/scu_bios_definitions.h
  user/andre/tcp_workqueue/sys/dev/isp/isp_freebsd.c
  user/andre/tcp_workqueue/sys/dev/isp/isp_pci.c
  user/andre/tcp_workqueue/sys/dev/ixgbe/ixgbe.c
  user/andre/tcp_workqueue/sys/dev/ixgbe/ixgbe.h
  user/andre/tcp_workqueue/sys/dev/ixgbe/ixgbe_osdep.h
  user/andre/tcp_workqueue/sys/dev/ixgbe/ixv.c
  user/andre/tcp_workqueue/sys/dev/jme/if_jme.c
  user/andre/tcp_workqueue/sys/dev/mfi/mfi.c
  user/andre/tcp_workqueue/sys/dev/mii/brgphy.c
  user/andre/tcp_workqueue/sys/dev/mii/smscphy.c
  user/andre/tcp_workqueue/sys/dev/mlx/mlx.c
  user/andre/tcp_workqueue/sys/dev/mlx/mlx_disk.c
  user/andre/tcp_workqueue/sys/dev/mlx/mlx_pci.c
  user/andre/tcp_workqueue/sys/dev/mlx/mlxreg.h
  user/andre/tcp_workqueue/sys/dev/mlx/mlxvar.h
  user/andre/tcp_workqueue/sys/dev/mly/mly.c
  user/andre/tcp_workqueue/sys/dev/mmc/mmc.c
  user/andre/tcp_workqueue/sys/dev/mps/mps_sas.c
  user/andre/tcp_workqueue/sys/dev/mxge/if_mxge.c
  user/andre/tcp_workqueue/sys/dev/ncv/ncr53c500.c
  user/andre/tcp_workqueue/sys/dev/ncv/ncr53c500_pccard.c
  user/andre/tcp_workqueue/sys/dev/ncv/ncr53c500hw.h
  user/andre/tcp_workqueue/sys/dev/ncv/ncr53c500var.h
  user/andre/tcp_workqueue/sys/dev/netmap/netmap.c
  user/andre/tcp_workqueue/sys/dev/netmap/netmap_kern.h
  user/andre/tcp_workqueue/sys/dev/netmap/netmap_mem2.c
  user/andre/tcp_workqueue/sys/dev/nsp/nsp.c
  user/andre/tcp_workqueue/sys/dev/nsp/nsp_pccard.c
  user/andre/tcp_workqueue/sys/dev/nsp/nspvar.h
  user/andre/tcp_workqueue/sys/dev/nve/if_nvereg.h
  user/andre/tcp_workqueue/sys/dev/oce/oce_if.c
  user/andre/tcp_workqueue/sys/dev/pci/pci.c
  user/andre/tcp_workqueue/sys/dev/pci/pci_user.c
  user/andre/tcp_workqueue/sys/dev/pci/pcireg.h
  user/andre/tcp_workqueue/sys/dev/random/ivy.c
  user/andre/tcp_workqueue/sys/dev/random/probe.c
  user/andre/tcp_workqueue/sys/dev/re/if_re.c
  user/andre/tcp_workqueue/sys/dev/sdhci/sdhci.c
  user/andre/tcp_workqueue/sys/dev/sdhci/sdhci.h
  user/andre/tcp_workqueue/sys/dev/sound/pci/hda/hdaa.c
  user/andre/tcp_workqueue/sys/dev/sound/pci/hda/hdaa_patches.c
  user/andre/tcp_workqueue/sys/dev/sound/pci/hdspe-pcm.c
  user/andre/tcp_workqueue/sys/dev/sound/pci/hdspe.c
  user/andre/tcp_workqueue/sys/dev/sound/usb/uaudio.c
  user/andre/tcp_workqueue/sys/dev/sound/usb/uaudioreg.h
  user/andre/tcp_workqueue/sys/dev/stg/tmc18c30.c
  user/andre/tcp_workqueue/sys/dev/stg/tmc18c30_isa.c
  user/andre/tcp_workqueue/sys/dev/stg/tmc18c30_pccard.c
  user/andre/tcp_workqueue/sys/dev/stg/tmc18c30_pci.c
  user/andre/tcp_workqueue/sys/dev/stg/tmc18c30_subr.c
  user/andre/tcp_workqueue/sys/dev/stg/tmc18c30var.h
  user/andre/tcp_workqueue/sys/dev/twe/twe.c
  user/andre/tcp_workqueue/sys/dev/twe/twe_compat.h
  user/andre/tcp_workqueue/sys/dev/twe/twe_freebsd.c
  user/andre/tcp_workqueue/sys/dev/twe/twevar.h
  user/andre/tcp_workqueue/sys/dev/tws/tws.c
  user/andre/tcp_workqueue/sys/dev/tws/tws_cam.c
  user/andre/tcp_workqueue/sys/dev/usb/controller/at91dci.c
  user/andre/tcp_workqueue/sys/dev/usb/controller/at91dci_atmelarm.c
  user/andre/tcp_workqueue/sys/dev/usb/controller/atmegadci.c
  user/andre/tcp_workqueue/sys/dev/usb/controller/avr32dci.c
  user/andre/tcp_workqueue/sys/dev/usb/controller/dwc_otg.c
  user/andre/tcp_workqueue/sys/dev/usb/controller/dwc_otg.h
  user/andre/tcp_workqueue/sys/dev/usb/controller/dwc_otgreg.h
  user/andre/tcp_workqueue/sys/dev/usb/controller/ehci.c
  user/andre/tcp_workqueue/sys/dev/usb/controller/musb_otg.c
  user/andre/tcp_workqueue/sys/dev/usb/controller/ohci.c
  user/andre/tcp_workqueue/sys/dev/usb/controller/uhci.c
  user/andre/tcp_workqueue/sys/dev/usb/controller/usb_controller.c
  user/andre/tcp_workqueue/sys/dev/usb/controller/uss820dci.c
  user/andre/tcp_workqueue/sys/dev/usb/controller/xhci.c
  user/andre/tcp_workqueue/sys/dev/usb/input/ums.c
  user/andre/tcp_workqueue/sys/dev/usb/net/if_smsc.c
  user/andre/tcp_workqueue/sys/dev/usb/net/uhso.c
  user/andre/tcp_workqueue/sys/dev/usb/quirk/usb_quirk.c
  user/andre/tcp_workqueue/sys/dev/usb/quirk/usb_quirk.h
  user/andre/tcp_workqueue/sys/dev/usb/serial/u3g.c
  user/andre/tcp_workqueue/sys/dev/usb/serial/uchcom.c
  user/andre/tcp_workqueue/sys/dev/usb/serial/ufoma.c
  user/andre/tcp_workqueue/sys/dev/usb/serial/uftdi_reg.h
  user/andre/tcp_workqueue/sys/dev/usb/storage/umass.c
  user/andre/tcp_workqueue/sys/dev/usb/usb_hub.c
  user/andre/tcp_workqueue/sys/dev/usb/usb_pf.c
  user/andre/tcp_workqueue/sys/dev/usb/usb_request.c
  user/andre/tcp_workqueue/sys/dev/usb/usbdevs
  user/andre/tcp_workqueue/sys/dev/virtio/virtio.c
  user/andre/tcp_workqueue/sys/dev/virtio/virtio.h
  user/andre/tcp_workqueue/sys/dev/virtio/virtqueue.c
  user/andre/tcp_workqueue/sys/dev/vxge/include/vxgehal-ll.h
  user/andre/tcp_workqueue/sys/dev/vxge/vxge.c
  user/andre/tcp_workqueue/sys/dev/xen/netback/netback_unit_tests.c
  user/andre/tcp_workqueue/sys/fs/coda/coda_subr.c
  user/andre/tcp_workqueue/sys/fs/deadfs/dead_vnops.c
  user/andre/tcp_workqueue/sys/fs/devfs/devfs_int.h
  user/andre/tcp_workqueue/sys/fs/ext2fs/ext2_alloc.c
  user/andre/tcp_workqueue/sys/fs/ext2fs/ext2_inode.c
  user/andre/tcp_workqueue/sys/fs/ext2fs/ext2_inode_cnv.c
  user/andre/tcp_workqueue/sys/fs/hpfs/hpfs_vfsops.c
  user/andre/tcp_workqueue/sys/fs/nandfs/bmap.c
  user/andre/tcp_workqueue/sys/fs/nfs/nfs.h
  user/andre/tcp_workqueue/sys/fs/nfs/nfs_commonacl.c
  user/andre/tcp_workqueue/sys/fs/nfs/nfs_commonport.c
  user/andre/tcp_workqueue/sys/fs/nfs/nfs_commonsubs.c
  user/andre/tcp_workqueue/sys/fs/nfs/nfs_var.h
  user/andre/tcp_workqueue/sys/fs/nfs/nfscl.h
  user/andre/tcp_workqueue/sys/fs/nfsclient/nfs_clcomsubs.c
  user/andre/tcp_workqueue/sys/fs/nfsclient/nfs_clrpcops.c
  user/andre/tcp_workqueue/sys/fs/nfsserver/nfs_nfsdkrpc.c
  user/andre/tcp_workqueue/sys/fs/nfsserver/nfs_nfsdport.c
  user/andre/tcp_workqueue/sys/fs/ntfs/ntfs_subr.c
  user/andre/tcp_workqueue/sys/fs/ntfs/ntfs_vfsops.c
  user/andre/tcp_workqueue/sys/fs/ntfs/ntfs_vnops.c
  user/andre/tcp_workqueue/sys/fs/nullfs/null.h
  user/andre/tcp_workqueue/sys/fs/nullfs/null_subr.c
  user/andre/tcp_workqueue/sys/fs/nullfs/null_vfsops.c
  user/andre/tcp_workqueue/sys/fs/nullfs/null_vnops.c
  user/andre/tcp_workqueue/sys/fs/tmpfs/tmpfs_vfsops.c
  user/andre/tcp_workqueue/sys/geom/geom_disk.c
  user/andre/tcp_workqueue/sys/geom/mirror/g_mirror.c
  user/andre/tcp_workqueue/sys/geom/part/g_part.c
  user/andre/tcp_workqueue/sys/geom/raid/g_raid.c
  user/andre/tcp_workqueue/sys/geom/raid/g_raid.h
  user/andre/tcp_workqueue/sys/geom/raid/g_raid_ctl.c
  user/andre/tcp_workqueue/sys/geom/raid/md_ddf.c
  user/andre/tcp_workqueue/sys/geom/raid/md_intel.c
  user/andre/tcp_workqueue/sys/geom/raid/md_jmicron.c
  user/andre/tcp_workqueue/sys/geom/raid/md_nvidia.c
  user/andre/tcp_workqueue/sys/geom/raid/md_promise.c
  user/andre/tcp_workqueue/sys/geom/raid/md_sii.c
  user/andre/tcp_workqueue/sys/geom/raid/tr_concat.c
  user/andre/tcp_workqueue/sys/geom/raid/tr_raid0.c
  user/andre/tcp_workqueue/sys/geom/raid/tr_raid1.c
  user/andre/tcp_workqueue/sys/geom/raid/tr_raid1e.c
  user/andre/tcp_workqueue/sys/geom/raid/tr_raid5.c
  user/andre/tcp_workqueue/sys/geom/raid3/g_raid3.c
  user/andre/tcp_workqueue/sys/gnu/fs/xfs/FreeBSD/xfs_compat.h
  user/andre/tcp_workqueue/sys/gnu/fs/xfs/FreeBSD/xfs_freebsd.h
  user/andre/tcp_workqueue/sys/gnu/fs/xfs/FreeBSD/xfs_mountops.c
  user/andre/tcp_workqueue/sys/i386/bios/smapi.c
  user/andre/tcp_workqueue/sys/i386/conf/GENERIC
  user/andre/tcp_workqueue/sys/i386/conf/NOTES
  user/andre/tcp_workqueue/sys/i386/i386/identcpu.c
  user/andre/tcp_workqueue/sys/i386/i386/machdep.c
  user/andre/tcp_workqueue/sys/i386/i386/mp_machdep.c
  user/andre/tcp_workqueue/sys/i386/i386/pmap.c
  user/andre/tcp_workqueue/sys/i386/i386/trap.c
  user/andre/tcp_workqueue/sys/i386/include/atomic.h
  user/andre/tcp_workqueue/sys/i386/include/intr_machdep.h
  user/andre/tcp_workqueue/sys/i386/include/pc/bios.h
  user/andre/tcp_workqueue/sys/i386/include/xen/xen-os.h
  user/andre/tcp_workqueue/sys/i386/pci/pci_cfgreg.c
  user/andre/tcp_workqueue/sys/i386/xen/mp_machdep.c
  user/andre/tcp_workqueue/sys/i386/xen/pmap.c
  user/andre/tcp_workqueue/sys/i386/xen/xen_machdep.c
  user/andre/tcp_workqueue/sys/ia64/ia32/ia32_trap.c
  user/andre/tcp_workqueue/sys/ia64/ia64/pmap.c
  user/andre/tcp_workqueue/sys/ia64/ia64/trap.c
  user/andre/tcp_workqueue/sys/kern/Make.tags.inc
  user/andre/tcp_workqueue/sys/kern/dtio_kdtrace.c
  user/andre/tcp_workqueue/sys/kern/imgact_elf.c
  user/andre/tcp_workqueue/sys/kern/kern_clocksource.c
  user/andre/tcp_workqueue/sys/kern/kern_condvar.c
  user/andre/tcp_workqueue/sys/kern/kern_cons.c
  user/andre/tcp_workqueue/sys/kern/kern_exec.c
  user/andre/tcp_workqueue/sys/kern/kern_exit.c
  user/andre/tcp_workqueue/sys/kern/kern_fork.c
  user/andre/tcp_workqueue/sys/kern/kern_intr.c
  user/andre/tcp_workqueue/sys/kern/kern_lock.c
  user/andre/tcp_workqueue/sys/kern/kern_mutex.c
  user/andre/tcp_workqueue/sys/kern/kern_rmlock.c
  user/andre/tcp_workqueue/sys/kern/kern_rwlock.c
  user/andre/tcp_workqueue/sys/kern/kern_sig.c
  user/andre/tcp_workqueue/sys/kern/kern_sx.c
  user/andre/tcp_workqueue/sys/kern/kern_thread.c
  user/andre/tcp_workqueue/sys/kern/link_elf.c
  user/andre/tcp_workqueue/sys/kern/sched_ule.c
  user/andre/tcp_workqueue/sys/kern/subr_bus.c
  user/andre/tcp_workqueue/sys/kern/subr_sleepqueue.c
  user/andre/tcp_workqueue/sys/kern/subr_syscall.c
  user/andre/tcp_workqueue/sys/kern/subr_trap.c
  user/andre/tcp_workqueue/sys/kern/subr_turnstile.c
  user/andre/tcp_workqueue/sys/kern/subr_unit.c
  user/andre/tcp_workqueue/sys/kern/sys_generic.c
  user/andre/tcp_workqueue/sys/kern/tty_ttydisc.c
  user/andre/tcp_workqueue/sys/kern/uipc_domain.c
  user/andre/tcp_workqueue/sys/kern/uipc_mqueue.c
  user/andre/tcp_workqueue/sys/kern/uipc_socket.c
  user/andre/tcp_workqueue/sys/kern/uipc_usrreq.c
  user/andre/tcp_workqueue/sys/kern/vfs_default.c
  user/andre/tcp_workqueue/sys/kern/vfs_lookup.c
  user/andre/tcp_workqueue/sys/kern/vfs_mount.c
  user/andre/tcp_workqueue/sys/kern/vfs_subr.c
  user/andre/tcp_workqueue/sys/kern/vfs_syscalls.c
  user/andre/tcp_workqueue/sys/kern/vfs_vnops.c
  user/andre/tcp_workqueue/sys/kern/vnode_if.src
  user/andre/tcp_workqueue/sys/libkern/jenkins_hash.c
  user/andre/tcp_workqueue/sys/mips/cavium/usb/octusb.c
  user/andre/tcp_workqueue/sys/mips/include/cpufunc.h
  user/andre/tcp_workqueue/sys/mips/include/tlb.h
  user/andre/tcp_workqueue/sys/mips/mips/pmap.c
  user/andre/tcp_workqueue/sys/mips/mips/tlb.c
  user/andre/tcp_workqueue/sys/mips/mips/trap.c
  user/andre/tcp_workqueue/sys/mips/rmi/rootfs_list.txt
  user/andre/tcp_workqueue/sys/modules/Makefile
  user/andre/tcp_workqueue/sys/modules/cxgbe/firmware/Makefile
  user/andre/tcp_workqueue/sys/modules/dummynet/Makefile
  user/andre/tcp_workqueue/sys/modules/ipfw/Makefile
  user/andre/tcp_workqueue/sys/modules/ipfw_nat/Makefile
  user/andre/tcp_workqueue/sys/modules/pf/Makefile
  user/andre/tcp_workqueue/sys/modules/pflog/Makefile
  user/andre/tcp_workqueue/sys/modules/pfsync/Makefile
  user/andre/tcp_workqueue/sys/modules/scsi_low/Makefile
  user/andre/tcp_workqueue/sys/modules/sdhci/Makefile
  user/andre/tcp_workqueue/sys/modules/virtio/Makefile
  user/andre/tcp_workqueue/sys/modules/zfs/Makefile
  user/andre/tcp_workqueue/sys/net/bpf.h
  user/andre/tcp_workqueue/sys/net/if.c
  user/andre/tcp_workqueue/sys/net/if.h
  user/andre/tcp_workqueue/sys/net/if_bridge.c
  user/andre/tcp_workqueue/sys/net/if_clone.c
  user/andre/tcp_workqueue/sys/net/if_clone.h
  user/andre/tcp_workqueue/sys/net/if_disc.c
  user/andre/tcp_workqueue/sys/net/if_edsc.c
  user/andre/tcp_workqueue/sys/net/if_ef.c
  user/andre/tcp_workqueue/sys/net/if_enc.c
  user/andre/tcp_workqueue/sys/net/if_epair.c
  user/andre/tcp_workqueue/sys/net/if_faith.c
  user/andre/tcp_workqueue/sys/net/if_gif.c
  user/andre/tcp_workqueue/sys/net/if_gre.c
  user/andre/tcp_workqueue/sys/net/if_lagg.c
  user/andre/tcp_workqueue/sys/net/if_loop.c
  user/andre/tcp_workqueue/sys/net/if_spppsubr.c
  user/andre/tcp_workqueue/sys/net/if_stf.c
  user/andre/tcp_workqueue/sys/net/if_tap.c
  user/andre/tcp_workqueue/sys/net/if_tun.c
  user/andre/tcp_workqueue/sys/net/if_var.h
  user/andre/tcp_workqueue/sys/net/if_vlan.c
  user/andre/tcp_workqueue/sys/net/netmap_user.h
  user/andre/tcp_workqueue/sys/net/rtsock.c
  user/andre/tcp_workqueue/sys/net80211/ieee80211_adhoc.c
  user/andre/tcp_workqueue/sys/net80211/ieee80211_freebsd.c
  user/andre/tcp_workqueue/sys/net80211/ieee80211_hostap.c
  user/andre/tcp_workqueue/sys/net80211/ieee80211_hostap.h
  user/andre/tcp_workqueue/sys/net80211/ieee80211_mesh.c
  user/andre/tcp_workqueue/sys/net80211/ieee80211_node.c
  user/andre/tcp_workqueue/sys/net80211/ieee80211_power.c
  user/andre/tcp_workqueue/sys/net80211/ieee80211_power.h
  user/andre/tcp_workqueue/sys/net80211/ieee80211_scan.c
  user/andre/tcp_workqueue/sys/net80211/ieee80211_sta.c
  user/andre/tcp_workqueue/sys/net80211/ieee80211_var.h
  user/andre/tcp_workqueue/sys/netgraph/atm/ccatm/ng_ccatm.c
  user/andre/tcp_workqueue/sys/netgraph/atm/sscfu/ng_sscfu.c
  user/andre/tcp_workqueue/sys/netgraph/atm/sscop/ng_sscop.c
  user/andre/tcp_workqueue/sys/netgraph/atm/uni/ng_uni.c
  user/andre/tcp_workqueue/sys/netgraph/bluetooth/drivers/ubt/ng_ubt.c
  user/andre/tcp_workqueue/sys/netgraph/netflow/netflow_v9.c
  user/andre/tcp_workqueue/sys/netgraph/netflow/ng_netflow.c
  user/andre/tcp_workqueue/sys/netgraph/netflow/ng_netflow.h
  user/andre/tcp_workqueue/sys/netgraph/ng_base.c
  user/andre/tcp_workqueue/sys/netgraph/ng_eiface.c
  user/andre/tcp_workqueue/sys/netgraph/ng_ether.c
  user/andre/tcp_workqueue/sys/netgraph/ng_fec.c
  user/andre/tcp_workqueue/sys/netgraph/ng_gif.c
  user/andre/tcp_workqueue/sys/netgraph/ng_ipfw.c
  user/andre/tcp_workqueue/sys/netgraph/ng_ksocket.c
  user/andre/tcp_workqueue/sys/netgraph/ng_nat.c
  user/andre/tcp_workqueue/sys/netgraph/ng_source.c
  user/andre/tcp_workqueue/sys/netinet/in_gif.c
  user/andre/tcp_workqueue/sys/netinet/in_pcb.c
  user/andre/tcp_workqueue/sys/netinet/in_pcb.h
  user/andre/tcp_workqueue/sys/netinet/in_rmx.c
  user/andre/tcp_workqueue/sys/netinet/in_var.h
  user/andre/tcp_workqueue/sys/netinet/ip_carp.c
  user/andre/tcp_workqueue/sys/netinet/ip_divert.c
  user/andre/tcp_workqueue/sys/netinet/ip_fastfwd.c
  user/andre/tcp_workqueue/sys/netinet/ip_icmp.c
  user/andre/tcp_workqueue/sys/netinet/ip_input.c
  user/andre/tcp_workqueue/sys/netinet/ip_ipsec.c
  user/andre/tcp_workqueue/sys/netinet/ip_mroute.c
  user/andre/tcp_workqueue/sys/netinet/ip_options.c
  user/andre/tcp_workqueue/sys/netinet/ip_options.h
  user/andre/tcp_workqueue/sys/netinet/ip_output.c
  user/andre/tcp_workqueue/sys/netinet/ip_var.h
  user/andre/tcp_workqueue/sys/netinet/libalias/alias_proxy.c
  user/andre/tcp_workqueue/sys/netinet/libalias/alias_skinny.c
  user/andre/tcp_workqueue/sys/netinet/raw_ip.c
  user/andre/tcp_workqueue/sys/netinet/sctp_asconf.c
  user/andre/tcp_workqueue/sys/netinet/sctp_header.h
  user/andre/tcp_workqueue/sys/netinet/sctp_indata.c
  user/andre/tcp_workqueue/sys/netinet/sctp_input.c
  user/andre/tcp_workqueue/sys/netinet/sctp_input.h
  user/andre/tcp_workqueue/sys/netinet/sctp_output.c
  user/andre/tcp_workqueue/sys/netinet/sctp_output.h
  user/andre/tcp_workqueue/sys/netinet/sctp_pcb.c
  user/andre/tcp_workqueue/sys/netinet/sctp_structs.h
  user/andre/tcp_workqueue/sys/netinet/sctputil.c
  user/andre/tcp_workqueue/sys/netinet/tcp_input.c
  user/andre/tcp_workqueue/sys/netinet/tcp_subr.c
  user/andre/tcp_workqueue/sys/netinet/tcp_usrreq.c
  user/andre/tcp_workqueue/sys/netinet/udp_usrreq.c
  user/andre/tcp_workqueue/sys/netinet6/icmp6.c
  user/andre/tcp_workqueue/sys/netinet6/in6.c
  user/andre/tcp_workqueue/sys/netinet6/in6_gif.c
  user/andre/tcp_workqueue/sys/netinet6/in6_rmx.c
  user/andre/tcp_workqueue/sys/netinet6/ip6_ipsec.c
  user/andre/tcp_workqueue/sys/netinet6/nd6.c
  user/andre/tcp_workqueue/sys/netinet6/nd6_nbr.c
  user/andre/tcp_workqueue/sys/netinet6/nd6_rtr.c
  user/andre/tcp_workqueue/sys/netinet6/udp6_usrreq.c
  user/andre/tcp_workqueue/sys/netipsec/ipsec_input.c
  user/andre/tcp_workqueue/sys/netipsec/ipsec_output.c
  user/andre/tcp_workqueue/sys/netipsec/key.c
  user/andre/tcp_workqueue/sys/netipsec/xform_ipip.c
  user/andre/tcp_workqueue/sys/nfs/nfs_nfssvc.c
  user/andre/tcp_workqueue/sys/nfs/nfssvc.h
  user/andre/tcp_workqueue/sys/nfsserver/nfs_serv.c
  user/andre/tcp_workqueue/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c
  user/andre/tcp_workqueue/sys/ofed/drivers/net/mlx4/en_tx.c
  user/andre/tcp_workqueue/sys/ofed/include/linux/pci.h
  user/andre/tcp_workqueue/sys/ofed/include/rdma/ib_addr.h
  user/andre/tcp_workqueue/sys/pc98/include/bus.h
  user/andre/tcp_workqueue/sys/pc98/pc98/machdep.c
  user/andre/tcp_workqueue/sys/powerpc/aim/mmu_oea.c
  user/andre/tcp_workqueue/sys/powerpc/aim/mmu_oea64.c
  user/andre/tcp_workqueue/sys/powerpc/aim/trap.c
  user/andre/tcp_workqueue/sys/powerpc/booke/trap.c
  user/andre/tcp_workqueue/sys/powerpc/include/cpu.h
  user/andre/tcp_workqueue/sys/powerpc/include/pcb.h
  user/andre/tcp_workqueue/sys/powerpc/mpc85xx/pci_fdt.c
  user/andre/tcp_workqueue/sys/powerpc/ofw/ofw_real.c
  user/andre/tcp_workqueue/sys/powerpc/wii/wii_bus.c
  user/andre/tcp_workqueue/sys/rpc/auth.h
  user/andre/tcp_workqueue/sys/rpc/rpcb_clnt.c
  user/andre/tcp_workqueue/sys/rpc/rpcsec_gss/svc_rpcsec_gss.c
  user/andre/tcp_workqueue/sys/sparc64/include/atomic.h
  user/andre/tcp_workqueue/sys/sparc64/include/intr_machdep.h
  user/andre/tcp_workqueue/sys/sparc64/include/vmparam.h
  user/andre/tcp_workqueue/sys/sparc64/sparc64/ata_machdep.c
  user/andre/tcp_workqueue/sys/sparc64/sparc64/intr_machdep.c
  user/andre/tcp_workqueue/sys/sparc64/sparc64/machdep.c
  user/andre/tcp_workqueue/sys/sparc64/sparc64/pmap.c
  user/andre/tcp_workqueue/sys/sparc64/sparc64/trap.c
  user/andre/tcp_workqueue/sys/sys/_rmlock.h
  user/andre/tcp_workqueue/sys/sys/buf_ring.h
  user/andre/tcp_workqueue/sys/sys/capability.h
  user/andre/tcp_workqueue/sys/sys/cdefs.h
  user/andre/tcp_workqueue/sys/sys/kernel.h
  user/andre/tcp_workqueue/sys/sys/mbuf.h
  user/andre/tcp_workqueue/sys/sys/mount.h
  user/andre/tcp_workqueue/sys/sys/param.h
  user/andre/tcp_workqueue/sys/sys/pcpu.h
  user/andre/tcp_workqueue/sys/sys/proc.h
  user/andre/tcp_workqueue/sys/sys/queue.h
  user/andre/tcp_workqueue/sys/sys/socketvar.h
  user/andre/tcp_workqueue/sys/sys/vnode.h
  user/andre/tcp_workqueue/sys/ufs/ffs/ffs_alloc.c
  user/andre/tcp_workqueue/sys/ufs/ffs/ffs_snapshot.c
  user/andre/tcp_workqueue/sys/ufs/ffs/ffs_softdep.c
  user/andre/tcp_workqueue/sys/ufs/ufs/inode.h
  user/andre/tcp_workqueue/sys/ufs/ufs/ufs_acl.c
  user/andre/tcp_workqueue/sys/ufs/ufs/ufs_lookup.c
  user/andre/tcp_workqueue/sys/ufs/ufs/ufs_vnops.c
  user/andre/tcp_workqueue/sys/vm/uma_core.c
  user/andre/tcp_workqueue/sys/vm/vm_object.c
  user/andre/tcp_workqueue/sys/vm/vm_page.c
  user/andre/tcp_workqueue/sys/vm/vm_page.h
  user/andre/tcp_workqueue/sys/vm/vm_pageout.c
  user/andre/tcp_workqueue/sys/vm/vnode_pager.c
  user/andre/tcp_workqueue/sys/x86/bios/smbios.c
  user/andre/tcp_workqueue/sys/x86/include/bus.h
  user/andre/tcp_workqueue/sys/x86/x86/intr_machdep.c
Directory Properties:
  user/andre/tcp_workqueue/sys/   (props changed)
  user/andre/tcp_workqueue/sys/boot/   (props changed)
  user/andre/tcp_workqueue/sys/cddl/contrib/opensolaris/   (props changed)
  user/andre/tcp_workqueue/sys/conf/   (props changed)
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/   (props changed)
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/common/   (props changed)
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/compiler/   (props changed)
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/components/debugger/   (props changed)
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/components/disassembler/   (props changed)
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/components/tables/   (props changed)
  user/andre/tcp_workqueue/sys/contrib/dev/acpica/include/   (props changed)

Modified: user/andre/tcp_workqueue/sys/amd64/amd64/identcpu.c
==============================================================================
--- user/andre/tcp_workqueue/sys/amd64/amd64/identcpu.c	Fri Oct 19 12:44:22 2012	(r241731)
+++ user/andre/tcp_workqueue/sys/amd64/amd64/identcpu.c	Fri Oct 19 13:05:51 2012	(r241732)
@@ -213,8 +213,8 @@ printcpuinfo(void)
 	if (cpu_vendor_id == CPU_VENDOR_INTEL ||
 	    cpu_vendor_id == CPU_VENDOR_AMD ||
 	    cpu_vendor_id == CPU_VENDOR_CENTAUR) {
-		printf("  Family = %x", CPUID_TO_FAMILY(cpu_id));
-		printf("  Model = %x", CPUID_TO_MODEL(cpu_id));
+		printf("  Family = 0x%x", CPUID_TO_FAMILY(cpu_id));
+		printf("  Model = 0x%x", CPUID_TO_MODEL(cpu_id));
 		printf("  Stepping = %u", cpu_id & CPUID_STEPPING);
 
 		/*

Modified: user/andre/tcp_workqueue/sys/amd64/amd64/machdep.c
==============================================================================
--- user/andre/tcp_workqueue/sys/amd64/amd64/machdep.c	Fri Oct 19 12:44:22 2012	(r241731)
+++ user/andre/tcp_workqueue/sys/amd64/amd64/machdep.c	Fri Oct 19 13:05:51 2012	(r241732)
@@ -298,11 +298,6 @@ cpu_startup(dummy)
 	vm_pager_bufferinit();
 
 	cpu_setregs();
-
-	/*
-	 * Add BSP as an interrupt target.
-	 */
-	intr_add_cpu(0);
 }
 
 /*

Modified: user/andre/tcp_workqueue/sys/amd64/amd64/mp_machdep.c
==============================================================================
--- user/andre/tcp_workqueue/sys/amd64/amd64/mp_machdep.c	Fri Oct 19 12:44:22 2012	(r241731)
+++ user/andre/tcp_workqueue/sys/amd64/amd64/mp_machdep.c	Fri Oct 19 13:05:51 2012	(r241732)
@@ -784,6 +784,8 @@ init_secondary(void)
  * We tell the I/O APIC code about all the CPUs we want to receive
  * interrupts.  If we don't want certain CPUs to receive IRQs we
  * can simply not tell the I/O APIC code about them in this function.
+ * We also do not tell it about the BSP since it tells itself about
+ * the BSP internally to work with UP kernels and on UP machines.
  */
 static void
 set_interrupt_apic_ids(void)
@@ -794,6 +796,8 @@ set_interrupt_apic_ids(void)
 		apic_id = cpu_apic_ids[i];
 		if (apic_id == -1)
 			continue;
+		if (cpu_info[apic_id].cpu_bsp)
+			continue;
 		if (cpu_info[apic_id].cpu_disabled)
 			continue;
 

Modified: user/andre/tcp_workqueue/sys/amd64/amd64/pmap.c
==============================================================================
--- user/andre/tcp_workqueue/sys/amd64/amd64/pmap.c	Fri Oct 19 12:44:22 2012	(r241731)
+++ user/andre/tcp_workqueue/sys/amd64/amd64/pmap.c	Fri Oct 19 13:05:51 2012	(r241732)
@@ -82,13 +82,6 @@ __FBSDID("$FreeBSD$");
 /*
  *	Manages physical address maps.
  *
- *	In addition to hardware address maps, this
- *	module is called upon to provide software-use-only
- *	maps which may or may not be stored in the same
- *	form as hardware maps.  These pseudo-maps are
- *	used to store intermediate results from copy
- *	operations to and from address spaces.
- *
  *	Since the information managed by this module is
  *	also stored by the logical address mapping module,
  *	this module may throw away valid virtual-to-physical
@@ -4998,7 +4991,7 @@ pmap_mapbios(vm_paddr_t pa, vm_size_t si
 void
 pmap_unmapdev(vm_offset_t va, vm_size_t size)
 {
-	vm_offset_t base, offset, tmpva;
+	vm_offset_t base, offset;
 
 	/* If we gave a direct map region in pmap_mapdev, do nothing */
 	if (va >= DMAP_MIN_ADDRESS && va < DMAP_MAX_ADDRESS)
@@ -5006,9 +4999,6 @@ pmap_unmapdev(vm_offset_t va, vm_size_t 
 	base = trunc_page(va);
 	offset = va & PAGE_MASK;
 	size = roundup(offset + size, PAGE_SIZE);
-	for (tmpva = base; tmpva < (base + size); tmpva += PAGE_SIZE)
-		pmap_kremove(tmpva);
-	pmap_invalidate_range(kernel_pmap, va, tmpva);
 	kmem_free(kernel_map, base, size);
 }
 

Modified: user/andre/tcp_workqueue/sys/amd64/amd64/trap.c
==============================================================================
--- user/andre/tcp_workqueue/sys/amd64/amd64/trap.c	Fri Oct 19 12:44:22 2012	(r241731)
+++ user/andre/tcp_workqueue/sys/amd64/amd64/trap.c	Fri Oct 19 13:05:51 2012	(r241732)
@@ -617,8 +617,10 @@ trap(struct trapframe *frame)
 	ksi.ksi_addr = (void *)addr;
 	if (uprintf_signal) {
 		uprintf("pid %d comm %s: signal %d err %lx code %d type %d "
-		    "addr 0x%lx <%02x %02x %02x %02x %02x %02x %02x %02x>\n",
+		    "addr 0x%lx rip 0x%lx "
+		    "<%02x %02x %02x %02x %02x %02x %02x %02x>\n",
 		    p->p_pid, p->p_comm, i, frame->tf_err, ucode, type, addr,
+		    frame->tf_rip,
 		    fubyte((void *)(frame->tf_rip + 0)),
 		    fubyte((void *)(frame->tf_rip + 1)),
 		    fubyte((void *)(frame->tf_rip + 2)),
@@ -632,7 +634,6 @@ trap(struct trapframe *frame)
 
 user:
 	userret(td, frame);
-	mtx_assert(&Giant, MA_NOTOWNED);
 	KASSERT(PCB_USER_FPU(td->td_pcb),
 	    ("Return from trap with kernel FPU ctx leaked"));
 userout:

Modified: user/andre/tcp_workqueue/sys/amd64/conf/GENERIC
==============================================================================
--- user/andre/tcp_workqueue/sys/amd64/conf/GENERIC	Fri Oct 19 12:44:22 2012	(r241731)
+++ user/andre/tcp_workqueue/sys/amd64/conf/GENERIC	Fri Oct 19 13:05:51 2012	(r241732)
@@ -293,7 +293,7 @@ device		wpi		# Intel 3945ABG wireless NI
 device		loop		# Network loopback
 device		random		# Entropy device
 options 	PADLOCK_RNG	# VIA Padlock RNG
-options 	IVY_RNG		# Intel Bull Mountain RNG
+options 	RDRAND_RNG	# Intel Bull Mountain RNG
 device		ether		# Ethernet support
 device		vlan		# 802.1Q VLAN support
 device		tun		# Packet tunnel.

Modified: user/andre/tcp_workqueue/sys/amd64/conf/NOTES
==============================================================================
--- user/andre/tcp_workqueue/sys/amd64/conf/NOTES	Fri Oct 19 12:44:22 2012	(r241731)
+++ user/andre/tcp_workqueue/sys/amd64/conf/NOTES	Fri Oct 19 13:05:51 2012	(r241732)
@@ -428,6 +428,11 @@ device		isci
 options		ISCI_LOGGING	# enable debugging in isci HAL
 
 #
+# NVM Express (NVMe) support
+device         nvme    # base NVMe driver
+device         nvd     # expose NVMe namespaces as disks, depends on nvme
+
+#
 # SafeNet crypto driver: can be moved to the MI NOTES as soon as
 # it's tested on a big-endian machine
 #

Modified: user/andre/tcp_workqueue/sys/amd64/include/atomic.h
==============================================================================
--- user/andre/tcp_workqueue/sys/amd64/include/atomic.h	Fri Oct 19 12:44:22 2012	(r241731)
+++ user/andre/tcp_workqueue/sys/amd64/include/atomic.h	Fri Oct 19 13:05:51 2012	(r241732)
@@ -226,7 +226,7 @@ atomic_fetchadd_long(volatile u_long *p,
 static __inline void					\
 atomic_store_rel_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\
 {							\
-	__asm __volatile("" : : : "memory");		\
+	__compiler_membar();				\
 	*p = v;						\
 }							\
 struct __hack
@@ -240,7 +240,7 @@ atomic_load_acq_##TYPE(volatile u_##TYPE
 	u_##TYPE tmp;					\
 							\
 	tmp = *p;					\
-	__asm __volatile("" : : : "memory");		\
+	__compiler_membar();				\
 	return (tmp);					\
 }							\
 struct __hack

Modified: user/andre/tcp_workqueue/sys/amd64/include/intr_machdep.h
==============================================================================
--- user/andre/tcp_workqueue/sys/amd64/include/intr_machdep.h	Fri Oct 19 12:44:22 2012	(r241731)
+++ user/andre/tcp_workqueue/sys/amd64/include/intr_machdep.h	Fri Oct 19 13:05:51 2012	(r241732)
@@ -140,7 +140,9 @@ int	elcr_probe(void);
 enum intr_trigger elcr_read_trigger(u_int irq);
 void	elcr_resume(void);
 void	elcr_write_trigger(u_int irq, enum intr_trigger trigger);
+#ifdef SMP
 void	intr_add_cpu(u_int cpu);
+#endif
 int	intr_add_handler(const char *name, int vector, driver_filter_t filter, 
 			 driver_intr_t handler, void *arg, enum intr_type flags, 
 			 void **cookiep);    

Modified: user/andre/tcp_workqueue/sys/amd64/include/pc/bios.h
==============================================================================
--- user/andre/tcp_workqueue/sys/amd64/include/pc/bios.h	Fri Oct 19 12:44:22 2012	(r241731)
+++ user/andre/tcp_workqueue/sys/amd64/include/pc/bios.h	Fri Oct 19 13:05:51 2012	(r241732)
@@ -30,16 +30,9 @@
 #ifndef _MACHINE_PC_BIOS_H_
 #define _MACHINE_PC_BIOS_H_
 
-extern u_int32_t	bios_sigsearch(u_int32_t start, u_char *sig, int siglen, 
-					 int paralen, int sigofs);
-
-#define BIOS_PADDRTOVADDR(x)	((x) + KERNBASE)
-#define BIOS_VADDRTOPADDR(x)	((x) - KERNBASE)
-
 /*
  * Int 15:E820 'SMAP' structure
  */
-
 #define SMAP_SIG	0x534D4150			/* 'SMAP' */
 
 #define	SMAP_TYPE_MEMORY	1
@@ -58,22 +51,61 @@ struct bios_smap {
     u_int32_t	type;
 } __packed;
 
+/*
+ * System Management BIOS
+ */
+#define	SMBIOS_START	0xf0000
+#define	SMBIOS_STEP	0x10
+#define	SMBIOS_OFF	0
+#define	SMBIOS_LEN	4
+#define	SMBIOS_SIG	"_SM_"
+
+struct smbios_eps {
+	uint8_t		anchor_string[4];		/* '_SM_' */
+	uint8_t		checksum;
+	uint8_t		length;
+	uint8_t		major_version;
+	uint8_t		minor_version;
+	uint16_t	maximum_structure_size;
+	uint8_t		entry_point_revision;
+	uint8_t		formatted_area[5];
+	uint8_t		intermediate_anchor_string[5];	/* '_DMI_' */
+	uint8_t		intermediate_checksum;
+	uint16_t	structure_table_length;
+	uint32_t	structure_table_address;
+	uint16_t	number_structures;
+	uint8_t		BCD_revision;
+};
+
+struct smbios_structure_header {
+	uint8_t		type;
+	uint8_t		length;
+	uint16_t	handle;
+};
+
+#ifdef _KERNEL
+#define BIOS_PADDRTOVADDR(x)	((x) + KERNBASE)
+#define BIOS_VADDRTOPADDR(x)	((x) - KERNBASE)
+
 struct bios_oem_signature {
 	char * anchor;		/* search anchor string in BIOS memory */
 	size_t offset;		/* offset from anchor (may be negative) */
 	size_t totlen;		/* total length of BIOS string to copy */
 } __packed;
+
 struct bios_oem_range {
 	u_int from;		/* shouldn't be below 0xe0000 */
 	u_int to;		/* shouldn't be above 0xfffff */
 } __packed;
+
 struct bios_oem {
 	struct bios_oem_range range;
 	struct bios_oem_signature signature[];
 } __packed;
 
-extern int
-bios_oem_strings(struct bios_oem *oem, u_char *buffer, size_t maxlen);
-
+int	bios_oem_strings(struct bios_oem *oem, u_char *buffer, size_t maxlen);
+uint32_t bios_sigsearch(uint32_t start, u_char *sig, int siglen, int paralen,
+	    int sigofs);
+#endif
 
 #endif /* _MACHINE_PC_BIOS_H_ */

Modified: user/andre/tcp_workqueue/sys/amd64/pci/pci_cfgreg.c
==============================================================================
--- user/andre/tcp_workqueue/sys/amd64/pci/pci_cfgreg.c	Fri Oct 19 12:44:22 2012	(r241731)
+++ user/andre/tcp_workqueue/sys/amd64/pci/pci_cfgreg.c	Fri Oct 19 13:05:51 2012	(r241732)
@@ -295,6 +295,13 @@ pcie_cfgregopen(uint64_t base, uint8_t m
 	return (1);
 }
 
+/*
+ * AMD BIOS And Kernel Developer's Guides for CPU families starting with 10h
+ * have a requirement that all accesses to the memory mapped PCI configuration
+ * space are done using AX class of registers.
+ * Since other vendors do not currently have any contradicting requirements
+ * the AMD access pattern is applied universally.
+ */
 #define PCIE_VADDR(base, reg, bus, slot, func)	\
 	((base)				+	\
 	((((bus) & 0xff) << 20)		|	\
@@ -317,13 +324,16 @@ pciereg_cfgread(int bus, unsigned slot, 
 
 	switch (bytes) {
 	case 4:
-		data = *(volatile uint32_t *)(va);
+		__asm __volatile("mov %1, %%eax" : "=a" (data)
+		    : "m" (*(uint32_t *)va));
 		break;
 	case 2:
-		data = *(volatile uint16_t *)(va);
+		__asm __volatile("movzwl %1, %%eax" : "=a" (data)
+		    : "m" (*(uint16_t *)va));
 		break;
 	case 1:
-		data = *(volatile uint8_t *)(va);
+		__asm __volatile("movzbl %1, %%eax" : "=a" (data)
+		    : "m" (*(uint8_t *)va));
 		break;
 	}
 
@@ -344,13 +354,16 @@ pciereg_cfgwrite(int bus, unsigned slot,
 
 	switch (bytes) {
 	case 4:
-		*(volatile uint32_t *)(va) = data;
+		__asm __volatile("mov %%eax, %0" : "=m" (*(uint32_t *)va)
+		    : "a" (data));
 		break;
 	case 2:
-		*(volatile uint16_t *)(va) = data;
+		__asm __volatile("mov %%ax, %0" : "=m" (*(uint16_t *)va)
+		    : "a" (data));
 		break;
 	case 1:
-		*(volatile uint8_t *)(va) = data;
+		__asm __volatile("mov %%al, %0" : "=m" (*(uint8_t *)va)
+		    : "a" (data));
 		break;
 	}
 }

Modified: user/andre/tcp_workqueue/sys/arm/arm/cpufunc.c
==============================================================================
--- user/andre/tcp_workqueue/sys/arm/arm/cpufunc.c	Fri Oct 19 12:44:22 2012	(r241731)
+++ user/andre/tcp_workqueue/sys/arm/arm/cpufunc.c	Fri Oct 19 13:05:51 2012	(r241732)
@@ -1415,6 +1415,7 @@ set_cpufuncs()
 #if defined(CPU_MV_PJ4B)
 	if (cputype == CPU_ID_MV88SV581X_V6 ||
 	    cputype == CPU_ID_MV88SV581X_V7 ||
+	    cputype == CPU_ID_MV88SV584X_V7 ||
 	    cputype == CPU_ID_ARM_88SV581X_V6 ||
 	    cputype == CPU_ID_ARM_88SV581X_V7) {
 		if (cpu_pfr(0) & ARM_PFR0_THUMBEE_MASK)
@@ -1425,8 +1426,8 @@ set_cpufuncs()
 		get_cachetype_cp15();
 		pmap_pte_init_mmu_v6();
 		goto out;
-	} else if (cputype == CPU_ID_ARM_88SV584X ||
-	    cputype == CPU_ID_MV88SV584X) {
+	} else if (cputype == CPU_ID_ARM_88SV584X_V6 ||
+	    cputype == CPU_ID_MV88SV584X_V6) {
 		cpufuncs = pj4bv6_cpufuncs;
 		get_cachetype_cp15();
 		pmap_pte_init_mmu_v6();

Modified: user/andre/tcp_workqueue/sys/arm/arm/identcpu.c
==============================================================================
--- user/andre/tcp_workqueue/sys/arm/arm/identcpu.c	Fri Oct 19 12:44:22 2012	(r241731)
+++ user/andre/tcp_workqueue/sys/arm/arm/identcpu.c	Fri Oct 19 13:05:51 2012	(r241732)
@@ -321,9 +321,11 @@ const struct cpuidtab cpuids[] = {
 	  generic_steppings },
 	{ CPU_ID_ARM_88SV581X_V7, CPU_CLASS_MARVELL,	"Sheeva 88SV581x",
 	  generic_steppings },
-	{ CPU_ID_MV88SV584X,	CPU_CLASS_MARVELL,	"Sheeva 88SV584x",
+	{ CPU_ID_MV88SV584X_V6,	CPU_CLASS_MARVELL,	"Sheeva 88SV584x",
 	  generic_steppings },
-	{ CPU_ID_ARM_88SV584X,	CPU_CLASS_MARVELL,	"Sheeva 88SV584x",
+	{ CPU_ID_ARM_88SV584X_V6, CPU_CLASS_MARVELL,	"Sheeva 88SV584x",
+	  generic_steppings },
+	{ CPU_ID_MV88SV584X_V7,	CPU_CLASS_MARVELL,	"Sheeva 88SV584x",
 	  generic_steppings },
 
 	{ 0, CPU_CLASS_NONE, NULL, NULL }

Modified: user/andre/tcp_workqueue/sys/arm/arm/machdep.c
==============================================================================
--- user/andre/tcp_workqueue/sys/arm/arm/machdep.c	Fri Oct 19 12:44:22 2012	(r241731)
+++ user/andre/tcp_workqueue/sys/arm/arm/machdep.c	Fri Oct 19 13:05:51 2012	(r241732)
@@ -948,3 +948,16 @@ init_proc0(vm_offset_t kstack)
 	thread0.td_frame = &proc0_tf;
 	pcpup->pc_curpcb = thread0.td_pcb;
 }
+
+void
+set_stackptrs(int cpu)
+{
+
+	set_stackptr(PSR_IRQ32_MODE,
+	    irqstack.pv_va + ((IRQ_STACK_SIZE * PAGE_SIZE) * (cpu + 1)));
+	set_stackptr(PSR_ABT32_MODE,
+	    abtstack.pv_va + ((ABT_STACK_SIZE * PAGE_SIZE) * (cpu + 1)));
+	set_stackptr(PSR_UND32_MODE,
+	    undstack.pv_va + ((UND_STACK_SIZE * PAGE_SIZE) * (cpu + 1)));
+}
+

Modified: user/andre/tcp_workqueue/sys/arm/arm/pmap-v6.c
==============================================================================
--- user/andre/tcp_workqueue/sys/arm/arm/pmap-v6.c	Fri Oct 19 12:44:22 2012	(r241731)
+++ user/andre/tcp_workqueue/sys/arm/arm/pmap-v6.c	Fri Oct 19 13:05:51 2012	(r241732)
@@ -148,15 +148,19 @@ __FBSDID("$FreeBSD$");
 #include <sys/systm.h>
 #include <sys/kernel.h>
 #include <sys/ktr.h>
+#include <sys/lock.h>
 #include <sys/proc.h>
 #include <sys/malloc.h>
 #include <sys/msgbuf.h>
+#include <sys/mutex.h>
 #include <sys/vmmeter.h>
 #include <sys/mman.h>
+#include <sys/rwlock.h>
 #include <sys/smp.h>
 #include <sys/sched.h>
 
 #include <vm/vm.h>
+#include <vm/vm_param.h>
 #include <vm/uma.h>
 #include <vm/pmap.h>
 #include <vm/vm_kern.h>
@@ -164,12 +168,9 @@ __FBSDID("$FreeBSD$");
 #include <vm/vm_map.h>
 #include <vm/vm_page.h>
 #include <vm/vm_pageout.h>
-#include <vm/vm_param.h>
 #include <vm/vm_extern.h>
-#include <sys/lock.h>
-#include <sys/mutex.h>
+
 #include <machine/md_var.h>
-#include <machine/vmparam.h>
 #include <machine/cpu.h>
 #include <machine/cpufunc.h>
 #include <machine/pcb.h>
@@ -202,6 +203,7 @@ static pv_entry_t pmap_get_pv_entry(void
 
 static void		pmap_enter_locked(pmap_t, vm_offset_t, vm_page_t,
     vm_prot_t, boolean_t, int);
+static vm_paddr_t	pmap_extract_locked(pmap_t pmap, vm_offset_t va);
 static void		pmap_alloc_l1(pmap_t);
 static void		pmap_free_l1(pmap_t);
 
@@ -219,7 +221,6 @@ vm_offset_t virtual_end;	/* VA of last a
 vm_offset_t pmap_curmaxkvaddr;
 vm_paddr_t kernel_l1pa;
 
-extern void *end;
 vm_offset_t kernel_vm_end = 0;
 
 struct pmap kernel_pmap_store;
@@ -246,13 +247,6 @@ pt_entry_t	pte_l2_l_cache_mode_pt;
 pt_entry_t	pte_l2_s_cache_mode;
 pt_entry_t	pte_l2_s_cache_mode_pt;
 
-/*
- * Which pmap is currently 'live' in the cache
- *
- * XXXSCW: Fix for SMP ...
- */
-union pmap_cache_state *pmap_cache_state;
-
 struct msgbuf *msgbufp = 0;
 
 /*
@@ -263,8 +257,6 @@ static caddr_t crashdumpmap;
 extern void bcopy_page(vm_offset_t, vm_offset_t);
 extern void bzero_page(vm_offset_t);
 
-extern vm_offset_t alloc_firstaddr;
-
 char *_tmppt;
 
 /*
@@ -357,14 +349,6 @@ struct l2_dtable {
 #define	L2_NEXT_BUCKET(va)	(((va) & L1_S_FRAME) + L1_S_SIZE)
 
 /*
- * L2 allocation.
- */
-#define	pmap_alloc_l2_dtable()		\
-		(void*)uma_zalloc(l2table_zone, M_NOWAIT|M_USE_RESERVE)
-#define	pmap_free_l2_dtable(l2)		\
-		uma_zfree(l2table_zone, l2)
-
-/*
  * We try to map the page tables write-through, if possible.  However, not
  * all CPUs have a write-through cache mode, so on those we have to sync
  * the cache when we frob page tables.
@@ -400,6 +384,7 @@ static vm_offset_t pmap_kernel_l2ptp_kva
 static vm_paddr_t pmap_kernel_l2ptp_phys;
 static struct vm_object pvzone_obj;
 static int pv_entry_count=0, pv_entry_max=0, pv_entry_high_water=0;
+static struct rwlock pvh_global_lock;
 
 int l1_mem_types[] = {
 	ARM_L1S_STRONG_ORD,
@@ -613,36 +598,29 @@ pmap_alloc_l2_bucket(pmap_t pm, vm_offse
 	l1idx = L1_IDX(va);
 
 	PMAP_ASSERT_LOCKED(pm);
-	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+	rw_assert(&pvh_global_lock, RA_WLOCKED);
 	if ((l2 = pm->pm_l2[L2_IDX(l1idx)]) == NULL) {
 		/*
 		 * No mapping at this address, as there is
 		 * no entry in the L1 table.
 		 * Need to allocate a new l2_dtable.
 		 */
-again_l2table:
 		PMAP_UNLOCK(pm);
-		vm_page_unlock_queues();
-		if ((l2 = pmap_alloc_l2_dtable()) == NULL) {
-			vm_page_lock_queues();
+		rw_wunlock(&pvh_global_lock);
+		if ((l2 = uma_zalloc(l2table_zone, M_NOWAIT)) == NULL) {
+			rw_wlock(&pvh_global_lock);
 			PMAP_LOCK(pm);
 			return (NULL);
 		}
-		vm_page_lock_queues();
+		rw_wlock(&pvh_global_lock);
 		PMAP_LOCK(pm);
 		if (pm->pm_l2[L2_IDX(l1idx)] != NULL) {
-			PMAP_UNLOCK(pm);
-			vm_page_unlock_queues();
-			uma_zfree(l2table_zone, l2);
-			vm_page_lock_queues();
-			PMAP_LOCK(pm);
-			l2 = pm->pm_l2[L2_IDX(l1idx)];
-			if (l2 == NULL)
-				goto again_l2table;
 			/*
 			 * Someone already allocated the l2_dtable while
 			 * we were doing the same.
 			 */
+			uma_zfree(l2table_zone, l2);
+			l2 = pm->pm_l2[L2_IDX(l1idx)];
 		} else {
 			bzero(l2, sizeof(*l2));
 			/*
@@ -664,21 +642,14 @@ again_l2table:
 		 * No L2 page table has been allocated. Chances are, this
 		 * is because we just allocated the l2_dtable, above.
 		 */
-again_ptep:
 		PMAP_UNLOCK(pm);
-		vm_page_unlock_queues();
-		ptep = (void*)uma_zalloc(l2zone, M_NOWAIT|M_USE_RESERVE);
-		vm_page_lock_queues();
+		rw_wunlock(&pvh_global_lock);
+		ptep = uma_zalloc(l2zone, M_NOWAIT);
+		rw_wlock(&pvh_global_lock);
 		PMAP_LOCK(pm);
 		if (l2b->l2b_kva != 0) {
 			/* We lost the race. */
-			PMAP_UNLOCK(pm);
-			vm_page_unlock_queues();
 			uma_zfree(l2zone, ptep);
-			vm_page_lock_queues();
-			PMAP_LOCK(pm);
-			if (l2b->l2b_kva == 0)
-				goto again_ptep;
 			return (l2b);
 		}
 		l2b->l2b_phys = vtophys(ptep);
@@ -690,7 +661,7 @@ again_ptep:
 			 */
 			if (l2->l2_occupancy == 0) {
 				pm->pm_l2[L2_IDX(l1idx)] = NULL;
-				pmap_free_l2_dtable(l2);
+				uma_zfree(l2table_zone, l2);
 			}
 			return (NULL);
 		}
@@ -788,7 +759,7 @@ pmap_free_l2_bucket(pmap_t pm, struct l2
 	 * the pointer in the parent pmap and free the l2_dtable.
 	 */
 	pm->pm_l2[L2_IDX(l1idx)] = NULL;
-	pmap_free_l2_dtable(l2);
+	uma_zfree(l2table_zone, l2);
 }
 
 /*
@@ -851,7 +822,7 @@ pmap_clearbit(struct vm_page *pg, u_int 
 	u_int oflags;
 	int count = 0;
 
-	vm_page_lock_queues();
+	rw_wlock(&pvh_global_lock);
 
 	if (maskbits & PVF_WRITE)
 		maskbits |= PVF_MOD;
@@ -861,7 +832,7 @@ pmap_clearbit(struct vm_page *pg, u_int 
 	pg->md.pvh_attrs &= ~(maskbits & (PVF_MOD | PVF_REF));
 
 	if (TAILQ_EMPTY(&pg->md.pv_list)) {
-		vm_page_unlock_queues();
+		rw_wunlock(&pvh_global_lock);
 		return (0);
 	}
 
@@ -917,7 +888,7 @@ pmap_clearbit(struct vm_page *pg, u_int 
 
 	if (maskbits & PVF_WRITE)
 		vm_page_aflag_clear(pg, PGA_WRITEABLE);
-	vm_page_unlock_queues();
+	rw_wunlock(&pvh_global_lock);
 	return (count);
 }
 
@@ -927,15 +898,15 @@ pmap_clearbit(struct vm_page *pg, u_int 
  *   pmap_remove_pv: remove a mappiing from a vm_page list
  *
  * NOTE: pmap_enter_pv expects to lock the pvh itself
- *       pmap_remove_pv expects te caller to lock the pvh before calling
+ *       pmap_remove_pv expects the caller to lock the pvh before calling
  */
 
 /*
- * pmap_enter_pv: enter a mapping onto a vm_page lst
+ * pmap_enter_pv: enter a mapping onto a vm_page's PV list
  *
- * => caller should hold the proper lock on pmap_main_lock
+ * => caller should hold the proper lock on pvh_global_lock
  * => caller should have pmap locked
- * => we will gain the lock on the vm_page and allocate the new pv_entry
+ * => we will (someday) gain the lock on the vm_page's PV list
  * => caller should adjust ptp's wire_count before calling
  * => caller should not adjust pmap's wire_count
  */
@@ -944,7 +915,7 @@ pmap_enter_pv(struct vm_page *pg, struct
     vm_offset_t va, u_int flags)
 {
 
-	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+	rw_assert(&pvh_global_lock, RA_WLOCKED);
 
 	PMAP_ASSERT_LOCKED(pm);
 	pve->pv_pmap = pm;
@@ -970,7 +941,7 @@ pmap_find_pv(struct vm_page *pg, pmap_t 
 {
 	struct pv_entry *pv;
 
-	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+	rw_assert(&pvh_global_lock, RA_WLOCKED);
 	TAILQ_FOREACH(pv, &pg->md.pv_list, pv_list)
 	    if (pm == pv->pv_pmap && va == pv->pv_va)
 		    break;
@@ -1031,7 +1002,7 @@ static void
 pmap_nuke_pv(struct vm_page *pg, pmap_t pm, struct pv_entry *pve)
 {
 
-	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+	rw_assert(&pvh_global_lock, RA_WLOCKED);
 	PMAP_ASSERT_LOCKED(pm);
 
 	TAILQ_REMOVE(&pg->md.pv_list, pve, pv_list);
@@ -1064,7 +1035,7 @@ pmap_remove_pv(struct vm_page *pg, pmap_
 {
 	struct pv_entry *pve;
 
-	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+	rw_assert(&pvh_global_lock, RA_WLOCKED);
 	pve = TAILQ_FIRST(&pg->md.pv_list);
 
 	while (pve) {
@@ -1096,7 +1067,7 @@ pmap_modify_pv(struct vm_page *pg, pmap_
 	u_int flags, oflags;
 
 	PMAP_ASSERT_LOCKED(pm);
-	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+	rw_assert(&pvh_global_lock, RA_WLOCKED);
 	if ((npv = pmap_find_pv(pg, pm, va)) == NULL)
 		return (0);
 
@@ -1174,28 +1145,25 @@ pmap_init(void)
 
 	PDEBUG(1, printf("pmap_init: phys_start = %08x\n", PHYSADDR));
 
+	l2zone = uma_zcreate("L2 Table", L2_TABLE_SIZE_REAL, pmap_l2ptp_ctor,
+	    NULL, NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_VM | UMA_ZONE_NOFREE);
+	l2table_zone = uma_zcreate("L2 Table", sizeof(struct l2_dtable), NULL,
+	    NULL, NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_VM | UMA_ZONE_NOFREE);
+
 	/*
-	 * init the pv free list
+	 * Initialize the PV entry allocator.
 	 */
 	pvzone = uma_zcreate("PV ENTRY", sizeof (struct pv_entry), NULL, NULL,
 	    NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_VM | UMA_ZONE_NOFREE);
-	/*
-	 * Now it is safe to enable pv_table recording.
-	 */
-	PDEBUG(1, printf("pmap_init: done!\n"));
-
 	TUNABLE_INT_FETCH("vm.pmap.shpgperproc", &shpgperproc);
-
 	pv_entry_max = shpgperproc * maxproc + cnt.v_page_count;
-	pv_entry_high_water = 9 * (pv_entry_max / 10);
-	l2zone = uma_zcreate("L2 Table", L2_TABLE_SIZE_REAL, pmap_l2ptp_ctor,
-	    NULL, NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_VM | UMA_ZONE_NOFREE);
-	l2table_zone = uma_zcreate("L2 Table", sizeof(struct l2_dtable),
-	    NULL, NULL, NULL, NULL, UMA_ALIGN_PTR,
-	    UMA_ZONE_VM | UMA_ZONE_NOFREE);
-
 	uma_zone_set_obj(pvzone, &pvzone_obj, pv_entry_max);
+	pv_entry_high_water = 9 * (pv_entry_max / 10);
 
+	/*
+	 * Now it is safe to enable pv_table recording.
+	 */
+	PDEBUG(1, printf("pmap_init: done!\n"));
 }
 
 int
@@ -1210,7 +1178,7 @@ pmap_fault_fixup(pmap_t pm, vm_offset_t 
 	int rv = 0;
 
 	l1idx = L1_IDX(va);
-	vm_page_lock_queues();
+	rw_wlock(&pvh_global_lock);
 	PMAP_LOCK(pm);
 
 	/*
@@ -1374,7 +1342,7 @@ pmap_fault_fixup(pmap_t pm, vm_offset_t 
 	rv = 1;
 
 out:
-	vm_page_unlock_queues();
+	rw_wunlock(&pvh_global_lock);
 	PMAP_UNLOCK(pm);
 	return (rv);
 }
@@ -1682,6 +1650,11 @@ pmap_bootstrap(vm_offset_t firstaddr, vm
 	TAILQ_INIT(&kernel_pmap->pm_pvlist);
 
 	/*
+	 * Initialize the global pv list lock.
+	 */
+	rw_init(&pvh_global_lock, "pmap pv global");
+
+	/*
 	 * Reserve some special page table entries/VA space for temporary
 	 * mapping of pages.
 	 */
@@ -1946,7 +1919,7 @@ pmap_remove_pages(pmap_t pmap)
 	vm_page_t m;
 	pt_entry_t *pt;
 
-	vm_page_lock_queues();
+	rw_wlock(&pvh_global_lock);
 	PMAP_LOCK(pmap);
 	for (pv = TAILQ_FIRST(&pmap->pm_pvlist); pv; pv = npv) {
 		if (pv->pv_flags & PVF_WIRED) {
@@ -1969,7 +1942,7 @@ pmap_remove_pages(pmap_t pmap)
 		pmap_free_pv_entry(pv);
 		pmap_free_l2_bucket(pmap, l2b, 1);
 	}
-	vm_page_unlock_queues();
+	rw_wunlock(&pvh_global_lock);
 	cpu_tlb_flushID();
 	cpu_cpwait();
 	PMAP_UNLOCK(pmap);
@@ -2120,6 +2093,13 @@ pmap_kenter_user(vm_offset_t va, vm_padd
 	pmap_fault_fixup(pmap_kernel(), va, VM_PROT_READ|VM_PROT_WRITE, 1);
 }
 
+vm_paddr_t
+pmap_kextract(vm_offset_t va)
+{
+
+	return (pmap_extract_locked(kernel_pmap, va));
+}
+
 /*
  * remove a page from the kernel pagetables
  */
@@ -2326,8 +2306,7 @@ pmap_remove_all(vm_page_t m)
 
 	if (TAILQ_EMPTY(&m->md.pv_list))
 		return;
-	vm_page_lock_queues();
-	pmap_remove_write(m);
+	rw_wlock(&pvh_global_lock);
 	curpm = vmspace_pmap(curproc->p_vmspace);
 	while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
 		if (flush == FALSE && (pv->pv_pmap == curpm ||
@@ -2338,6 +2317,8 @@ pmap_remove_all(vm_page_t m)
 		l2b = pmap_get_l2_bucket(pv->pv_pmap, pv->pv_va);
 		KASSERT(l2b != NULL, ("No l2 bucket"));
 		ptep = &l2b->l2b_kva[l2pte_index(pv->pv_va)];
+		if (L2_S_WRITABLE(*ptep))
+			vm_page_dirty(m);
 		*ptep = 0;
 		if (pmap_is_current(pv->pv_pmap))
 			PTE_SYNC(ptep);
@@ -2348,6 +2329,7 @@ pmap_remove_all(vm_page_t m)
 		PMAP_UNLOCK(pv->pv_pmap);
 		pmap_free_pv_entry(pv);
 	}
+	m->md.pvh_attrs &= ~(PVF_MOD | PVF_REF);
 
 	if (flush) {
 		if (PV_BEEN_EXECD(flags))
@@ -2356,7 +2338,7 @@ pmap_remove_all(vm_page_t m)
 			cpu_tlb_flushD();
 	}
 	vm_page_aflag_clear(m, PGA_WRITEABLE);
-	vm_page_unlock_queues();
+	rw_wunlock(&pvh_global_lock);
 }
 
 int
@@ -2444,7 +2426,7 @@ pmap_protect(pmap_t pm, vm_offset_t sva,
 		return;
 	}
 
-	vm_page_lock_queues();
+	rw_wlock(&pvh_global_lock);
 	PMAP_LOCK(pm);
 
 	/*
@@ -2506,7 +2488,7 @@ pmap_protect(pmap_t pm, vm_offset_t sva,
 		if (PV_BEEN_REFD(flags))
 			cpu_tlb_flushD();
 	}
-	vm_page_unlock_queues();
+	rw_wunlock(&pvh_global_lock);
 
 	PMAP_UNLOCK(pm);
 }
@@ -2530,15 +2512,15 @@ pmap_enter(pmap_t pmap, vm_offset_t va, 
     vm_prot_t prot, boolean_t wired)
 {
 
-	vm_page_lock_queues();
+	rw_wlock(&pvh_global_lock);
 	PMAP_LOCK(pmap);
 	pmap_enter_locked(pmap, va, m, prot, wired, M_WAITOK);
 	PMAP_UNLOCK(pmap);
-	vm_page_unlock_queues();
+	rw_wunlock(&pvh_global_lock);
 }
 
 /*
- *	The page queues and pmap must be locked.
+ *	The pvh global and pmap locks must be held.
  */
 static void
 pmap_enter_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
@@ -2554,7 +2536,7 @@ pmap_enter_locked(pmap_t pmap, vm_offset
 	u_char user;
 
 	PMAP_ASSERT_LOCKED(pmap);
-	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+	rw_assert(&pvh_global_lock, RA_WLOCKED);
 	if (va == vector_page) {
 		pa = systempage.pv_pa;
 		m = NULL;
@@ -2594,9 +2576,9 @@ do_l2b_alloc:
 		if (l2b == NULL) {
 			if (flags & M_WAITOK) {
 				PMAP_UNLOCK(pmap);
-				vm_page_unlock_queues();
+				rw_wunlock(&pvh_global_lock);
 				VM_WAIT;
-				vm_page_lock_queues();
+				rw_wlock(&pvh_global_lock);
 				PMAP_LOCK(pmap);
 				goto do_l2b_alloc;
 			}
@@ -2789,7 +2771,7 @@ pmap_enter_object(pmap_t pmap, vm_offset
 
 	psize = atop(end - start);
 	m = m_start;
-	vm_page_lock_queues();
+	rw_wlock(&pvh_global_lock);
 	PMAP_LOCK(pmap);
 	while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) {
 		pmap_enter_locked(pmap, start + ptoa(diff), m, prot &
@@ -2797,7 +2779,7 @@ pmap_enter_object(pmap_t pmap, vm_offset
 		m = TAILQ_NEXT(m, listq);
 	}
 	PMAP_UNLOCK(pmap);
-	vm_page_unlock_queues();
+	rw_wunlock(&pvh_global_lock);
 }
 
 /*
@@ -2813,12 +2795,12 @@ void
 pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot)
 {
 
-	vm_page_lock_queues();
+	rw_wlock(&pvh_global_lock);
 	PMAP_LOCK(pmap);
 	pmap_enter_locked(pmap, va, m, prot & (VM_PROT_READ | VM_PROT_EXECUTE),
 	    FALSE, M_NOWAIT);
 	PMAP_UNLOCK(pmap);
-	vm_page_unlock_queues();
+	rw_wunlock(&pvh_global_lock);
 }
 
 /*
@@ -2835,7 +2817,7 @@ pmap_change_wiring(pmap_t pmap, vm_offse
 	pt_entry_t *ptep, pte;
 	vm_page_t pg;
 
-	vm_page_lock_queues();
+	rw_wlock(&pvh_global_lock);
 	PMAP_LOCK(pmap);
 	l2b = pmap_get_l2_bucket(pmap, va);
 	KASSERT(l2b, ("No l2b bucket in pmap_change_wiring"));
@@ -2844,7 +2826,7 @@ pmap_change_wiring(pmap_t pmap, vm_offse
 	pg = PHYS_TO_VM_PAGE(l2pte_pa(pte));
 	if (pg)
 		pmap_modify_pv(pg, pmap, va, PVF_WIRED, wired);
-	vm_page_unlock_queues();
+	rw_wunlock(&pvh_global_lock);
 	PMAP_UNLOCK(pmap);
 }
 
@@ -2870,22 +2852,34 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pm
  *		with the given map/virtual_address pair.
  */
 vm_paddr_t
-pmap_extract(pmap_t pm, vm_offset_t va)
+pmap_extract(pmap_t pmap, vm_offset_t va)
+{
+	vm_paddr_t pa;
+
+	PMAP_LOCK(pmap);
+	pa = pmap_extract_locked(pmap, va);
+	PMAP_UNLOCK(pmap);
+	return (pa);
+}
+
+static vm_paddr_t
+pmap_extract_locked(pmap_t pmap, vm_offset_t va)
 {
 	struct l2_dtable *l2;
 	pd_entry_t l1pd;
 	pt_entry_t *ptep, pte;
 	vm_paddr_t pa;
 	u_int l1idx;
-	l1idx = L1_IDX(va);
 
-	PMAP_LOCK(pm);
-	l1pd = pm->pm_l1->l1_kva[l1idx];
+	if (pmap != kernel_pmap)
+		PMAP_ASSERT_LOCKED(pmap);
+	l1idx = L1_IDX(va);
+	l1pd = pmap->pm_l1->l1_kva[l1idx];
 	if (l1pte_section_p(l1pd)) {
 		/*
-		 * These should only happen for pmap_kernel()
+		 * These should only happen for the kernel pmap.
 		 */
-		KASSERT(pm == pmap_kernel(), ("huh"));
+		KASSERT(pmap == kernel_pmap, ("unexpected section"));
 		/* XXX: what to do about the bits > 32 ? */
 		if (l1pd & L1_S_SUPERSEC)
 			pa = (l1pd & L1_SUP_FRAME) | (va & L1_SUP_OFFSET);
@@ -2897,34 +2891,22 @@ pmap_extract(pmap_t pm, vm_offset_t va)
 		 * descriptor as an indication that a mapping exists.
 		 * We have to look it up in the L2 dtable.
 		 */
-		l2 = pm->pm_l2[L2_IDX(l1idx)];
-
+		l2 = pmap->pm_l2[L2_IDX(l1idx)];
 		if (l2 == NULL ||
-		    (ptep = l2->l2_bucket[L2_BUCKET(l1idx)].l2b_kva) == NULL) {
-			PMAP_UNLOCK(pm);
+		    (ptep = l2->l2_bucket[L2_BUCKET(l1idx)].l2b_kva) == NULL)
 			return (0);
-		}
-
-		ptep = &ptep[l2pte_index(va)];
-		pte = *ptep;
-
-		if (pte == 0) {
-			PMAP_UNLOCK(pm);
+		pte = ptep[l2pte_index(va)];
+		if (pte == 0)
 			return (0);
-		}
-
 		switch (pte & L2_TYPE_MASK) {
 		case L2_TYPE_L:
 			pa = (pte & L2_L_FRAME) | (va & L2_L_OFFSET);
 			break;
-
 		default:
 			pa = (pte & L2_S_FRAME) | (va & L2_S_OFFSET);
 			break;
 		}
 	}
-
-	PMAP_UNLOCK(pm);
 	return (pa);
 }
 
@@ -3091,7 +3073,7 @@ pmap_remove(pmap_t pm, vm_offset_t sva, 
 	 * we lock in the pmap => pv_head direction
 	 */
 
-	vm_page_lock_queues();
+	rw_wlock(&pvh_global_lock);
 	PMAP_LOCK(pm);
 	total = 0;
 	while (sva < eva) {
@@ -3170,7 +3152,7 @@ pmap_remove(pmap_t pm, vm_offset_t sva, 
 		pmap_free_l2_bucket(pm, l2b, mappings);
 	}
 
-	vm_page_unlock_queues();
+	rw_wunlock(&pvh_global_lock);
 	if (flushall)
 		cpu_tlb_flushID();
 	PMAP_UNLOCK(pm);
@@ -3323,7 +3305,7 @@ pmap_page_exists_quick(pmap_t pmap, vm_p
 	KASSERT((m->oflags & VPO_UNMANAGED) == 0,
 	    ("pmap_page_exists_quick: page %p is not managed", m));
 	rv = FALSE;
-	vm_page_lock_queues();
+	rw_wlock(&pvh_global_lock);
 	TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
 		if (pv->pv_pmap == pmap) {
 			rv = TRUE;
@@ -3334,7 +3316,7 @@ pmap_page_exists_quick(pmap_t pmap, vm_p
 			break;
 	}
 
-	vm_page_unlock_queues();
+	rw_wunlock(&pvh_global_lock);
 	return (rv);
 }
 
@@ -3353,11 +3335,11 @@ pmap_page_wired_mappings(vm_page_t m)
 	count = 0;
 	if ((m->flags & PG_FICTITIOUS) != 0)

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***

From owner-svn-src-user@FreeBSD.ORG  Sat Oct 20 09:28:38 2012
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52])
 by hub.freebsd.org (Postfix) with ESMTP id 8CF8859F;
 Sat, 20 Oct 2012 09:28:38 +0000 (UTC)
 (envelope-from gavin@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c])
 by mx1.freebsd.org (Postfix) with ESMTP id 575C58FC12;
 Sat, 20 Oct 2012 09:28:38 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
 by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q9K9ScqL096884;
 Sat, 20 Oct 2012 09:28:38 GMT (envelope-from gavin@svn.freebsd.org)
Received: (from gavin@localhost)
 by svn.freebsd.org (8.14.4/8.14.4/Submit) id q9K9Sci2096883;
 Sat, 20 Oct 2012 09:28:38 GMT (envelope-from gavin@svn.freebsd.org)
Message-Id: <201210200928.q9K9Sci2096883@svn.freebsd.org>
From: Gavin Atkinson <gavin@FreeBSD.org>
Date: Sat, 20 Oct 2012 09:28:38 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
Subject: svn commit: r241771 - user/gavin
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.14
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
 src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/options/svn-src-user>,
 <mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
 <mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Sat, 20 Oct 2012 09:28:38 -0000

Author: gavin
Date: Sat Oct 20 09:28:37 2012
New Revision: 241771
URL: http://svn.freebsd.org/changeset/base/241771

Log:
  Create user area

Added:
  user/gavin/