| Jeremy Fitzhardinge | a42089d | 2007-07-17 18:37:04 -0700 | [diff] [blame] | 1 | /****************************************************************************** | 
 | 2 |  * event_channel.h | 
 | 3 |  * | 
 | 4 |  * Event channels between domains. | 
 | 5 |  * | 
 | 6 |  * Copyright (c) 2003-2004, K A Fraser. | 
 | 7 |  */ | 
 | 8 |  | 
 | 9 | #ifndef __XEN_PUBLIC_EVENT_CHANNEL_H__ | 
 | 10 | #define __XEN_PUBLIC_EVENT_CHANNEL_H__ | 
 | 11 |  | 
 | 12 | typedef uint32_t evtchn_port_t; | 
 | 13 | DEFINE_GUEST_HANDLE(evtchn_port_t); | 
 | 14 |  | 
 | 15 | /* | 
 | 16 |  * EVTCHNOP_alloc_unbound: Allocate a port in domain <dom> and mark as | 
 | 17 |  * accepting interdomain bindings from domain <remote_dom>. A fresh port | 
 | 18 |  * is allocated in <dom> and returned as <port>. | 
 | 19 |  * NOTES: | 
 | 20 |  *  1. If the caller is unprivileged then <dom> must be DOMID_SELF. | 
 | 21 |  *  2. <rdom> may be DOMID_SELF, allowing loopback connections. | 
 | 22 |  */ | 
 | 23 | #define EVTCHNOP_alloc_unbound	  6 | 
 | 24 | struct evtchn_alloc_unbound { | 
 | 25 | 	/* IN parameters */ | 
 | 26 | 	domid_t dom, remote_dom; | 
 | 27 | 	/* OUT parameters */ | 
 | 28 | 	evtchn_port_t port; | 
 | 29 | }; | 
 | 30 |  | 
 | 31 | /* | 
 | 32 |  * EVTCHNOP_bind_interdomain: Construct an interdomain event channel between | 
 | 33 |  * the calling domain and <remote_dom>. <remote_dom,remote_port> must identify | 
 | 34 |  * a port that is unbound and marked as accepting bindings from the calling | 
 | 35 |  * domain. A fresh port is allocated in the calling domain and returned as | 
 | 36 |  * <local_port>. | 
 | 37 |  * NOTES: | 
 | 38 |  *  2. <remote_dom> may be DOMID_SELF, allowing loopback connections. | 
 | 39 |  */ | 
 | 40 | #define EVTCHNOP_bind_interdomain 0 | 
 | 41 | struct evtchn_bind_interdomain { | 
 | 42 | 	/* IN parameters. */ | 
 | 43 | 	domid_t remote_dom; | 
 | 44 | 	evtchn_port_t remote_port; | 
 | 45 | 	/* OUT parameters. */ | 
 | 46 | 	evtchn_port_t local_port; | 
 | 47 | }; | 
 | 48 |  | 
 | 49 | /* | 
 | 50 |  * EVTCHNOP_bind_virq: Bind a local event channel to VIRQ <irq> on specified | 
 | 51 |  * vcpu. | 
 | 52 |  * NOTES: | 
 | 53 |  *  1. A virtual IRQ may be bound to at most one event channel per vcpu. | 
 | 54 |  *  2. The allocated event channel is bound to the specified vcpu. The binding | 
 | 55 |  *     may not be changed. | 
 | 56 |  */ | 
 | 57 | #define EVTCHNOP_bind_virq	  1 | 
 | 58 | struct evtchn_bind_virq { | 
 | 59 | 	/* IN parameters. */ | 
 | 60 | 	uint32_t virq; | 
 | 61 | 	uint32_t vcpu; | 
 | 62 | 	/* OUT parameters. */ | 
 | 63 | 	evtchn_port_t port; | 
 | 64 | }; | 
 | 65 |  | 
 | 66 | /* | 
 | 67 |  * EVTCHNOP_bind_pirq: Bind a local event channel to PIRQ <irq>. | 
 | 68 |  * NOTES: | 
 | 69 |  *  1. A physical IRQ may be bound to at most one event channel per domain. | 
 | 70 |  *  2. Only a sufficiently-privileged domain may bind to a physical IRQ. | 
 | 71 |  */ | 
 | 72 | #define EVTCHNOP_bind_pirq	  2 | 
 | 73 | struct evtchn_bind_pirq { | 
 | 74 | 	/* IN parameters. */ | 
 | 75 | 	uint32_t pirq; | 
 | 76 | #define BIND_PIRQ__WILL_SHARE 1 | 
 | 77 | 	uint32_t flags; /* BIND_PIRQ__* */ | 
 | 78 | 	/* OUT parameters. */ | 
 | 79 | 	evtchn_port_t port; | 
 | 80 | }; | 
 | 81 |  | 
 | 82 | /* | 
 | 83 |  * EVTCHNOP_bind_ipi: Bind a local event channel to receive events. | 
 | 84 |  * NOTES: | 
 | 85 |  *  1. The allocated event channel is bound to the specified vcpu. The binding | 
 | 86 |  *     may not be changed. | 
 | 87 |  */ | 
 | 88 | #define EVTCHNOP_bind_ipi	  7 | 
 | 89 | struct evtchn_bind_ipi { | 
 | 90 | 	uint32_t vcpu; | 
 | 91 | 	/* OUT parameters. */ | 
 | 92 | 	evtchn_port_t port; | 
 | 93 | }; | 
 | 94 |  | 
 | 95 | /* | 
 | 96 |  * EVTCHNOP_close: Close a local event channel <port>. If the channel is | 
 | 97 |  * interdomain then the remote end is placed in the unbound state | 
 | 98 |  * (EVTCHNSTAT_unbound), awaiting a new connection. | 
 | 99 |  */ | 
 | 100 | #define EVTCHNOP_close		  3 | 
 | 101 | struct evtchn_close { | 
 | 102 | 	/* IN parameters. */ | 
 | 103 | 	evtchn_port_t port; | 
 | 104 | }; | 
 | 105 |  | 
 | 106 | /* | 
 | 107 |  * EVTCHNOP_send: Send an event to the remote end of the channel whose local | 
 | 108 |  * endpoint is <port>. | 
 | 109 |  */ | 
 | 110 | #define EVTCHNOP_send		  4 | 
 | 111 | struct evtchn_send { | 
 | 112 | 	/* IN parameters. */ | 
 | 113 | 	evtchn_port_t port; | 
 | 114 | }; | 
 | 115 |  | 
 | 116 | /* | 
 | 117 |  * EVTCHNOP_status: Get the current status of the communication channel which | 
 | 118 |  * has an endpoint at <dom, port>. | 
 | 119 |  * NOTES: | 
 | 120 |  *  1. <dom> may be specified as DOMID_SELF. | 
 | 121 |  *  2. Only a sufficiently-privileged domain may obtain the status of an event | 
 | 122 |  *     channel for which <dom> is not DOMID_SELF. | 
 | 123 |  */ | 
 | 124 | #define EVTCHNOP_status		  5 | 
 | 125 | struct evtchn_status { | 
 | 126 | 	/* IN parameters */ | 
 | 127 | 	domid_t  dom; | 
 | 128 | 	evtchn_port_t port; | 
 | 129 | 	/* OUT parameters */ | 
 | 130 | #define EVTCHNSTAT_closed	0  /* Channel is not in use.		     */ | 
 | 131 | #define EVTCHNSTAT_unbound	1  /* Channel is waiting interdom connection.*/ | 
 | 132 | #define EVTCHNSTAT_interdomain	2  /* Channel is connected to remote domain. */ | 
 | 133 | #define EVTCHNSTAT_pirq		3  /* Channel is bound to a phys IRQ line.   */ | 
 | 134 | #define EVTCHNSTAT_virq		4  /* Channel is bound to a virtual IRQ line */ | 
 | 135 | #define EVTCHNSTAT_ipi		5  /* Channel is bound to a virtual IPI line */ | 
 | 136 | 	uint32_t status; | 
 | 137 | 	uint32_t vcpu;		   /* VCPU to which this channel is bound.   */ | 
 | 138 | 	union { | 
 | 139 | 		struct { | 
 | 140 | 			domid_t dom; | 
 | 141 | 		} unbound; /* EVTCHNSTAT_unbound */ | 
 | 142 | 		struct { | 
 | 143 | 			domid_t dom; | 
 | 144 | 			evtchn_port_t port; | 
 | 145 | 		} interdomain; /* EVTCHNSTAT_interdomain */ | 
 | 146 | 		uint32_t pirq;	    /* EVTCHNSTAT_pirq	      */ | 
 | 147 | 		uint32_t virq;	    /* EVTCHNSTAT_virq	      */ | 
 | 148 | 	} u; | 
 | 149 | }; | 
 | 150 |  | 
 | 151 | /* | 
 | 152 |  * EVTCHNOP_bind_vcpu: Specify which vcpu a channel should notify when an | 
 | 153 |  * event is pending. | 
 | 154 |  * NOTES: | 
 | 155 |  *  1. IPI- and VIRQ-bound channels always notify the vcpu that initialised | 
 | 156 |  *     the binding. This binding cannot be changed. | 
 | 157 |  *  2. All other channels notify vcpu0 by default. This default is set when | 
 | 158 |  *     the channel is allocated (a port that is freed and subsequently reused | 
 | 159 |  *     has its binding reset to vcpu0). | 
 | 160 |  */ | 
 | 161 | #define EVTCHNOP_bind_vcpu	  8 | 
 | 162 | struct evtchn_bind_vcpu { | 
 | 163 | 	/* IN parameters. */ | 
 | 164 | 	evtchn_port_t port; | 
 | 165 | 	uint32_t vcpu; | 
 | 166 | }; | 
 | 167 |  | 
 | 168 | /* | 
 | 169 |  * EVTCHNOP_unmask: Unmask the specified local event-channel port and deliver | 
 | 170 |  * a notification to the appropriate VCPU if an event is pending. | 
 | 171 |  */ | 
 | 172 | #define EVTCHNOP_unmask		  9 | 
 | 173 | struct evtchn_unmask { | 
 | 174 | 	/* IN parameters. */ | 
 | 175 | 	evtchn_port_t port; | 
 | 176 | }; | 
 | 177 |  | 
 | 178 | struct evtchn_op { | 
 | 179 | 	uint32_t cmd; /* EVTCHNOP_* */ | 
 | 180 | 	union { | 
 | 181 | 		struct evtchn_alloc_unbound    alloc_unbound; | 
 | 182 | 		struct evtchn_bind_interdomain bind_interdomain; | 
 | 183 | 		struct evtchn_bind_virq	       bind_virq; | 
 | 184 | 		struct evtchn_bind_pirq	       bind_pirq; | 
 | 185 | 		struct evtchn_bind_ipi	       bind_ipi; | 
 | 186 | 		struct evtchn_close	       close; | 
 | 187 | 		struct evtchn_send	       send; | 
 | 188 | 		struct evtchn_status	       status; | 
 | 189 | 		struct evtchn_bind_vcpu	       bind_vcpu; | 
 | 190 | 		struct evtchn_unmask	       unmask; | 
 | 191 | 	} u; | 
 | 192 | }; | 
 | 193 | DEFINE_GUEST_HANDLE_STRUCT(evtchn_op); | 
 | 194 |  | 
 | 195 | #endif /* __XEN_PUBLIC_EVENT_CHANNEL_H__ */ |