From owner-svn-src-user@FreeBSD.ORG Sun Oct 14 20:00:01 2012 Return-Path: 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" 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 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" 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 +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 +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: 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 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: regexshort_explanationexplanation +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: 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 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: regexshort_explanationexplanation -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: 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 ; 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 ; Wed, 17 Oct 2012 23:51:48 +0000 (UTC) Received: by mail-pa0-f54.google.com with SMTP id bi1so8283762pad.13 for ; 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 Date: Wed, 17 Oct 2012 19:51:18 -0400 X-Google-Sender-Auth: 35cxcH-goDllZUxAB6x75OzkP3I Message-ID: Subject: Re: svn commit: r241647 - user/crees/rclint To: Chris Rees 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 17 Oct 2012 23:51:52 -0000 more fun! On 17 October 2012 16:17, Chris Rees 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: 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 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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%%,,<%%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: 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 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 #include #include +#include #include #include #include +#include #include #include +#include #include #include #include +#include #include #include #include @@ -164,12 +168,9 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include -#include -#include + #include -#include #include #include #include @@ -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: 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 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 " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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/