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