1 | /* $NetBSD: intr.h,v 1.39 2016/10/17 18:23:50 jdolecek Exp $ */ |
2 | /* NetBSD intr.h,v 1.15 2004/10/31 10:39:34 yamt Exp */ |
3 | |
4 | /*- |
5 | * Copyright (c) 1998, 2001 The NetBSD Foundation, Inc. |
6 | * All rights reserved. |
7 | * |
8 | * This code is derived from software contributed to The NetBSD Foundation |
9 | * by Charles M. Hannum, and by Jason R. Thorpe. |
10 | * |
11 | * Redistribution and use in source and binary forms, with or without |
12 | * modification, are permitted provided that the following conditions |
13 | * are met: |
14 | * 1. Redistributions of source code must retain the above copyright |
15 | * notice, this list of conditions and the following disclaimer. |
16 | * 2. Redistributions in binary form must reproduce the above copyright |
17 | * notice, this list of conditions and the following disclaimer in the |
18 | * documentation and/or other materials provided with the distribution. |
19 | * |
20 | * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS |
21 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
22 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
23 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS |
24 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
25 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
26 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
27 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
28 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
29 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
30 | * POSSIBILITY OF SUCH DAMAGE. |
31 | */ |
32 | |
33 | #ifndef _XEN_INTR_H_ |
34 | #define _XEN_INTR_H_ |
35 | |
36 | #include <machine/intrdefs.h> |
37 | |
38 | #ifndef _LOCORE |
39 | #include <xen/xen.h> |
40 | #include <xen/hypervisor.h> |
41 | #include <machine/pic.h> |
42 | #include <sys/evcnt.h> |
43 | |
44 | #include "opt_xen.h" |
45 | |
46 | |
47 | struct cpu_info; |
48 | /* |
49 | * Struct describing an event channel. |
50 | */ |
51 | |
52 | struct evtsource { |
53 | int ev_maxlevel; /* max. IPL for this source */ |
54 | uint32_t ev_imask; /* interrupt mask */ |
55 | struct intrhand *ev_handlers; /* handler chain */ |
56 | struct evcnt ev_evcnt; /* interrupt counter */ |
57 | struct cpu_info *ev_cpu; /* cpu on which this event is bound */ |
58 | char ev_evname[32]; /* event counter name */ |
59 | }; |
60 | |
61 | /* |
62 | * Structure describing an interrupt level. struct cpu_info has an array of |
63 | * IPL_MAX of theses. The index in the array is equal to the stub number of |
64 | * the stubcode as present in vector.s |
65 | */ |
66 | |
67 | struct intrstub { |
68 | #if 0 |
69 | void *ist_entry; |
70 | #endif |
71 | void *ist_recurse; |
72 | void *ist_resume; |
73 | }; |
74 | |
75 | /* for x86 compatibility */ |
76 | extern struct intrstub i8259_stubs[]; |
77 | extern struct intrstub ioapic_edge_stubs[]; |
78 | extern struct intrstub ioapic_level_stubs[]; |
79 | |
80 | struct iplsource { |
81 | struct intrhand *ipl_handlers; /* handler chain */ |
82 | void *ipl_recurse; /* entry for spllower */ |
83 | void *ipl_resume; /* entry for doreti */ |
84 | struct lwp *ipl_lwp; |
85 | u_long ipl_evt_mask1; /* pending events for this IPL */ |
86 | u_long ipl_evt_mask2[NR_EVENT_CHANNELS]; |
87 | }; |
88 | |
89 | |
90 | |
91 | /* |
92 | * Interrupt handler chains. These are linked in both the evtsource and |
93 | * the iplsource. |
94 | * The handler is called with its (single) argument. |
95 | */ |
96 | |
97 | struct intrhand { |
98 | int (*ih_fun)(void *); |
99 | void *ih_arg; |
100 | int ih_level; |
101 | int (*ih_realfun)(void *); |
102 | void *ih_realarg; |
103 | struct intrhand *ih_ipl_next; |
104 | struct intrhand *ih_evt_next; |
105 | struct cpu_info *ih_cpu; |
106 | }; |
107 | |
108 | struct xen_intr_handle { |
109 | int pirq; /* also contains the APIC_INT_* flags if NIOAPIC > 0 */ |
110 | int evtch; |
111 | }; |
112 | |
113 | extern struct intrstub xenev_stubs[]; |
114 | |
115 | #define IUNMASK(ci,level) (ci)->ci_iunmask[(level)] |
116 | |
117 | extern void Xspllower(int); |
118 | |
119 | int splraise(int); |
120 | void spllower(int); |
121 | |
122 | #define SPL_ASSERT_BELOW(x) KDASSERT(curcpu()->ci_ilevel < (x)) |
123 | |
124 | /* |
125 | * Miscellaneous |
126 | */ |
127 | #define spl0() spllower(IPL_NONE) |
128 | #define splx(x) spllower(x) |
129 | |
130 | typedef uint8_t ipl_t; |
131 | typedef struct { |
132 | ipl_t _ipl; |
133 | } ipl_cookie_t; |
134 | |
135 | static inline ipl_cookie_t |
136 | makeiplcookie(ipl_t ipl) |
137 | { |
138 | |
139 | return (ipl_cookie_t){._ipl = ipl}; |
140 | } |
141 | |
142 | static inline int |
143 | splraiseipl(ipl_cookie_t icookie) |
144 | { |
145 | |
146 | return splraise(icookie._ipl); |
147 | } |
148 | |
149 | #include <sys/spl.h> |
150 | |
151 | /* |
152 | * Stub declarations. |
153 | */ |
154 | |
155 | struct pcibus_attach_args; |
156 | |
157 | typedef int intr_handle_t; |
158 | |
159 | #ifdef MULTIPROCESSOR |
160 | int intr_biglock_wrapper(void *); |
161 | #endif |
162 | |
163 | void intr_default_setup(void); |
164 | int x86_nmi(void); |
165 | |
166 | void *intr_establish(int, struct pic *, int, int, int, int (*)(void *), void *, bool); |
167 | void *intr_establish_xname(int, struct pic *, int, int, int, int (*)(void *), void *, |
168 | bool, const char *); |
169 | void intr_disestablish(struct intrhand *); |
170 | const char *intr_string(intr_handle_t); |
171 | void cpu_intr_init(struct cpu_info *); |
172 | int xen_intr_map(int *, int); |
173 | #ifdef INTRDEBUG |
174 | void intr_printconfig(void); |
175 | #endif |
176 | int intr_find_mpmapping(int, int, struct xen_intr_handle *); |
177 | struct pic *intr_findpic(int); |
178 | void intr_add_pcibus(struct pcibus_attach_args *); |
179 | |
180 | #ifdef MULTIPROCESSOR |
181 | void xen_ipi_init(void); |
182 | int xen_send_ipi(struct cpu_info *, uint32_t); |
183 | void xen_broadcast_ipi(uint32_t); |
184 | #else |
185 | #define xen_ipi_init(_1) ((void) 0) /* nothing */ |
186 | #define xen_send_ipi(_i1, _i2) (0) /* nothing */ |
187 | #define xen_broadcast_ipi(_i1) ((void) 0) /* nothing */ |
188 | #endif /* MULTIPROCESSOR */ |
189 | #endif /* !_LOCORE */ |
190 | |
191 | #endif /* _XEN_INTR_H_ */ |
192 | |