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