1 /* $NetBSD: x86_softintr.c,v 1.4 2022/09/07 00:40:19 knakahara Exp $ */ 2 3 /* 4 * Copyright (c) 2007, 2008, 2009, 2019 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, and by Jason R. Thorpe. 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 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 /* 33 * Copyright 2002 (c) Wasabi Systems, Inc. 34 * All rights reserved. 35 * 36 * Written by Frank van der Linden for Wasabi Systems, Inc. 37 * 38 * Redistribution and use in source and binary forms, with or without 39 * modification, are permitted provided that the following conditions 40 * are met: 41 * 1. Redistributions of source code must retain the above copyright 42 * notice, this list of conditions and the following disclaimer. 43 * 2. Redistributions in binary form must reproduce the above copyright 44 * notice, this list of conditions and the following disclaimer in the 45 * documentation and/or other materials provided with the distribution. 46 * 3. All advertising materials mentioning features or use of this software 47 * must display the following acknowledgement: 48 * This product includes software developed for the NetBSD Project by 49 * Wasabi Systems, Inc. 50 * 4. The name of Wasabi Systems, Inc. may not be used to endorse 51 * or promote products derived from this software without specific prior 52 * written permission. 53 * 54 * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND 55 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 56 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 57 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC 58 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 59 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 60 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 61 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 62 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 63 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 64 * POSSIBILITY OF SUCH DAMAGE. 65 */ 66 67 /*- 68 * Copyright (c) 1991 The Regents of the University of California. 69 * All rights reserved. 70 * 71 * This code is derived from software contributed to Berkeley by 72 * William Jolitz. 73 * 74 * Redistribution and use in source and binary forms, with or without 75 * modification, are permitted provided that the following conditions 76 * are met: 77 * 1. Redistributions of source code must retain the above copyright 78 * notice, this list of conditions and the following disclaimer. 79 * 2. Redistributions in binary form must reproduce the above copyright 80 * notice, this list of conditions and the following disclaimer in the 81 * documentation and/or other materials provided with the distribution. 82 * 3. Neither the name of the University nor the names of its contributors 83 * may be used to endorse or promote products derived from this software 84 * without specific prior written permission. 85 * 86 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 87 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 88 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 89 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 90 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 91 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 92 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 93 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 94 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 95 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 96 * SUCH DAMAGE. 97 * 98 * @(#)isa.c 7.2 (Berkeley) 5/13/91 99 */ 100 101 /*- 102 * Copyright (c) 1993, 1994 Charles Hannum. 103 * 104 * Redistribution and use in source and binary forms, with or without 105 * modification, are permitted provided that the following conditions 106 * are met: 107 * 1. Redistributions of source code must retain the above copyright 108 * notice, this list of conditions and the following disclaimer. 109 * 2. Redistributions in binary form must reproduce the above copyright 110 * notice, this list of conditions and the following disclaimer in the 111 * documentation and/or other materials provided with the distribution. 112 * 3. All advertising materials mentioning features or use of this software 113 * must display the following acknowledgement: 114 * This product includes software developed by the University of 115 * California, Berkeley and its contributors. 116 * 4. Neither the name of the University nor the names of its contributors 117 * may be used to endorse or promote products derived from this software 118 * without specific prior written permission. 119 * 120 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 121 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 122 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 123 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 124 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 125 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 126 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 127 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 128 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 129 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 130 * SUCH DAMAGE. 131 * 132 * @(#)isa.c 7.2 (Berkeley) 5/13/91 133 */ 134 135 #include <sys/cdefs.h> 136 __KERNEL_RCSID(0, "$NetBSD: x86_softintr.c,v 1.4 2022/09/07 00:40:19 knakahara Exp $"); 137 138 #include <sys/kmem.h> 139 #include <sys/proc.h> 140 #include <sys/intr.h> 141 142 struct pic softintr_pic = { 143 .pic_name = "softintr_fakepic", 144 .pic_type = PIC_SOFT, 145 .pic_vecbase = 0, 146 .pic_apicid = 0, 147 .pic_lock = __SIMPLELOCK_UNLOCKED, 148 }; 149 150 /* 151 * Recalculate the interrupt masks from scratch. 152 * During early boot, anything goes and we are always called on the BP. 153 * When the system is up and running: 154 * 155 * => called with ci == curcpu() 156 * => cpu_lock held by the initiator 157 * => interrupts disabled on-chip (PSL_I) 158 * 159 * Do not call printf(), kmem_free() or other "heavyweight" routines 160 * from here. This routine must be quick and must not block. 161 */ 162 void 163 x86_intr_calculatemasks(struct cpu_info *ci) 164 { 165 uint64_t unusedirqs, intrlevel[MAX_INTR_SOURCES]; 166 int irq, level; 167 struct intrhand *q; 168 169 /* First, figure out which levels each IRQ uses. */ 170 unusedirqs = UINT64_MAX; 171 for (irq = 0; irq < MAX_INTR_SOURCES; irq++) { 172 int levels = 0; 173 174 if (ci->ci_isources[irq] == NULL) { 175 intrlevel[irq] = 0; 176 continue; 177 } 178 for (q = ci->ci_isources[irq]->is_handlers; q; q = q->ih_next) 179 levels |= 1 << q->ih_level; 180 intrlevel[irq] = levels; 181 if (levels) 182 unusedirqs &= ~(1ULL << irq); 183 } 184 185 /* Then figure out which IRQs use each level. */ 186 for (level = 0; level < NIPL; level++) { 187 uint64_t irqs = 0; 188 for (irq = 0; irq < MAX_INTR_SOURCES; irq++) 189 if (intrlevel[irq] & (1ULL << level)) 190 irqs |= 1ULL << irq; 191 ci->ci_imask[level] = irqs | unusedirqs; 192 } 193 194 for (level = 0; level<(NIPL-1); level++) 195 ci->ci_imask[level+1] |= ci->ci_imask[level]; 196 197 for (irq = 0; irq < MAX_INTR_SOURCES; irq++) { 198 int maxlevel = IPL_NONE; 199 int minlevel = IPL_HIGH; 200 201 if (ci->ci_isources[irq] == NULL) 202 continue; 203 for (q = ci->ci_isources[irq]->is_handlers; q; 204 q = q->ih_next) { 205 if (q->ih_level < minlevel) 206 minlevel = q->ih_level; 207 if (q->ih_level > maxlevel) 208 maxlevel = q->ih_level; 209 } 210 ci->ci_isources[irq]->is_maxlevel = maxlevel; 211 ci->ci_isources[irq]->is_minlevel = minlevel; 212 } 213 214 for (level = 0; level < NIPL; level++) 215 ci->ci_iunmask[level] = ~ci->ci_imask[level]; 216 } 217 218 219 220 #if defined(__HAVE_PREEMPTION) 221 struct intrhand fake_preempt_intrhand; 222 223 void 224 x86_init_preempt(struct cpu_info *ci) 225 { 226 struct intrsource *isp; 227 228 isp = kmem_zalloc(sizeof(*isp), KM_SLEEP); 229 isp->is_recurse = Xrecurse_preempt; 230 isp->is_resume = Xresume_preempt; 231 fake_preempt_intrhand.ih_pic = &softintr_pic; 232 fake_preempt_intrhand.ih_level = IPL_PREEMPT; 233 isp->is_handlers = &fake_preempt_intrhand; 234 isp->is_pic = &softintr_pic; 235 ci->ci_isources[SIR_PREEMPT] = isp; 236 } 237 #endif 238 239 #if defined(__HAVE_FAST_SOFTINTS) 240 struct intrhand fake_softclock_intrhand; 241 struct intrhand fake_softnet_intrhand; 242 struct intrhand fake_softserial_intrhand; 243 struct intrhand fake_softbio_intrhand; 244 245 void 246 softint_init_md(lwp_t *l, u_int level, uintptr_t *machdep) 247 { 248 struct intrsource *isp; 249 struct cpu_info *ci; 250 u_int sir; 251 252 ci = l->l_cpu; 253 254 isp = kmem_zalloc(sizeof(*isp), KM_SLEEP); 255 isp->is_recurse = Xsoftintr; 256 isp->is_resume = Xsoftintr; 257 isp->is_pic = &softintr_pic; 258 259 switch (level) { 260 case SOFTINT_BIO: 261 sir = SIR_BIO; 262 fake_softbio_intrhand.ih_pic = &softintr_pic; 263 fake_softbio_intrhand.ih_level = IPL_SOFTBIO; 264 isp->is_handlers = &fake_softbio_intrhand; 265 break; 266 case SOFTINT_NET: 267 sir = SIR_NET; 268 fake_softnet_intrhand.ih_pic = &softintr_pic; 269 fake_softnet_intrhand.ih_level = IPL_SOFTNET; 270 isp->is_handlers = &fake_softnet_intrhand; 271 break; 272 case SOFTINT_SERIAL: 273 sir = SIR_SERIAL; 274 fake_softserial_intrhand.ih_pic = &softintr_pic; 275 fake_softserial_intrhand.ih_level = IPL_SOFTSERIAL; 276 isp->is_handlers = &fake_softserial_intrhand; 277 break; 278 case SOFTINT_CLOCK: 279 sir = SIR_CLOCK; 280 fake_softclock_intrhand.ih_pic = &softintr_pic; 281 fake_softclock_intrhand.ih_level = IPL_SOFTCLOCK; 282 isp->is_handlers = &fake_softclock_intrhand; 283 break; 284 default: 285 panic("softint_init_md"); 286 } 287 288 KASSERT(ci->ci_isources[sir] == NULL); 289 290 *machdep = (1 << sir); 291 ci->ci_isources[sir] = isp; 292 ci->ci_isources[sir]->is_lwp = l; 293 294 x86_intr_calculatemasks(ci); 295 } 296 #endif /* __HAVE_FAST_SOFTINTS */ 297