The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/i386/isa/intr_machdep.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (c) 1991 The Regents of the University of California.
    3  * All rights reserved.
    4  *
    5  * Redistribution and use in source and binary forms, with or without
    6  * modification, are permitted provided that the following conditions
    7  * are met:
    8  * 1. Redistributions of source code must retain the above copyright
    9  *    notice, this list of conditions and the following disclaimer.
   10  * 2. Redistributions in binary form must reproduce the above copyright
   11  *    notice, this list of conditions and the following disclaimer in the
   12  *    documentation and/or other materials provided with the distribution.
   13  * 3. All advertising materials mentioning features or use of this software
   14  *    must display the following acknowledgement:
   15  *      This product includes software developed by the University of
   16  *      California, Berkeley and its contributors.
   17  * 4. Neither the name of the University nor the names of its contributors
   18  *    may be used to endorse or promote products derived from this software
   19  *    without specific prior written permission.
   20  *
   21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   31  * SUCH DAMAGE.
   32  *
   33  * $FreeBSD$
   34  */
   35 
   36 #ifndef _I386_ISA_INTR_MACHDEP_H_
   37 #define _I386_ISA_INTR_MACHDEP_H_
   38 
   39 /*
   40  * Low level interrupt code.
   41  */ 
   42 
   43 #ifdef _KERNEL
   44 
   45 #if defined(SMP) || defined(APIC_IO)
   46 /*
   47  * XXX FIXME: rethink location for all IPI vectors.
   48  */
   49 
   50 /*
   51     APIC TPR priority vector levels:
   52 
   53         0xff (255) +-------------+
   54                    |             | 15 (IPIs: Xspuriousint)
   55         0xf0 (240) +-------------+
   56                    |             | 14
   57         0xe0 (224) +-------------+
   58                    |             | 13
   59         0xd0 (208) +-------------+
   60                    |             | 12
   61         0xc0 (192) +-------------+
   62                    |             | 11
   63         0xb0 (176) +-------------+
   64                    |             | 10 (IPIs: Xcpustop)
   65         0xa0 (160) +-------------+
   66                    |             |  9 (IPIs: Xinvltlb)
   67         0x90 (144) +-------------+
   68                    |             |  8 (linux/BSD syscall, IGNORE FAST HW INTS)
   69         0x80 (128) +-------------+
   70                    |             |  7 (FAST_INTR 16-23)
   71         0x70 (112) +-------------+
   72                    |             |  6 (FAST_INTR 0-15)
   73         0x60 (96)  +-------------+
   74                    |             |  5 (IGNORE HW INTS)
   75         0x50 (80)  +-------------+
   76                    |             |  4 (2nd IO APIC)
   77         0x40 (64)  +------+------+
   78                    |      |      |  3 (upper APIC hardware INTs: PCI)
   79         0x30 (48)  +------+------+
   80                    |             |  2 (start of hardware INTs: ISA)
   81         0x20 (32)  +-------------+
   82                    |             |  1 (exceptions, traps, etc.)
   83         0x10 (16)  +-------------+
   84                    |             |  0 (exceptions, traps, etc.)
   85         0x00 (0)   +-------------+
   86  */
   87 
   88 /* IDT vector base for regular (aka. slow) and fast interrupts */
   89 #define TPR_SLOW_INTS           0x20
   90 #define TPR_FAST_INTS           0x60
   91 
   92 /* blocking values for local APIC Task Priority Register */
   93 #define TPR_BLOCK_HWI           0x4f            /* hardware INTs */
   94 #define TPR_IGNORE_HWI          0x5f            /* ignore INTs */
   95 #define TPR_BLOCK_FHWI          0x7f            /* hardware FAST INTs */
   96 #define TPR_IGNORE_FHWI         0x8f            /* ignore FAST INTs */
   97 #define TPR_BLOCK_XINVLTLB      0x9f            /*  */
   98 #define TPR_BLOCK_XCPUSTOP      0xaf            /*  */
   99 #define TPR_BLOCK_ALL           0xff            /* all INTs */
  100 
  101 
  102 #ifdef TEST_TEST1
  103 /* put a 'fake' HWI in top of APIC prio 0x3x, 32 + 31 = 63 = 0x3f */
  104 #define XTEST1_OFFSET           (ICU_OFFSET + 31)
  105 #endif /** TEST_TEST1 */
  106 
  107 /* TLB shootdowns */
  108 #define XINVLTLB_OFFSET         (ICU_OFFSET + 112)
  109 
  110 #ifdef BETTER_CLOCK
  111 /* inter-cpu clock handling */
  112 #define XCPUCHECKSTATE_OFFSET   (ICU_OFFSET + 113)
  113 #endif
  114 
  115 /* inter-CPU rendezvous */
  116 #define XRENDEZVOUS_OFFSET      (ICU_OFFSET + 114)
  117 
  118 /* IPI to generate an additional software trap at the target CPU */
  119 #define XCPUAST_OFFSET          (ICU_OFFSET +  48)
  120 
  121 /* IPI to signal the CPU holding the ISR lock that another IRQ has appeared */
  122 #define XFORWARD_IRQ_OFFSET     (ICU_OFFSET +  49)
  123 
  124 /* IPI to signal CPUs to stop and wait for another CPU to restart them */
  125 #define XCPUSTOP_OFFSET         (ICU_OFFSET + 128)
  126 
  127 /*
  128  * Note: this vector MUST be xxxx1111, 32 + 223 = 255 = 0xff:
  129  */
  130 #define XSPURIOUSINT_OFFSET     (ICU_OFFSET + 223)
  131 
  132 #endif /* SMP || APIC_IO */
  133 
  134 #ifndef LOCORE
  135 
  136 /*
  137  * Type of the first (asm) part of an interrupt handler.
  138  */
  139 typedef void inthand_t __P((u_int cs, u_int ef, u_int esp, u_int ss));
  140 
  141 #define IDTVEC(name)    __CONCAT(X,name)
  142 
  143 extern u_long *intr_countp[];   /* pointers into intrcnt[] */
  144 extern inthand2_t *intr_handler[];      /* C entry points of intr handlers */
  145 extern u_int intr_mask[];       /* sets of intrs masked during handling of 1 */
  146 extern void *intr_unit[];       /* cookies to pass to intr handlers */
  147 
  148 inthand_t
  149         IDTVEC(fastintr0), IDTVEC(fastintr1),
  150         IDTVEC(fastintr2), IDTVEC(fastintr3),
  151         IDTVEC(fastintr4), IDTVEC(fastintr5),
  152         IDTVEC(fastintr6), IDTVEC(fastintr7),
  153         IDTVEC(fastintr8), IDTVEC(fastintr9),
  154         IDTVEC(fastintr10), IDTVEC(fastintr11),
  155         IDTVEC(fastintr12), IDTVEC(fastintr13),
  156         IDTVEC(fastintr14), IDTVEC(fastintr15);
  157 inthand_t
  158         IDTVEC(intr0), IDTVEC(intr1), IDTVEC(intr2), IDTVEC(intr3),
  159         IDTVEC(intr4), IDTVEC(intr5), IDTVEC(intr6), IDTVEC(intr7),
  160         IDTVEC(intr8), IDTVEC(intr9), IDTVEC(intr10), IDTVEC(intr11),
  161         IDTVEC(intr12), IDTVEC(intr13), IDTVEC(intr14), IDTVEC(intr15);
  162 
  163 #if defined(SMP) || defined(APIC_IO)
  164 inthand_t
  165         IDTVEC(fastintr16), IDTVEC(fastintr17),
  166         IDTVEC(fastintr18), IDTVEC(fastintr19),
  167         IDTVEC(fastintr20), IDTVEC(fastintr21),
  168         IDTVEC(fastintr22), IDTVEC(fastintr23);
  169 inthand_t
  170         IDTVEC(intr16), IDTVEC(intr17), IDTVEC(intr18), IDTVEC(intr19),
  171         IDTVEC(intr20), IDTVEC(intr21), IDTVEC(intr22), IDTVEC(intr23);
  172 
  173 inthand_t
  174         Xinvltlb,       /* TLB shootdowns */
  175 #ifdef BETTER_CLOCK
  176         Xcpucheckstate, /* Check cpu state */
  177 #endif
  178         Xcpuast,        /* Additional software trap on other cpu */ 
  179         Xforward_irq,   /* Forward irq to cpu holding ISR lock */
  180         Xcpustop,       /* CPU stops & waits for another CPU to restart it */
  181         Xspuriousint,   /* handle APIC "spurious INTs" */
  182         Xrendezvous;    /* handle CPU rendezvous */
  183 
  184 #ifdef TEST_TEST1
  185 inthand_t
  186         Xtest1;         /* 'fake' HWI at top of APIC prio 0x3x, 32+31 = 0x3f */
  187 #endif /** TEST_TEST1 */
  188 #endif /* SMP || APIC_IO */
  189 
  190 void    isa_defaultirq __P((void));
  191 int     isa_nmi __P((int cd));
  192 int     icu_setup __P((int intr, inthand2_t *func, void *arg, 
  193                        u_int *maskptr, int flags));
  194 int     icu_unset __P((int intr, inthand2_t *handler));
  195 void    icu_reinit __P((void));
  196 int     update_intr_masks __P((void));
  197 
  198 intrmask_t splq __P((intrmask_t mask));
  199 
  200 #define INTR_FAST               0x00000001 /* fast interrupt handler */
  201 #define INTR_EXCL               0x00010000 /* excl. intr, default is shared */
  202 
  203 /*
  204  * WARNING: These are internal functions and not to be used by device drivers!
  205  * They are subject to change without notice. 
  206  */
  207 struct intrec *inthand_add(const char *name, int irq, inthand2_t handler,
  208                            void *arg, intrmask_t *maskptr, int flags);
  209 
  210 int inthand_remove(struct intrec *idesc);
  211 
  212 #endif /* LOCORE */
  213 
  214 #endif /* _KERNEL */
  215 
  216 #endif /* !_I386_ISA_INTR_MACHDEP_H_ */

Cache object: 211e803ca5595d472fac41121ae27e2e


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.