Date: Tue, 22 Oct 2013 09:43:14 +0000 (UTC) From: Alexander Motin <mav@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: 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 ... Message-ID: <201310220943.r9M9hEAQ075300@svn.freebsd.org>
index | next in thread | raw e-mail
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 ***help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201310220943.r9M9hEAQ075300>
