2 * Xen event channels (2-level ABI)
4 * Jeremy Fitzhardinge <jeremy@xensource.com>, XenSource Inc, 2007
7 #define pr_fmt(fmt) "xen:" KBUILD_MODNAME ": " fmt
9 #include <linux/linkage.h>
10 #include <linux/interrupt.h>
11 #include <linux/irq.h>
13 #include <asm/sync_bitops.h>
14 #include <asm/xen/hypercall.h>
15 #include <asm/xen/hypervisor.h>
18 #include <xen/xen-ops.h>
19 #include <xen/events.h>
20 #include <xen/interface/xen.h>
21 #include <xen/interface/event_channel.h>
23 #include "events_internal.h"
26 * Note sizeof(xen_ulong_t) can be more than sizeof(unsigned long). Be
27 * careful to only use bitops which allow for this (e.g
28 * test_bit/find_first_bit and friends but not __ffs) and to pass
29 * BITS_PER_EVTCHN_WORD as the bitmask length.
31 #define BITS_PER_EVTCHN_WORD (sizeof(xen_ulong_t)*8)
33 * Make a bitmask (i.e. unsigned long *) of a xen_ulong_t
34 * array. Primarily to avoid long lines (hence the terse name).
36 #define BM(x) (unsigned long *)(x)
37 /* Find the first set bit in a evtchn mask */
38 #define EVTCHN_FIRST_BIT(w) find_first_bit(BM(&(w)), BITS_PER_EVTCHN_WORD)
40 #define EVTCHN_MASK_SIZE (EVTCHN_2L_NR_CHANNELS/BITS_PER_EVTCHN_WORD)
42 static DEFINE_PER_CPU(xen_ulong_t
[EVTCHN_MASK_SIZE
], cpu_evtchn_mask
);
44 static unsigned evtchn_2l_max_channels(void)
46 return EVTCHN_2L_NR_CHANNELS
;
49 static void evtchn_2l_bind_to_cpu(struct irq_info
*info
, unsigned cpu
)
51 clear_bit(info
->evtchn
, BM(per_cpu(cpu_evtchn_mask
, info
->cpu
)));
52 set_bit(info
->evtchn
, BM(per_cpu(cpu_evtchn_mask
, cpu
)));
55 static void evtchn_2l_clear_pending(unsigned port
)
57 struct shared_info
*s
= HYPERVISOR_shared_info
;
58 sync_clear_bit(port
, BM(&s
->evtchn_pending
[0]));
61 static void evtchn_2l_set_pending(unsigned port
)
63 struct shared_info
*s
= HYPERVISOR_shared_info
;
64 sync_set_bit(port
, BM(&s
->evtchn_pending
[0]));
67 static bool evtchn_2l_is_pending(unsigned port
)
69 struct shared_info
*s
= HYPERVISOR_shared_info
;
70 return sync_test_bit(port
, BM(&s
->evtchn_pending
[0]));
73 static bool evtchn_2l_test_and_set_mask(unsigned port
)
75 struct shared_info
*s
= HYPERVISOR_shared_info
;
76 return sync_test_and_set_bit(port
, BM(&s
->evtchn_mask
[0]));
79 static void evtchn_2l_mask(unsigned port
)
81 struct shared_info
*s
= HYPERVISOR_shared_info
;
82 sync_set_bit(port
, BM(&s
->evtchn_mask
[0]));
85 static void evtchn_2l_unmask(unsigned port
)
87 struct shared_info
*s
= HYPERVISOR_shared_info
;
88 unsigned int cpu
= get_cpu();
89 int do_hypercall
= 0, evtchn_pending
= 0;
91 BUG_ON(!irqs_disabled());
93 if (unlikely((cpu
!= cpu_from_evtchn(port
))))
97 * Need to clear the mask before checking pending to
98 * avoid a race with an event becoming pending.
100 * EVTCHNOP_unmask will only trigger an upcall if the
101 * mask bit was set, so if a hypercall is needed
104 sync_clear_bit(port
, BM(&s
->evtchn_mask
[0]));
105 evtchn_pending
= sync_test_bit(port
, BM(&s
->evtchn_pending
[0]));
107 if (unlikely(evtchn_pending
&& xen_hvm_domain())) {
108 sync_set_bit(port
, BM(&s
->evtchn_mask
[0]));
113 /* Slow path (hypercall) if this is a non-local port or if this is
114 * an hvm domain and an event is pending (hvm domains don't have
115 * their own implementation of irq_enable). */
117 struct evtchn_unmask unmask
= { .port
= port
};
118 (void)HYPERVISOR_event_channel_op(EVTCHNOP_unmask
, &unmask
);
120 struct vcpu_info
*vcpu_info
= __this_cpu_read(xen_vcpu
);
123 * The following is basically the equivalent of
124 * 'hw_resend_irq'. Just like a real IO-APIC we 'lose
125 * the interrupt edge' if the channel is masked.
127 if (evtchn_pending
&&
128 !sync_test_and_set_bit(port
/ BITS_PER_EVTCHN_WORD
,
129 BM(&vcpu_info
->evtchn_pending_sel
)))
130 vcpu_info
->evtchn_upcall_pending
= 1;
136 static DEFINE_PER_CPU(unsigned int, current_word_idx
);
137 static DEFINE_PER_CPU(unsigned int, current_bit_idx
);
140 * Mask out the i least significant bits of w
142 #define MASK_LSBS(w, i) (w & ((~((xen_ulong_t)0UL)) << i))
144 static inline xen_ulong_t
active_evtchns(unsigned int cpu
,
145 struct shared_info
*sh
,
148 return sh
->evtchn_pending
[idx
] &
149 per_cpu(cpu_evtchn_mask
, cpu
)[idx
] &
150 ~sh
->evtchn_mask
[idx
];
154 * Search the CPU's pending events bitmasks. For each one found, map
155 * the event number to an irq, and feed it into do_IRQ() for handling.
157 * Xen uses a two-level bitmap to speed searching. The first level is
158 * a bitset of words which contain pending event bits. The second
159 * level is a bitset of pending events themselves.
161 static void evtchn_2l_handle_events(unsigned cpu
)
164 xen_ulong_t pending_words
;
165 xen_ulong_t pending_bits
;
166 int start_word_idx
, start_bit_idx
;
167 int word_idx
, bit_idx
;
169 struct shared_info
*s
= HYPERVISOR_shared_info
;
170 struct vcpu_info
*vcpu_info
= __this_cpu_read(xen_vcpu
);
172 /* Timer interrupt has highest priority. */
173 irq
= irq_from_virq(cpu
, VIRQ_TIMER
);
175 unsigned int evtchn
= evtchn_from_irq(irq
);
176 word_idx
= evtchn
/ BITS_PER_LONG
;
177 bit_idx
= evtchn
% BITS_PER_LONG
;
178 if (active_evtchns(cpu
, s
, word_idx
) & (1ULL << bit_idx
))
179 generic_handle_irq(irq
);
183 * Master flag must be cleared /before/ clearing
184 * selector flag. xchg_xen_ulong must contain an
185 * appropriate barrier.
187 pending_words
= xchg_xen_ulong(&vcpu_info
->evtchn_pending_sel
, 0);
189 start_word_idx
= __this_cpu_read(current_word_idx
);
190 start_bit_idx
= __this_cpu_read(current_bit_idx
);
192 word_idx
= start_word_idx
;
194 for (i
= 0; pending_words
!= 0; i
++) {
197 words
= MASK_LSBS(pending_words
, word_idx
);
200 * If we masked out all events, wrap to beginning.
207 word_idx
= EVTCHN_FIRST_BIT(words
);
209 pending_bits
= active_evtchns(cpu
, s
, word_idx
);
210 bit_idx
= 0; /* usually scan entire word from start */
212 * We scan the starting word in two parts.
214 * 1st time: start in the middle, scanning the
217 * 2nd time: scan the whole word (not just the
218 * parts skipped in the first pass) -- if an
219 * event in the previously scanned bits is
220 * pending again it would just be scanned on
221 * the next loop anyway.
223 if (word_idx
== start_word_idx
) {
225 bit_idx
= start_bit_idx
;
232 bits
= MASK_LSBS(pending_bits
, bit_idx
);
234 /* If we masked out all events, move on. */
238 bit_idx
= EVTCHN_FIRST_BIT(bits
);
241 port
= (word_idx
* BITS_PER_EVTCHN_WORD
) + bit_idx
;
242 irq
= get_evtchn_to_irq(port
);
245 generic_handle_irq(irq
);
247 bit_idx
= (bit_idx
+ 1) % BITS_PER_EVTCHN_WORD
;
249 /* Next caller starts at last processed + 1 */
250 __this_cpu_write(current_word_idx
,
252 (word_idx
+1) % BITS_PER_EVTCHN_WORD
);
253 __this_cpu_write(current_bit_idx
, bit_idx
);
254 } while (bit_idx
!= 0);
256 /* Scan start_l1i twice; all others once. */
257 if ((word_idx
!= start_word_idx
) || (i
!= 0))
258 pending_words
&= ~(1UL << word_idx
);
260 word_idx
= (word_idx
+ 1) % BITS_PER_EVTCHN_WORD
;
264 irqreturn_t
xen_debug_interrupt(int irq
, void *dev_id
)
266 struct shared_info
*sh
= HYPERVISOR_shared_info
;
267 int cpu
= smp_processor_id();
268 xen_ulong_t
*cpu_evtchn
= per_cpu(cpu_evtchn_mask
, cpu
);
271 static DEFINE_SPINLOCK(debug_lock
);
274 spin_lock_irqsave(&debug_lock
, flags
);
276 printk("\nvcpu %d\n ", cpu
);
278 for_each_online_cpu(i
) {
280 v
= per_cpu(xen_vcpu
, i
);
281 pending
= (get_irq_regs() && i
== cpu
)
282 ? xen_irqs_disabled(get_irq_regs())
283 : v
->evtchn_upcall_mask
;
284 printk("%d: masked=%d pending=%d event_sel %0*"PRI_xen_ulong
"\n ", i
,
285 pending
, v
->evtchn_upcall_pending
,
286 (int)(sizeof(v
->evtchn_pending_sel
)*2),
287 v
->evtchn_pending_sel
);
289 v
= per_cpu(xen_vcpu
, cpu
);
291 printk("\npending:\n ");
292 for (i
= ARRAY_SIZE(sh
->evtchn_pending
)-1; i
>= 0; i
--)
293 printk("%0*"PRI_xen_ulong
"%s",
294 (int)sizeof(sh
->evtchn_pending
[0])*2,
295 sh
->evtchn_pending
[i
],
296 i
% 8 == 0 ? "\n " : " ");
297 printk("\nglobal mask:\n ");
298 for (i
= ARRAY_SIZE(sh
->evtchn_mask
)-1; i
>= 0; i
--)
299 printk("%0*"PRI_xen_ulong
"%s",
300 (int)(sizeof(sh
->evtchn_mask
[0])*2),
302 i
% 8 == 0 ? "\n " : " ");
304 printk("\nglobally unmasked:\n ");
305 for (i
= ARRAY_SIZE(sh
->evtchn_mask
)-1; i
>= 0; i
--)
306 printk("%0*"PRI_xen_ulong
"%s",
307 (int)(sizeof(sh
->evtchn_mask
[0])*2),
308 sh
->evtchn_pending
[i
] & ~sh
->evtchn_mask
[i
],
309 i
% 8 == 0 ? "\n " : " ");
311 printk("\nlocal cpu%d mask:\n ", cpu
);
312 for (i
= (EVTCHN_2L_NR_CHANNELS
/BITS_PER_EVTCHN_WORD
)-1; i
>= 0; i
--)
313 printk("%0*"PRI_xen_ulong
"%s", (int)(sizeof(cpu_evtchn
[0])*2),
315 i
% 8 == 0 ? "\n " : " ");
317 printk("\nlocally unmasked:\n ");
318 for (i
= ARRAY_SIZE(sh
->evtchn_mask
)-1; i
>= 0; i
--) {
319 xen_ulong_t pending
= sh
->evtchn_pending
[i
]
320 & ~sh
->evtchn_mask
[i
]
322 printk("%0*"PRI_xen_ulong
"%s",
323 (int)(sizeof(sh
->evtchn_mask
[0])*2),
324 pending
, i
% 8 == 0 ? "\n " : " ");
327 printk("\npending list:\n");
328 for (i
= 0; i
< EVTCHN_2L_NR_CHANNELS
; i
++) {
329 if (sync_test_bit(i
, BM(sh
->evtchn_pending
))) {
330 int word_idx
= i
/ BITS_PER_EVTCHN_WORD
;
331 printk(" %d: event %d -> irq %d%s%s%s\n",
332 cpu_from_evtchn(i
), i
,
333 get_evtchn_to_irq(i
),
334 sync_test_bit(word_idx
, BM(&v
->evtchn_pending_sel
))
336 !sync_test_bit(i
, BM(sh
->evtchn_mask
))
337 ? "" : " globally-masked",
338 sync_test_bit(i
, BM(cpu_evtchn
))
339 ? "" : " locally-masked");
343 spin_unlock_irqrestore(&debug_lock
, flags
);
348 static void evtchn_2l_resume(void)
352 for_each_online_cpu(i
)
353 memset(per_cpu(cpu_evtchn_mask
, i
), 0, sizeof(xen_ulong_t
) *
354 EVTCHN_2L_NR_CHANNELS
/BITS_PER_EVTCHN_WORD
);
357 static const struct evtchn_ops evtchn_ops_2l
= {
358 .max_channels
= evtchn_2l_max_channels
,
359 .nr_channels
= evtchn_2l_max_channels
,
360 .bind_to_cpu
= evtchn_2l_bind_to_cpu
,
361 .clear_pending
= evtchn_2l_clear_pending
,
362 .set_pending
= evtchn_2l_set_pending
,
363 .is_pending
= evtchn_2l_is_pending
,
364 .test_and_set_mask
= evtchn_2l_test_and_set_mask
,
365 .mask
= evtchn_2l_mask
,
366 .unmask
= evtchn_2l_unmask
,
367 .handle_events
= evtchn_2l_handle_events
,
368 .resume
= evtchn_2l_resume
,
371 void __init
xen_evtchn_2l_init(void)
373 pr_info("Using 2-level ABI\n");
374 evtchn_ops
= &evtchn_ops_2l
;