svn commit: r256881 - in projects/camlock: bin/sh contrib/binutils/gas/config contrib/gcclibs/libssp etc etc/rc.d lib/libc/sys lib/libutil share/man/man4 sys/arm/allwinner sys/arm/broadcom/bcm2835 ...

Alexander Motin mav at FreeBSD.org
Tue Oct 22 09:43:20 UTC 2013


Author: mav
Date: Tue Oct 22 09:43:14 2013
New Revision: 256881
URL: http://svnweb.freebsd.org/changeset/base/256881

Log:
  MFC @ r256880

Added:
     - copied unchanged from r256880, head/sys/dev/fdt/fdt_ic_if.m
Directory Properties:
  projects/camlock/sys/dev/fdt/fdt_ic_if.m   (props changed)
Deleted:
  projects/camlock/share/man/man4/isf.4
  projects/camlock/sys/dev/isf/
  projects/camlock/usr.sbin/isfctl/
Modified:
  projects/camlock/bin/sh/miscbltin.c
  projects/camlock/contrib/binutils/gas/config/tc-mips.c
  projects/camlock/contrib/binutils/gas/config/tc-mips.h
  projects/camlock/contrib/gcclibs/libssp/ssp.c
  projects/camlock/etc/login.conf
  projects/camlock/etc/netstart
  projects/camlock/etc/rc.d/rtadvd
  projects/camlock/lib/libc/sys/getrlimit.2
  projects/camlock/lib/libutil/login_class.3
  projects/camlock/lib/libutil/login_class.c
  projects/camlock/share/man/man4/Makefile
  projects/camlock/sys/arm/allwinner/a10_wdog.c
  projects/camlock/sys/arm/broadcom/bcm2835/bcm2835_wdog.c
  projects/camlock/sys/conf/files
  projects/camlock/sys/dev/drm2/i915/i915_drv.c
  projects/camlock/sys/dev/fdt/fdt_common.c
  projects/camlock/sys/dev/fdt/fdt_common.h
  projects/camlock/sys/dev/fdt/simplebus.c
  projects/camlock/sys/dev/ofw/ofw_fdt.c
  projects/camlock/sys/dev/xen/netback/netback.c
  projects/camlock/sys/kern/kern_event.c
  projects/camlock/sys/kern/kern_resource.c
  projects/camlock/sys/kern/subr_taskqueue.c
  projects/camlock/sys/kern/uipc_syscalls.c
  projects/camlock/sys/mips/conf/BERI_DE4.hints
  projects/camlock/sys/mips/conf/BERI_DE4_MDROOT
  projects/camlock/sys/mips/conf/BERI_DE4_SDROOT
  projects/camlock/sys/powerpc/booke/pmap.c
  projects/camlock/sys/powerpc/ofw/ofw_pci.c
  projects/camlock/sys/powerpc/ofw/ofw_pci.h
  projects/camlock/sys/powerpc/powerpc/nexus.c
  projects/camlock/sys/sys/eventvar.h
  projects/camlock/sys/sys/resource.h
  projects/camlock/sys/sys/resourcevar.h
  projects/camlock/sys/ufs/ffs/ffs_softdep.c
  projects/camlock/sys/ufs/ffs/ffs_vfsops.c
  projects/camlock/usr.bin/limits/limits.c
  projects/camlock/usr.bin/procstat/procstat_rlimit.c
  projects/camlock/usr.sbin/Makefile
Directory Properties:
  projects/camlock/   (props changed)
  projects/camlock/contrib/binutils/   (props changed)
  projects/camlock/lib/libc/   (props changed)
  projects/camlock/lib/libutil/   (props changed)
  projects/camlock/share/man/man4/   (props changed)
  projects/camlock/sys/   (props changed)
  projects/camlock/sys/conf/   (props changed)
  projects/camlock/usr.bin/procstat/   (props changed)

Modified: projects/camlock/bin/sh/miscbltin.c
==============================================================================
--- projects/camlock/bin/sh/miscbltin.c	Tue Oct 22 08:22:19 2013	(r256880)
+++ projects/camlock/bin/sh/miscbltin.c	Tue Oct 22 09:43:14 2013	(r256881)
@@ -405,6 +405,9 @@ static const struct limits limits[] = {
 #ifdef RLIMIT_NPTS
 	{ "pseudo-terminals",	(char *)0,	RLIMIT_NPTS,	   1, 'p' },
 #endif
+#ifdef RLIMIT_KQUEUES
+	{ "kqueues",		(char *)0,	RLIMIT_KQUEUES,	   1, 'k' },
+#endif
 	{ (char *) 0,		(char *)0,	0,		   0, '\0' }
 };
 
@@ -421,7 +424,7 @@ ulimitcmd(int argc __unused, char **argv
 	struct rlimit	limit;
 
 	what = 'f';
-	while ((optc = nextopt("HSatfdsmcnuvlbpw")) != '\0')
+	while ((optc = nextopt("HSatfdsmcnuvlbpwk")) != '\0')
 		switch (optc) {
 		case 'H':
 			how = HARD;

Modified: projects/camlock/contrib/binutils/gas/config/tc-mips.c
==============================================================================
--- projects/camlock/contrib/binutils/gas/config/tc-mips.c	Tue Oct 22 08:22:19 2013	(r256880)
+++ projects/camlock/contrib/binutils/gas/config/tc-mips.c	Tue Oct 22 09:43:14 2013	(r256881)
@@ -15420,21 +15420,6 @@ MIPS options:\n\
 -mno-octeon-useun generate MIPS unaligned load/store instructions\n"));
 }
 
-enum dwarf2_format
-mips_dwarf2_format (void)
-{
-  if (HAVE_64BIT_SYMBOLS)
-    {
-#ifdef TE_IRIX
-      return dwarf2_format_64bit_irix;
-#else
-      return dwarf2_format_64bit;
-#endif
-    }
-  else
-    return dwarf2_format_32bit;
-}
-
 int
 mips_dwarf2_addr_size (void)
 {

Modified: projects/camlock/contrib/binutils/gas/config/tc-mips.h
==============================================================================
--- projects/camlock/contrib/binutils/gas/config/tc-mips.h	Tue Oct 22 08:22:19 2013	(r256880)
+++ projects/camlock/contrib/binutils/gas/config/tc-mips.h	Tue Oct 22 09:43:14 2013	(r256881)
@@ -155,10 +155,6 @@ extern void mips_emit_delays (void);
 extern void mips_enable_auto_align (void);
 #define md_elf_section_change_hook()	mips_enable_auto_align()
 
-enum dwarf2_format;
-extern enum dwarf2_format mips_dwarf2_format (void);
-#define DWARF2_FORMAT() mips_dwarf2_format ()
-
 extern int mips_dwarf2_addr_size (void);
 #define DWARF2_ADDR_SIZE(bfd) mips_dwarf2_addr_size ()
 

Modified: projects/camlock/contrib/gcclibs/libssp/ssp.c
==============================================================================
--- projects/camlock/contrib/gcclibs/libssp/ssp.c	Tue Oct 22 08:22:19 2013	(r256880)
+++ projects/camlock/contrib/gcclibs/libssp/ssp.c	Tue Oct 22 09:43:14 2013	(r256881)
@@ -128,7 +128,7 @@ fail (const char *msg1, size_t msg1len, 
 #ifdef HAVE_SYSLOG_H
   /* Only send the error to syslog if there was no tty available.  */
   else
-    syslog (LOG_CRIT, msg3);
+    syslog (LOG_CRIT, "%s", msg3);
 #endif /* HAVE_SYSLOG_H */
 
   /* Try very hard to exit.  Note that signals may be blocked preventing

Modified: projects/camlock/etc/login.conf
==============================================================================
--- projects/camlock/etc/login.conf	Tue Oct 22 08:22:19 2013	(r256880)
+++ projects/camlock/etc/login.conf	Tue Oct 22 09:43:14 2013	(r256881)
@@ -42,6 +42,7 @@ default:\
 	:vmemoryuse=unlimited:\
 	:swapuse=unlimited:\
 	:pseudoterminals=unlimited:\
+	:kqueues=unlimited:\
 	:priority=0:\
 	:ignoretime@:\
 	:umask=022:

Modified: projects/camlock/etc/netstart
==============================================================================
--- projects/camlock/etc/netstart	Tue Oct 22 08:22:19 2013	(r256880)
+++ projects/camlock/etc/netstart	Tue Oct 22 09:43:14 2013	(r256881)
@@ -59,6 +59,7 @@ _start=quietstart
 /etc/rc.d/route6d ${_start}
 /etc/rc.d/mrouted ${_start}
 /etc/rc.d/routed ${_start}
+/etc/rc.d/rtsold ${_start}
 /etc/rc.d/nisdomain ${_start}
 
 exit 0

Modified: projects/camlock/etc/rc.d/rtadvd
==============================================================================
--- projects/camlock/etc/rc.d/rtadvd	Tue Oct 22 08:22:19 2013	(r256880)
+++ projects/camlock/etc/rc.d/rtadvd	Tue Oct 22 09:43:14 2013	(r256881)
@@ -14,6 +14,8 @@
 name="rtadvd"
 rcvar="rtadvd_enable"
 command="/usr/sbin/${name}"
+extra_commands="reload"
+reload_cmd="rtadvd_reload"
 start_precmd="rtadvd_precmd"
 
 rtadvd_precmd()
@@ -62,5 +64,9 @@ rtadvd_precmd()
 	return 0
 }
 
+rtadvd_reload() {
+	/usr/sbin/rtadvctl reload
+}
+
 load_rc_config $name
 run_rc_command "$1"

Modified: projects/camlock/lib/libc/sys/getrlimit.2
==============================================================================
--- projects/camlock/lib/libc/sys/getrlimit.2	Tue Oct 22 08:22:19 2013	(r256880)
+++ projects/camlock/lib/libc/sys/getrlimit.2	Tue Oct 22 09:43:14 2013	(r256881)
@@ -108,6 +108,8 @@ Please see
 for a complete description of this sysctl.
 .It Dv RLIMIT_NPTS
 The maximum number of pseudo-terminals created by this user id.
+.It Dv RLIMIT_KQUEUES
+The maximum number of kqueues created by this user id.
 .El
 .Pp
 A resource limit is specified as a soft limit and a hard limit.

Modified: projects/camlock/lib/libutil/login_class.3
==============================================================================
--- projects/camlock/lib/libutil/login_class.3	Tue Oct 22 08:22:19 2013	(r256880)
+++ projects/camlock/lib/libutil/login_class.3	Tue Oct 22 09:43:14 2013	(r256881)
@@ -118,6 +118,7 @@ sbsize           RLIMIT_SBSIZE
 vmemoryuse       RLIMIT_VMEM
 pseudoterminals  RLIMIT_NPTS
 swapuse          RLIMIT_SWAP
+kqueues          RLIMIT_KQUEUES
 .Ed
 .It LOGIN_SETPRIORITY
 Set the scheduling priority for the current process based on the

Modified: projects/camlock/lib/libutil/login_class.c
==============================================================================
--- projects/camlock/lib/libutil/login_class.c	Tue Oct 22 08:22:19 2013	(r256880)
+++ projects/camlock/lib/libutil/login_class.c	Tue Oct 22 09:43:14 2013	(r256881)
@@ -66,6 +66,7 @@ static struct login_res {
     { "vmemoryuse",      login_getcapsize, RLIMIT_VMEM    },
     { "pseudoterminals", login_getcapnum,  RLIMIT_NPTS    },
     { "swapuse",         login_getcapsize, RLIMIT_SWAP    },
+    { "kqueues",         login_getcapsize, RLIMIT_KQUEUES },
     { NULL,              0,                0              }
 };
 

Modified: projects/camlock/share/man/man4/Makefile
==============================================================================
--- projects/camlock/share/man/man4/Makefile	Tue Oct 22 08:22:19 2013	(r256880)
+++ projects/camlock/share/man/man4/Makefile	Tue Oct 22 09:43:14 2013	(r256881)
@@ -196,7 +196,6 @@ MAN=	aac.4 \
 	ipwfw.4 \
 	isci.4 \
 	iscsi_initiator.4 \
-	isf.4 \
 	isp.4 \
 	ispfw.4 \
 	iwi.4 \

Modified: projects/camlock/sys/arm/allwinner/a10_wdog.c
==============================================================================
--- projects/camlock/sys/arm/allwinner/a10_wdog.c	Tue Oct 22 08:22:19 2013	(r256880)
+++ projects/camlock/sys/arm/allwinner/a10_wdog.c	Tue Oct 22 09:43:14 2013	(r256881)
@@ -150,6 +150,18 @@ a10wd_watchdog_fn(void *private, u_int c
 			    (wd_intervals[i].value << WDOG_MODE_INTVL_SHIFT) |
 			    WDOG_MODE_EN | WDOG_MODE_RST_EN);
 			WRITE(sc, WDOG_CTRL, WDOG_CTRL_RESTART);
+			*error = 0;
+		}
+		else {
+			/* 
+			 * Can't arm
+			 * disable watchdog as watchdog(9) requires
+			 */
+			device_printf(sc->dev,
+			    "Can't arm, timeout is more than 16 sec\n");
+			mtx_unlock(&sc->mtx);
+			WRITE(sc, WDOG_MODE, 0);
+			return;
 		}
 	}
 	else

Modified: projects/camlock/sys/arm/broadcom/bcm2835/bcm2835_wdog.c
==============================================================================
--- projects/camlock/sys/arm/broadcom/bcm2835/bcm2835_wdog.c	Tue Oct 22 08:22:19 2013	(r256880)
+++ projects/camlock/sys/arm/broadcom/bcm2835/bcm2835_wdog.c	Tue Oct 22 09:43:14 2013	(r256881)
@@ -76,11 +76,10 @@ struct bcmwd_softc {
 	int			wdog_armed;
 	int			wdog_period;
 	char			wdog_passwd;
+	struct mtx		mtx;
 };
 
-#ifdef notyet
 static void bcmwd_watchdog_fn(void *private, u_int cmd, int *error);
-#endif
 
 static int
 bcmwd_probe(device_t dev)
@@ -120,19 +119,59 @@ bcmwd_attach(device_t dev)
 	sc->bsh = rman_get_bushandle(sc->res);
 
 	bcmwd_lsc = sc;
-#ifdef notyet
+	mtx_init(&sc->mtx, "BCM2835 Watchdog", "bcmwd", MTX_DEF);
 	EVENTHANDLER_REGISTER(watchdog_list, bcmwd_watchdog_fn, sc, 0);
-#endif
+
 	return (0);
 }
 
-#ifdef notyet
 static void
 bcmwd_watchdog_fn(void *private, u_int cmd, int *error)
 {
-	/* XXX: not yet */
+	struct bcmwd_softc *sc;
+	uint64_t sec;
+	uint32_t ticks, reg;
+
+	sc = private;
+	mtx_lock(&sc->mtx);
+
+	cmd &= WD_INTERVAL;
+
+	if (cmd > 0) {
+		sec = ((uint64_t)1 << (cmd & WD_INTERVAL)) / 1000000000;
+		ticks = (sec << 16) & BCM2835_WDOG_TIME_MASK;
+		if (ticks == 0) {
+			/* 
+			 * Can't arm
+			 * disable watchdog as watchdog(9) requires
+			 */
+			device_printf(sc->dev,
+			    "Can't arm, timeout is less than 1 second\n");
+			WRITE(sc, BCM2835_RSTC_REG, 
+			    (BCM2835_PASWORD << BCM2835_PASSWORD_SHIFT) |
+			    BCM2835_RSTC_RESET);
+			mtx_unlock(&sc->mtx);
+			return;
+		}
+
+		reg = (BCM2835_PASWORD << BCM2835_PASSWORD_SHIFT) | ticks;
+		WRITE(sc, BCM2835_WDOG_REG, reg);
+
+		reg = READ(sc, BCM2835_RSTC_REG);
+		reg &= BCM2835_RSTC_WRCFG_CLR;
+		reg |= BCM2835_RSTC_WRCFG_FULL_RESET;
+		reg |= (BCM2835_PASWORD << BCM2835_PASSWORD_SHIFT);
+		WRITE(sc, BCM2835_RSTC_REG, reg);
+
+		*error = 0;
+	}
+	else
+		WRITE(sc, BCM2835_RSTC_REG, 
+		    (BCM2835_PASWORD << BCM2835_PASSWORD_SHIFT) |
+		    BCM2835_RSTC_RESET);
+
+	mtx_unlock(&sc->mtx);
 }
-#endif
 
 void
 bcmwd_watchdog_reset()

Modified: projects/camlock/sys/conf/files
==============================================================================
--- projects/camlock/sys/conf/files	Tue Oct 22 08:22:19 2013	(r256880)
+++ projects/camlock/sys/conf/files	Tue Oct 22 09:43:14 2013	(r256881)
@@ -1401,6 +1401,7 @@ dev/exca/exca.c			optional cbb
 dev/fatm/if_fatm.c		optional fatm pci
 dev/fb/splash.c			optional splash
 dev/fdt/fdt_common.c		optional fdt
+dev/fdt/fdt_ic_if.m		optional fdt
 dev/fdt/fdt_pci.c		optional fdt pci
 dev/fdt/fdt_slicer.c		optional fdt cfi | fdt nand
 dev/fdt/fdt_static_dtb.S	optional fdt fdt_dtb_static \
@@ -1540,9 +1541,6 @@ dev/iscsi_initiator/isc_cam.c	optional i
 dev/iscsi_initiator/isc_soc.c	optional iscsi_initiator scbus
 dev/iscsi_initiator/isc_sm.c	optional iscsi_initiator scbus
 dev/iscsi_initiator/isc_subr.c	optional iscsi_initiator scbus
-dev/isf/isf.c			optional isf
-dev/isf/isf_fdt.c		optional isf fdt
-dev/isf/isf_nexus.c		optional isf
 dev/isp/isp.c			optional isp
 dev/isp/isp_freebsd.c		optional isp
 dev/isp/isp_library.c		optional isp

Modified: projects/camlock/sys/dev/drm2/i915/i915_drv.c
==============================================================================
--- projects/camlock/sys/dev/drm2/i915/i915_drv.c	Tue Oct 22 08:22:19 2013	(r256880)
+++ projects/camlock/sys/dev/drm2/i915/i915_drv.c	Tue Oct 22 09:43:14 2013	(r256881)
@@ -685,7 +685,7 @@ gen6_do_reset(struct drm_device *dev, u8
 
 	/* Spin waiting for the device to ack the reset request */
 	ret = _intel_wait_for(dev,
-	    (I915_READ(GEN6_GDRST) & GEN6_GRDOM_FULL) == 0,
+	    (I915_READ_NOTRACE(GEN6_GDRST) & GEN6_GRDOM_FULL) == 0,
 	    500, 1, "915rst");
 
 	/* If reset with a user forcewake, try to restore, otherwise turn it off */

Modified: projects/camlock/sys/dev/fdt/fdt_common.c
==============================================================================
--- projects/camlock/sys/dev/fdt/fdt_common.c	Tue Oct 22 08:22:19 2013	(r256880)
+++ projects/camlock/sys/dev/fdt/fdt_common.c	Tue Oct 22 09:43:14 2013	(r256881)
@@ -63,6 +63,8 @@ vm_paddr_t fdt_immr_pa;
 vm_offset_t fdt_immr_va;
 vm_offset_t fdt_immr_size;
 
+struct fdt_ic_list fdt_ic_list_head = SLIST_HEAD_INITIALIZER(fdt_ic_list_head);
+
 int
 fdt_get_range(phandle_t node, int range_id, u_long *base, u_long *size)
 {

Modified: projects/camlock/sys/dev/fdt/fdt_common.h
==============================================================================
--- projects/camlock/sys/dev/fdt/fdt_common.h	Tue Oct 22 08:22:19 2013	(r256880)
+++ projects/camlock/sys/dev/fdt/fdt_common.h	Tue Oct 22 09:43:14 2013	(r256881)
@@ -70,6 +70,13 @@ struct fdt_fixup_entry {
 };
 extern struct fdt_fixup_entry fdt_fixup_table[];
 
+extern SLIST_HEAD(fdt_ic_list, fdt_ic) fdt_ic_list_head;
+struct fdt_ic {
+	SLIST_ENTRY(fdt_ic)	fdt_ics;
+	ihandle_t		iph;
+	device_t		dev;
+};
+
 extern vm_paddr_t fdt_immr_pa;
 extern vm_offset_t fdt_immr_va;
 extern vm_offset_t fdt_immr_size;

Copied: projects/camlock/sys/dev/fdt/fdt_ic_if.m (from r256880, head/sys/dev/fdt/fdt_ic_if.m)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/camlock/sys/dev/fdt/fdt_ic_if.m	Tue Oct 22 09:43:14 2013	(r256881, copy of r256880, head/sys/dev/fdt/fdt_ic_if.m)
@@ -0,0 +1,266 @@
+#-
+# Copyright (c) 2013 SRI International
+# Copyright (c) 1998-2004 Doug Rabson
+# 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.
+#
+# $FreeBSD$
+#
+
+#include <sys/types.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+
+/**
+ * @defgroup FST_IC fdt_ic - KObj methods for interrupt controllers
+ * @brief A set of methods required device drivers that are interrupt
+ * controllers.  Derived from sys/kern/bus_if.m.
+ * @{
+ */
+INTERFACE fdt_ic;
+
+/**
+ * @brief Allocate an interrupt resource
+ *
+ * This method is called by child devices of an interrupt controller to
+ * allocate an interrup. The meaning of the resource-ID field varies
+ * from bus to bus and is opaque to the interrupt controller. If a
+ * resource was allocated and the caller did not use the RF_ACTIVE
+ * to specify that it should be activated immediately, the caller is
+ * responsible for calling FDT_IC_ACTIVATE_INTR() when it actually uses
+ * the interupt.
+ *
+ * @param _dev		the interrupt-parent device of @p _child
+ * @param _child	the device which is requesting an allocation
+ * @param _rid		a pointer to the resource identifier
+ * @param _irq		interrupt source to allocate
+ * @param _flags	any extra flags to control the resource
+ *			allocation - see @c RF_XXX flags in
+ *			<sys/rman.h> for details
+ * 
+ * @returns		the interrupt which was allocated or @c NULL if no
+ *			resource could be allocated
+ */
+METHOD struct resource * alloc_intr {
+	device_t	_dev;
+	device_t	_child;
+	int	       *_rid;
+	u_long		_irq;
+	u_int		_flags;
+};
+
+/**
+ * @brief Activate an interrupt
+ *
+ * Activate an interrupt previously allocated with FDT_IC_ALLOC_INTR().
+ *
+ * @param _dev		the parent device of @p _child
+ * @param _r		interrupt to activate
+ */
+METHOD int activate_intr {
+	device_t	_dev;
+	struct resource *_r;
+};
+
+/**
+ * @brief Deactivate an interrupt
+ *
+ * Deactivate a resource previously allocated with FDT_IC_ALLOC_INTR().
+ *
+ * @param _dev		the parent device of @p _child
+ * @param _r		the interrupt to deactivate
+ */
+METHOD int deactivate_intr {
+	device_t	_dev;
+	struct resource *_r;
+};
+
+/**
+ * @brief Release an interrupt
+ *
+ * Free an interupt allocated by the FDT_IC_ALLOC_INTR.
+ *
+ * @param _dev		the parent device of @p _child
+ * @param _r		the resource to release
+ */
+METHOD int release_intr {
+	device_t	_dev;
+	struct resource *_res;
+};
+
+/**
+ * @brief Install an interrupt handler
+ *
+ * This method is used to associate an interrupt handler function with
+ * an irq resource. When the interrupt triggers, the function @p _intr
+ * will be called with the value of @p _arg as its single
+ * argument. The value returned in @p *_cookiep is used to cancel the
+ * interrupt handler - the caller should save this value to use in a
+ * future call to FDT_IC_TEARDOWN_INTR().
+ * 
+ * @param _dev		the interrupt-parent device of @p _child
+ * @param _child	the device which allocated the resource
+ * @param _irq		the resource representing the interrupt
+ * @param _flags	a set of bits from enum intr_type specifying
+ *			the class of interrupt
+ * @param _intr		the function to call when the interrupt
+ *			triggers
+ * @param _arg		a value to use as the single argument in calls
+ *			to @p _intr
+ * @param _cookiep	a pointer to a location to recieve a cookie
+ *			value that may be used to remove the interrupt
+ *			handler
+ */
+METHOD int setup_intr {
+	device_t	_dev;
+	device_t	_child;
+	struct resource *_irq;
+	int		_flags;
+	driver_filter_t	*_filter;
+	driver_intr_t	*_intr;
+	void		*_arg;
+	void		**_cookiep;
+};
+
+/**
+ * @brief Uninstall an interrupt handler
+ *
+ * This method is used to disassociate an interrupt handler function
+ * with an irq resource. The value of @p _cookie must be the value
+ * returned from a previous call to FDT_IC_SETUP_INTR().
+ * 
+ * @param _dev		the interrupt-parent device of @p _child
+ * @param _child	the device which allocated the resource
+ * @param _irq		the resource representing the interrupt
+ * @param _cookie	the cookie value returned when the interrupt
+ *			was originally registered
+ */
+METHOD int teardown_intr {
+	device_t	_dev;
+	device_t	_child;
+	struct resource	*_irq;
+	void		*_cookie;
+};
+
+/**
+ * @brief Allow drivers to request that an interrupt be bound to a specific
+ * CPU.
+ * 
+ * @param _dev		the interrupt-parent device of @p _child
+ * @param _child	the device which allocated the resource
+ * @param _irq		the resource representing the interrupt
+ * @param _cpu		the CPU to bind the interrupt to
+ */
+METHOD int bind_intr {
+	device_t	_dev;
+	device_t	_child;
+	struct resource *_irq;
+	int		_cpu;
+};
+
+/**
+ * @brief Allow drivers to specify the trigger mode and polarity
+ * of the specified interrupt.
+ * 
+ * @param _dev		the interrupt-parent device
+ * @param _irq		the interrupt number to modify
+ * @param _trig		the trigger mode required
+ * @param _pol		the interrupt polarity required
+ */
+METHOD int config_intr {
+	device_t	_dev;
+	int		_irq;
+	enum intr_trigger _trig;
+	enum intr_polarity _pol;
+};
+
+/**
+ * @brief Allow drivers to associate a description with an active
+ * interrupt handler.
+ *
+ * @param _dev		the interrupt-parent device of @p _child
+ * @param _child	the device which allocated the resource
+ * @param _irq		the resource representing the interrupt
+ * @param _cookie	the cookie value returned when the interrupt
+ *			was originally registered
+ * @param _descr	the description to associate with the interrupt
+ */
+METHOD int describe_intr {
+	device_t	_dev;
+	device_t	_child;
+	struct resource *_irq;
+	void		*_cookie;
+	const char	*_descr;
+};
+
+/**
+ * @brief Notify an ic that specified child's IRQ should be remapped.
+ *
+ * @param _dev		the interrupt-parent device
+ * @param _child	the child device
+ * @param _irq		the irq number
+ */
+METHOD int remap_intr {
+	device_t	_dev;
+	device_t	_child;
+	u_int		_irq;
+};
+
+/**
+ * @brief Enable an IPI source.
+ *
+ * @param _dev		the interrupt controller
+ * @param _tid		the thread ID (relative to the interrupt controller)
+ *			to enable IPIs for
+ * @param _ipi_irq	hardware IRQ to send IPIs to
+ */
+METHOD void setup_ipi {
+	device_t	_dev;
+	u_int		_tid;
+	u_int		_irq;
+};
+
+/**
+ * @brief Send an IPI to the specified thread.
+ *
+ * @param _dev		the interrupt controller
+ * @param _tid		the thread ID (relative to the interrupt controller)
+ *			to send IPIs to
+ */
+METHOD void send_ipi {
+	device_t	_dev;
+	u_int		_tid;
+};
+
+/**
+ * @brief Clear the IPI on the specfied thread.  Only call with the
+ * local hardware thread or interrupts may be lost!
+ *
+ * @param _dev		the interrupt controller
+ * @param _tid		the thread ID (relative to the interrupt controller)
+ *			to clear the IPI on
+ */
+METHOD void clear_ipi {
+	device_t	_dev;
+	u_int		_tid;
+};

Modified: projects/camlock/sys/dev/fdt/simplebus.c
==============================================================================
--- projects/camlock/sys/dev/fdt/simplebus.c	Tue Oct 22 08:22:19 2013	(r256880)
+++ projects/camlock/sys/dev/fdt/simplebus.c	Tue Oct 22 09:43:14 2013	(r256881)
@@ -47,6 +47,7 @@ __FBSDID("$FreeBSD$");
 #include <dev/ofw/openfirm.h>
 
 #include "fdt_common.h"
+#include "fdt_ic_if.h"
 #include "ofw_bus_if.h"
 
 #ifdef DEBUG
@@ -80,9 +81,18 @@ static int simplebus_attach(device_t);
 static int simplebus_print_child(device_t, device_t);
 static int simplebus_setup_intr(device_t, device_t, struct resource *, int,
     driver_filter_t *, driver_intr_t *, void *, void **);
+static int simplebus_teardown_intr(device_t, device_t, struct resource *,
+    void *);
 
+static int simplebus_activate_resource(device_t, device_t, int, int,
+    struct resource *);
 static struct resource *simplebus_alloc_resource(device_t, device_t, int,
     int *, u_long, u_long, u_long, u_int);
+static int simplebus_deactivate_resource(device_t, device_t, int, int,
+    struct resource *);
+static int simplebus_release_resource(device_t, device_t, int, int,
+    struct resource *);
+static device_t simplebus_get_interrupt_parent(device_t);
 static struct resource_list *simplebus_get_resource_list(device_t, device_t);
 
 static ofw_bus_get_devinfo_t simplebus_get_devinfo;
@@ -102,11 +112,11 @@ static device_method_t simplebus_methods
 	/* Bus interface */
 	DEVMETHOD(bus_print_child,	simplebus_print_child),
 	DEVMETHOD(bus_alloc_resource,	simplebus_alloc_resource),
-	DEVMETHOD(bus_release_resource,	bus_generic_release_resource),
-	DEVMETHOD(bus_activate_resource, bus_generic_activate_resource),
-	DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
+	DEVMETHOD(bus_release_resource,	simplebus_release_resource),
+	DEVMETHOD(bus_activate_resource, simplebus_activate_resource),
+	DEVMETHOD(bus_deactivate_resource, simplebus_deactivate_resource),
 	DEVMETHOD(bus_setup_intr,	simplebus_setup_intr),
-	DEVMETHOD(bus_teardown_intr,	bus_generic_teardown_intr),
+	DEVMETHOD(bus_teardown_intr,	simplebus_teardown_intr),
 	DEVMETHOD(bus_get_resource_list, simplebus_get_resource_list),
 
 	/* OFW bus interface */
@@ -217,6 +227,7 @@ simplebus_attach(device_t dev)
 static int
 simplebus_print_child(device_t dev, device_t child)
 {
+	device_t ip;
 	struct simplebus_devinfo *di;
 	struct resource_list *rl;
 	int rv;
@@ -228,6 +239,8 @@ simplebus_print_child(device_t dev, devi
 	rv += bus_print_child_header(dev, child);
 	rv += resource_list_print_type(rl, "mem", SYS_RES_MEMORY, "%#lx");
 	rv += resource_list_print_type(rl, "irq", SYS_RES_IRQ, "%ld");
+	if ((ip = simplebus_get_interrupt_parent(child)) != NULL)
+		rv += printf(" (%s)", device_get_nameunit(ip));
 	rv += bus_print_child_footer(dev, child);
 
 	return (rv);
@@ -237,6 +250,7 @@ static struct resource *
 simplebus_alloc_resource(device_t bus, device_t child, int type, int *rid,
     u_long start, u_long end, u_long count, u_int flags)
 {
+	device_t ic;
 	struct simplebus_devinfo *di;
 	struct resource_list_entry *rle;
 
@@ -263,10 +277,53 @@ simplebus_alloc_resource(device_t bus, d
 		count = rle->count;
 	}
 
+	if (type == SYS_RES_IRQ &&
+	    (ic = simplebus_get_interrupt_parent(child)) != NULL)
+		return(FDT_IC_ALLOC_INTR(ic, child, rid, start, flags));
+
 	return (bus_generic_alloc_resource(bus, child, type, rid, start, end,
 	    count, flags));
 }
 
+static int
+simplebus_activate_resource(device_t dev, device_t child, int type, int rid,
+    struct resource *r)
+{
+	device_t ic;
+
+	if (type == SYS_RES_IRQ &&
+	    (ic = simplebus_get_interrupt_parent(child)) != NULL)
+		return (FDT_IC_ACTIVATE_INTR(ic, r));
+
+	return (bus_generic_activate_resource(dev, child, type, rid, r));
+}
+
+static int
+simplebus_deactivate_resource(device_t dev, device_t child, int type, int rid,
+    struct resource *r)
+{
+	device_t ic;
+
+	if (type == SYS_RES_IRQ &&
+	    (ic = simplebus_get_interrupt_parent(child)) != NULL)
+		return (FDT_IC_DEACTIVATE_INTR(ic, r));
+
+	return (bus_generic_deactivate_resource(dev, child, type, rid, r));
+}
+
+static int
+simplebus_release_resource(device_t dev, device_t child, int type, int rid,
+    struct resource *r)
+{
+	device_t ic;
+
+	if (type == SYS_RES_IRQ &&
+	    (ic = simplebus_get_interrupt_parent(child)) != NULL)
+		return (FDT_IC_RELEASE_INTR(ic, r));
+
+	return (bus_generic_release_resource(dev, child, type, rid, r));
+}
+
 static struct resource_list *
 simplebus_get_resource_list(device_t bus, device_t child)
 {
@@ -276,15 +333,45 @@ simplebus_get_resource_list(device_t bus
 	return (&di->di_res);
 }
 
+static device_t
+simplebus_get_interrupt_parent(device_t dev)
+{
+	struct simplebus_devinfo *di;
+	struct fdt_ic *ic;
+	device_t ip;
+	ihandle_t iph;
+	phandle_t ph;
+
+	ip = NULL;
+
+	di = device_get_ivars(dev);
+	if (di == NULL)
+		return (NULL);
+
+	if (OF_getprop(di->di_ofw.obd_node, "interrupt-parent", &iph,
+	    sizeof(iph)) > 0) {
+		iph = fdt32_to_cpu(iph);
+		ph = OF_instance_to_package(iph);
+		SLIST_FOREACH(ic, &fdt_ic_list_head, fdt_ics) {
+			if (ic->iph == ph) {
+				ip = ic->dev;
+				break;
+			}
+		}
+	}
+	return (ip);
+}
+
 static int
 simplebus_setup_intr(device_t bus, device_t child, struct resource *res,
     int flags, driver_filter_t *filter, driver_intr_t *ihand, void *arg,
     void **cookiep)
 {
 	struct simplebus_devinfo *di;
+	device_t ic;
 	enum intr_trigger trig;
 	enum intr_polarity pol;
-	int error, rid;
+	int error, irq, rid;
 
 	di = device_get_ivars(child);
 	if (di == NULL)
@@ -297,20 +384,41 @@ simplebus_setup_intr(device_t bus, devic
 	if (rid >= DI_MAX_INTR_NUM)
 		return (ENOENT);
 
+	ic = simplebus_get_interrupt_parent(child);
+
 	trig = di->di_intr_sl[rid].trig;
 	pol = di->di_intr_sl[rid].pol;
 	if (trig != INTR_TRIGGER_CONFORM || pol != INTR_POLARITY_CONFORM) {
-		error = bus_generic_config_intr(bus, rman_get_start(res),
-		    trig, pol);
+		irq = rman_get_start(res);
+		if (ic != NULL)
+			error = FDT_IC_CONFIG_INTR(ic, irq, trig, pol);
+		else
+			error = bus_generic_config_intr(bus, irq, trig, pol);
 		if (error)
 			return (error);
 	}
 
-	error = bus_generic_setup_intr(bus, child, res, flags, filter, ihand,
-	    arg, cookiep);
+	if (ic != NULL)
+		error = FDT_IC_SETUP_INTR(ic, child, res, flags, filter,
+		    ihand, arg, cookiep);
+	else
+		error = bus_generic_setup_intr(bus, child, res, flags, filter,
+		    ihand, arg, cookiep);
 	return (error);
 }
 
+static int
+simplebus_teardown_intr(device_t bus, device_t child, struct resource *res,
+    void *cookie)
+{
+	device_t ic;
+
+	if ((ic = simplebus_get_interrupt_parent(child)) != NULL)
+		return (FDT_IC_TEARDOWN_INTR(ic, child, res, cookie));
+
+	return (bus_generic_teardown_intr(bus, child, res, cookie));
+}
+
 static const struct ofw_bus_devinfo *
 simplebus_get_devinfo(device_t bus, device_t child)
 {

Modified: projects/camlock/sys/dev/ofw/ofw_fdt.c
==============================================================================
--- projects/camlock/sys/dev/ofw/ofw_fdt.c	Tue Oct 22 08:22:19 2013	(r256880)
+++ projects/camlock/sys/dev/ofw/ofw_fdt.c	Tue Oct 22 09:43:14 2013	(r256881)
@@ -329,7 +329,7 @@ fdt_nextprop(int offset, char *buf, size
 			depth = -1;
 	} while (depth >= 0);
 
-	return (-1);
+	return (0);
 }
 
 /*

Modified: projects/camlock/sys/dev/xen/netback/netback.c
==============================================================================
--- projects/camlock/sys/dev/xen/netback/netback.c	Tue Oct 22 08:22:19 2013	(r256880)
+++ projects/camlock/sys/dev/xen/netback/netback.c	Tue Oct 22 09:43:14 2013	(r256881)
@@ -2191,8 +2191,8 @@ static int
 xnb_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
 {
 	struct xnb_softc *xnb = ifp->if_softc;
-#ifdef INET
 	struct ifreq *ifr = (struct ifreq*) data;
+#ifdef INET
 	struct ifaddr *ifa = (struct ifaddr*)data;
 #endif
 	int error = 0;

Modified: projects/camlock/sys/kern/kern_event.c
==============================================================================
--- projects/camlock/sys/kern/kern_event.c	Tue Oct 22 08:22:19 2013	(r256880)
+++ projects/camlock/sys/kern/kern_event.c	Tue Oct 22 09:43:14 2013	(r256881)
@@ -53,6 +53,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/eventvar.h>
 #include <sys/poll.h>
 #include <sys/protosw.h>
+#include <sys/resourcevar.h>
 #include <sys/sigio.h>
 #include <sys/signalvar.h>
 #include <sys/socket.h>
@@ -699,9 +700,23 @@ sys_kqueue(struct thread *td, struct kqu
 	struct filedesc *fdp;
 	struct kqueue *kq;
 	struct file *fp;
+	struct proc *p;
+	struct ucred *cred;
 	int fd, error;
 
-	fdp = td->td_proc->p_fd;
+	p = td->td_proc;
+	cred = td->td_ucred;
+	crhold(cred);
+	PROC_LOCK(p);
+	if (!chgkqcnt(cred->cr_ruidinfo, 1, lim_cur(td->td_proc,
+	    RLIMIT_KQUEUES))) {
+		PROC_UNLOCK(p);
+		crfree(cred);
+		return (EMFILE);
+	}
+	PROC_UNLOCK(p);
+
+	fdp = p->p_fd;
 	error = falloc(td, &fp, &fd, 0);
 	if (error)
 		goto done2;
@@ -711,6 +726,7 @@ sys_kqueue(struct thread *td, struct kqu
 	mtx_init(&kq->kq_lock, "kqueue", NULL, MTX_DEF|MTX_DUPOK);
 	TAILQ_INIT(&kq->kq_head);
 	kq->kq_fdp = fdp;
+	kq->kq_cred = cred;
 	knlist_init_mtx(&kq->kq_sel.si_note, &kq->kq_lock);
 	TASK_INIT(&kq->kq_task, 0, kqueue_task, kq);
 
@@ -723,6 +739,10 @@ sys_kqueue(struct thread *td, struct kqu
 
 	td->td_retval[0] = fd;
 done2:
+	if (error != 0) {
+		chgkqcnt(cred->cr_ruidinfo, -1, 0);
+		crfree(cred);
+	}
 	return (error);
 }
 
@@ -1767,6 +1787,8 @@ kqueue_close(struct file *fp, struct thr
 		free(kq->kq_knlist, M_KQUEUE);
 
 	funsetown(&kq->kq_sigio);
+	chgkqcnt(kq->kq_cred->cr_ruidinfo, -1, 0);
+	crfree(kq->kq_cred);
 	free(kq, M_KQUEUE);
 	fp->f_data = NULL;
 

Modified: projects/camlock/sys/kern/kern_resource.c
==============================================================================
--- projects/camlock/sys/kern/kern_resource.c	Tue Oct 22 08:22:19 2013	(r256880)
+++ projects/camlock/sys/kern/kern_resource.c	Tue Oct 22 09:43:14 2013	(r256881)
@@ -1432,3 +1432,21 @@ chgptscnt(uip, diff, max)
 	}
 	return (1);
 }
+
+int
+chgkqcnt(struct uidinfo *uip, int diff, rlim_t max)
+{
+
+	if (diff > 0 && max != 0) {
+		if (atomic_fetchadd_long(&uip->ui_kqcnt, (long)diff) +
+		    diff > max) {
+			atomic_subtract_long(&uip->ui_kqcnt, (long)diff);
+			return (0);
+		}
+	} else {
+		atomic_add_long(&uip->ui_kqcnt, (long)diff);
+		if (uip->ui_kqcnt < 0)
+			printf("negative kqcnt for uid = %d\n", uip->ui_uid);
+	}
+	return (1);
+}

Modified: projects/camlock/sys/kern/subr_taskqueue.c
==============================================================================
--- projects/camlock/sys/kern/subr_taskqueue.c	Tue Oct 22 08:22:19 2013	(r256880)
+++ projects/camlock/sys/kern/subr_taskqueue.c	Tue Oct 22 09:43:14 2013	(r256881)
@@ -237,6 +237,7 @@ taskqueue_enqueue_locked(struct taskqueu
 	if ((queue->tq_flags & TQ_FLAGS_UNLOCKED_ENQUEUE) == 0)
 		TQ_UNLOCK(queue);
 
+	/* Return with lock released. */
 	return (0);
 }
 int
@@ -246,6 +247,7 @@ taskqueue_enqueue(struct taskqueue *queu
 
 	TQ_LOCK(queue);
 	res = taskqueue_enqueue_locked(queue, task);
+	/* The lock is released inside. */
 
 	return (res);
 }
@@ -262,6 +264,7 @@ taskqueue_timeout_func(void *arg)
 	timeout_task->f &= ~DT_CALLOUT_ARMED;
 	queue->tq_callouts--;
 	taskqueue_enqueue_locked(timeout_task->q, &timeout_task->t);
+	/* The lock is released inside. */
 }
 
 int
@@ -278,6 +281,7 @@ taskqueue_enqueue_timeout(struct taskque
 	res = timeout_task->t.ta_pending;
 	if (ticks == 0) {
 		taskqueue_enqueue_locked(queue, &timeout_task->t);
+		/* The lock is released inside. */
 	} else {
 		if ((timeout_task->f & DT_CALLOUT_ARMED) != 0) {
 			res++;

Modified: projects/camlock/sys/kern/uipc_syscalls.c
==============================================================================
--- projects/camlock/sys/kern/uipc_syscalls.c	Tue Oct 22 08:22:19 2013	(r256880)
+++ projects/camlock/sys/kern/uipc_syscalls.c	Tue Oct 22 09:43:14 2013	(r256881)
@@ -2070,7 +2070,8 @@ free_page:
 	}
 	KASSERT(error != 0 || (m->wire_count > 0 &&
 	    vm_page_is_valid(m, off & PAGE_MASK, xfsize)),
-	    ("wrong page state m %p", m));
+	    ("wrong page state m %p off %#jx xfsize %d", m, (uintmax_t)off,
+	    xfsize));
 	VM_OBJECT_WUNLOCK(obj);
 	return (error);
 }

Modified: projects/camlock/sys/mips/conf/BERI_DE4.hints
==============================================================================
--- projects/camlock/sys/mips/conf/BERI_DE4.hints	Tue Oct 22 08:22:19 2013	(r256880)
+++ projects/camlock/sys/mips/conf/BERI_DE4.hints	Tue Oct 22 09:43:14 2013	(r256881)
@@ -55,7 +55,6 @@ hint.altera_avgen.0.devname="berirom"
 
 #
 # Expose the DE4 flash via an Avalon "generic" device.
-# This is incompatible with the isf(4) driver.
 #
 #hint.altera_avgen.0.at="nexus0"
 #hint.altera_avgen.0.maddr=0x74000000
@@ -74,38 +73,3 @@ hint.altera_avgen.0.msize=2
 hint.altera_avgen.0.width=1
 hint.altera_avgen.0.fileio="r"
 hint.altera_avgen.0.devname="de4bsw"
-
-#
-# General Intel StrataFlash driver
-#
-hint.isf.0.at="nexus0"
-hint.isf.0.maddr=0x74000000
-hint.isf.0.msize=0x2000000
-hint.isf.1.at="nexus0"
-hint.isf.1.maddr=0x76000000
-hint.isf.1.msize=0x2000000
-
-# Reserved configuration blocks.  Don't touch.
-hint.map.0.at="isf0"
-hint.map.0.start=0x00000000
-hint.map.0.end=0x00020000
-hint.map.0.name="config"
-hint.map.0.readonly=1
-
-# Hardwired location of bitfile
-hint.map.1.at="isf0"
-hint.map.1.start=0x00020000
-hint.map.1.end=0x01820000
-hint.map.1.name="fpga"
-
-# Kernel on first chip
-hint.map.2.at="isf0"
-hint.map.2.start=0x01820000
-hint.map.2.end=0x02000000
-hint.map.2.name="reserved"
-
-# The second chip
-hint.map.3.at="isf1"
-hint.map.3.start=0x00000000
-hint.map.3.end=0x02000000

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


More information about the svn-src-projects mailing list