Home | History | Annotate | Line # | Download | only in kern
kern_softint.c revision 1.3.2.1
      1  1.3.2.1  bouyer /*	$NetBSD: kern_softint.c,v 1.3.2.1 2007/11/13 16:02:11 bouyer Exp $	*/
      2      1.2      ad 
      3      1.2      ad /*-
      4      1.2      ad  * Copyright (c) 2007 The NetBSD Foundation, Inc.
      5      1.2      ad  * All rights reserved.
      6      1.2      ad  *
      7      1.2      ad  * This code is derived from software contributed to The NetBSD Foundation
      8      1.2      ad  * by Andrew Doran.
      9      1.2      ad  *
     10      1.2      ad  * Redistribution and use in source and binary forms, with or without
     11      1.2      ad  * modification, are permitted provided that the following conditions
     12      1.2      ad  * are met:
     13      1.2      ad  * 1. Redistributions of source code must retain the above copyright
     14      1.2      ad  *    notice, this list of conditions and the following disclaimer.
     15      1.2      ad  * 2. Redistributions in binary form must reproduce the above copyright
     16      1.2      ad  *    notice, this list of conditions and the following disclaimer in the
     17      1.2      ad  *    documentation and/or other materials provided with the distribution.
     18      1.2      ad  * 3. All advertising materials mentioning features or use of this software
     19      1.2      ad  *    must display the following acknowledgement:
     20      1.2      ad  *	This product includes software developed by the NetBSD
     21      1.2      ad  *	Foundation, Inc. and its contributors.
     22      1.2      ad  * 4. Neither the name of The NetBSD Foundation nor the names of its
     23      1.2      ad  *    contributors may be used to endorse or promote products derived
     24      1.2      ad  *    from this software without specific prior written permission.
     25      1.2      ad  *
     26      1.2      ad  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     27      1.2      ad  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     28      1.2      ad  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     29      1.2      ad  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     30      1.2      ad  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     31      1.2      ad  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     32      1.2      ad  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     33      1.2      ad  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     34      1.2      ad  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     35      1.2      ad  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     36      1.2      ad  * POSSIBILITY OF SUCH DAMAGE.
     37      1.2      ad  */
     38      1.2      ad 
     39      1.2      ad /*
     40      1.2      ad  * Stub for code to be merged from the vmlocking CVS branch.
     41      1.2      ad  */
     42      1.2      ad 
     43      1.2      ad #include <sys/cdefs.h>
     44  1.3.2.1  bouyer __KERNEL_RCSID(0, "$NetBSD: kern_softint.c,v 1.3.2.1 2007/11/13 16:02:11 bouyer Exp $");
     45      1.2      ad 
     46      1.2      ad #include <sys/param.h>
     47      1.2      ad #include <sys/intr.h>
     48      1.2      ad 
     49      1.3      ad u_int	softint_timing;
     50      1.3      ad 
     51      1.2      ad /*
     52      1.2      ad  * softint_init:
     53      1.2      ad  *
     54      1.2      ad  *	Initialize per-CPU data structures.  Called from mi_cpu_attach().
     55      1.2      ad  */
     56      1.2      ad void
     57      1.2      ad softint_init(struct cpu_info *ci)
     58      1.2      ad {
     59      1.2      ad 
     60      1.2      ad 	/* nothing yet */
     61      1.2      ad }
     62      1.2      ad 
     63      1.2      ad /*
     64      1.2      ad  * softint_establish:
     65      1.2      ad  *
     66      1.2      ad  *	Register a software interrupt handler.
     67      1.2      ad  */
     68      1.2      ad void *
     69      1.2      ad softint_establish(u_int flags, void (*func)(void *), void *arg)
     70      1.2      ad {
     71      1.2      ad 	u_int level;
     72      1.2      ad 
     73      1.2      ad 	level = (flags & SOFTINT_LVLMASK);
     74      1.2      ad 	KASSERT(level < SOFTINT_COUNT);
     75      1.2      ad 
     76      1.2      ad 	switch (level) {
     77      1.2      ad 	case SOFTINT_CLOCK:
     78      1.2      ad 		level = IPL_SOFTCLOCK;
     79      1.2      ad 		break;
     80      1.2      ad 	case SOFTINT_NET:
     81      1.2      ad 	case SOFTINT_BIO:
     82      1.2      ad 		level = IPL_SOFTNET;
     83      1.2      ad 		break;
     84      1.2      ad 	case SOFTINT_SERIAL:
     85      1.2      ad #ifdef IPL_SOFTSERIAL
     86      1.2      ad 		level = IPL_SOFTSERIAL;
     87      1.2      ad #else
     88      1.2      ad 		level = IPL_SOFTNET;
     89      1.2      ad #endif
     90      1.2      ad 		break;
     91      1.2      ad 	default:
     92      1.2      ad 		panic("softint_establish");
     93      1.2      ad 	}
     94      1.2      ad 
     95      1.2      ad 	return softintr_establish(level, func, arg);
     96      1.2      ad }
     97      1.2      ad 
     98      1.2      ad /*
     99      1.2      ad  * softint_disestablish:
    100      1.2      ad  *
    101      1.2      ad  *	Unregister a software interrupt handler.
    102      1.2      ad  */
    103      1.2      ad void
    104      1.2      ad softint_disestablish(void *arg)
    105      1.2      ad {
    106      1.2      ad 
    107      1.2      ad 	softintr_disestablish(arg);
    108      1.2      ad }
    109      1.2      ad 
    110      1.2      ad /*
    111      1.2      ad  * softint_schedule:
    112      1.2      ad  *
    113      1.2      ad  *	Trigger a software interrupt.  Must be called from a hardware
    114      1.2      ad  *	interrupt handler, or with preemption disabled (since we are
    115      1.2      ad  *	using the value of curcpu()).
    116      1.2      ad  */
    117      1.2      ad void
    118      1.2      ad softint_schedule(void *arg)
    119      1.2      ad {
    120      1.2      ad 
    121      1.2      ad 	softintr_schedule(arg);
    122      1.2      ad }
    123      1.2      ad 
    124      1.2      ad /*
    125      1.2      ad  * softint_block:
    126      1.2      ad  *
    127      1.2      ad  *	Update statistics when the soft interrupt blocks.
    128      1.2      ad  */
    129      1.2      ad void
    130      1.2      ad softint_block(lwp_t *l)
    131      1.2      ad {
    132      1.2      ad 
    133      1.2      ad 	/* nothing yet */
    134      1.2      ad }
    135  1.3.2.1  bouyer 
    136  1.3.2.1  bouyer /*
    137  1.3.2.1  bouyer  * softint_picklwp:
    138  1.3.2.1  bouyer  *
    139  1.3.2.1  bouyer  *	Slow path: called from mi_switch() to pick the highest priority
    140  1.3.2.1  bouyer  *	soft interrupt LWP that needs to run.
    141  1.3.2.1  bouyer  */
    142  1.3.2.1  bouyer lwp_t *
    143  1.3.2.1  bouyer softint_picklwp(void)
    144  1.3.2.1  bouyer {
    145  1.3.2.1  bouyer 
    146  1.3.2.1  bouyer 	panic("softint_picklwp");
    147  1.3.2.1  bouyer }
    148  1.3.2.1  bouyer 
    149  1.3.2.1  bouyer /*
    150  1.3.2.1  bouyer  * softint_overlay:
    151  1.3.2.1  bouyer  *
    152  1.3.2.1  bouyer  *	Slow path: called from lwp_userret() to run a soft interrupt
    153  1.3.2.1  bouyer  *	within the context of a user thread.  If the LWP blocks,
    154  1.3.2.1  bouyer  *	priority will be elevated in sched_kpri().
    155  1.3.2.1  bouyer  */
    156  1.3.2.1  bouyer void
    157  1.3.2.1  bouyer softint_overlay(void)
    158  1.3.2.1  bouyer {
    159  1.3.2.1  bouyer 
    160  1.3.2.1  bouyer 	panic("softint_overlay");
    161  1.3.2.1  bouyer }
    162  1.3.2.1  bouyer 
    163  1.3.2.1  bouyer /*
    164  1.3.2.1  bouyer  * softint_kpri:
    165  1.3.2.1  bouyer  *
    166  1.3.2.1  bouyer  *	Adjust priority for a blocking user LWP that is handling a
    167  1.3.2.1  bouyer  *	soft interrupt.
    168  1.3.2.1  bouyer  */
    169  1.3.2.1  bouyer pri_t
    170  1.3.2.1  bouyer softint_kpri(lwp_t *l)
    171  1.3.2.1  bouyer {
    172  1.3.2.1  bouyer 
    173  1.3.2.1  bouyer 	/* No point doing anything more fair / complicated. */
    174  1.3.2.1  bouyer 	return PRI_SOFTSERIAL;
    175  1.3.2.1  bouyer }
    176