| 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 |  |