xref: /freebsd/sys/xen/evtchn.h (revision 39beb93c3f8bdbf72a61fda42300b5ebed7390c8)
1 /******************************************************************************
2  * evtchn.h
3  *
4  * Communication via Xen event channels.
5  * Also definitions for the device that demuxes notifications to userspace.
6  *
7  * Copyright (c) 2004, K A Fraser
8  *
9  * $FreeBSD$
10  */
11 
12 #ifndef __ASM_EVTCHN_H__
13 #define __ASM_EVTCHN_H__
14 #include <machine/pcpu.h>
15 #include <xen/hypervisor.h>
16 #include <machine/xen/synch_bitops.h>
17 #include <machine/frame.h>
18 
19 /*
20  * LOW-LEVEL DEFINITIONS
21  */
22 
23 /*
24  * Unlike notify_remote_via_evtchn(), this is safe to use across
25  * save/restore. Notifications on a broken connection are silently dropped.
26  */
27 void notify_remote_via_irq(int irq);
28 
29 
30 /* Entry point for notifications into Linux subsystems. */
31 void evtchn_do_upcall(struct trapframe *frame);
32 
33 /* Entry point for notifications into the userland character device. */
34 void evtchn_device_upcall(int port);
35 
36 void mask_evtchn(int port);
37 
38 void unmask_evtchn(int port);
39 
40 #ifdef SMP
41 void rebind_evtchn_to_cpu(int port, unsigned int cpu);
42 #else
43 #define rebind_evtchn_to_cpu(port, cpu)	((void)0)
44 #endif
45 
46 static inline
47 int test_and_set_evtchn_mask(int port)
48 {
49 	shared_info_t *s = HYPERVISOR_shared_info;
50 	return synch_test_and_set_bit(port, s->evtchn_mask);
51 }
52 
53 static inline void
54 clear_evtchn(int port)
55 {
56 	shared_info_t *s = HYPERVISOR_shared_info;
57 	synch_clear_bit(port, &s->evtchn_pending[0]);
58 }
59 
60 static inline void
61 notify_remote_via_evtchn(int port)
62 {
63         struct evtchn_send send = { .port = port };
64         (void)HYPERVISOR_event_channel_op(EVTCHNOP_send, &send);
65 }
66 
67 /*
68  * Use these to access the event channel underlying the IRQ handle returned
69  * by bind_*_to_irqhandler().
70  */
71 int irq_to_evtchn_port(int irq);
72 
73 void ipi_pcpu(unsigned int cpu, int vector);
74 
75 /*
76  * CHARACTER-DEVICE DEFINITIONS
77  */
78 
79 #define PORT_NORMAL    0x0000
80 #define PORT_EXCEPTION 0x8000
81 #define PORTIDX_MASK   0x7fff
82 
83 /* /dev/xen/evtchn resides at device number major=10, minor=200 */
84 #define EVTCHN_MINOR 200
85 
86 /* /dev/xen/evtchn ioctls: */
87 /* EVTCHN_RESET: Clear and reinit the event buffer. Clear error condition. */
88 #define EVTCHN_RESET  _IO('E', 1)
89 /* EVTCHN_BIND: Bind to the specified event-channel port. */
90 #define EVTCHN_BIND   _IO('E', 2)
91 /* EVTCHN_UNBIND: Unbind from the specified event-channel port. */
92 #define EVTCHN_UNBIND _IO('E', 3)
93 
94 #endif /* __ASM_EVTCHN_H__ */
95