1181624Skmacy/****************************************************************************** 2181624Skmacy * event_channel.h 3181624Skmacy * 4181624Skmacy * Event channels between domains. 5181624Skmacy * 6181624Skmacy * Permission is hereby granted, free of charge, to any person obtaining a copy 7181624Skmacy * of this software and associated documentation files (the "Software"), to 8181624Skmacy * deal in the Software without restriction, including without limitation the 9181624Skmacy * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 10181624Skmacy * sell copies of the Software, and to permit persons to whom the Software is 11181624Skmacy * furnished to do so, subject to the following conditions: 12181624Skmacy * 13181624Skmacy * The above copyright notice and this permission notice shall be included in 14181624Skmacy * all copies or substantial portions of the Software. 15181624Skmacy * 16181624Skmacy * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17181624Skmacy * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18181624Skmacy * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19181624Skmacy * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20181624Skmacy * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21181624Skmacy * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22181624Skmacy * DEALINGS IN THE SOFTWARE. 23181624Skmacy * 24181624Skmacy * Copyright (c) 2003-2004, K A Fraser. 25181624Skmacy */ 26181624Skmacy 27181624Skmacy#ifndef __XEN_PUBLIC_EVENT_CHANNEL_H__ 28181624Skmacy#define __XEN_PUBLIC_EVENT_CHANNEL_H__ 29181624Skmacy 30181624Skmacy/* 31181624Skmacy * Prototype for this hypercall is: 32181624Skmacy * int event_channel_op(int cmd, void *args) 33181624Skmacy * @cmd == EVTCHNOP_??? (event-channel operation). 34181624Skmacy * @args == Operation-specific extra arguments (NULL if none). 35181624Skmacy */ 36181624Skmacy 37181624Skmacytypedef uint32_t evtchn_port_t; 38181624SkmacyDEFINE_XEN_GUEST_HANDLE(evtchn_port_t); 39181624Skmacy 40181624Skmacy/* 41181624Skmacy * EVTCHNOP_alloc_unbound: Allocate a port in domain <dom> and mark as 42181624Skmacy * accepting interdomain bindings from domain <remote_dom>. A fresh port 43181624Skmacy * is allocated in <dom> and returned as <port>. 44181624Skmacy * NOTES: 45181624Skmacy * 1. If the caller is unprivileged then <dom> must be DOMID_SELF. 46181624Skmacy * 2. <rdom> may be DOMID_SELF, allowing loopback connections. 47181624Skmacy */ 48181624Skmacy#define EVTCHNOP_alloc_unbound 6 49181624Skmacystruct evtchn_alloc_unbound { 50181624Skmacy /* IN parameters */ 51181624Skmacy domid_t dom, remote_dom; 52181624Skmacy /* OUT parameters */ 53181624Skmacy evtchn_port_t port; 54181624Skmacy}; 55181624Skmacytypedef struct evtchn_alloc_unbound evtchn_alloc_unbound_t; 56181624Skmacy 57181624Skmacy/* 58181624Skmacy * EVTCHNOP_bind_interdomain: Construct an interdomain event channel between 59181624Skmacy * the calling domain and <remote_dom>. <remote_dom,remote_port> must identify 60181624Skmacy * a port that is unbound and marked as accepting bindings from the calling 61181624Skmacy * domain. A fresh port is allocated in the calling domain and returned as 62181624Skmacy * <local_port>. 63181624Skmacy * NOTES: 64181624Skmacy * 2. <remote_dom> may be DOMID_SELF, allowing loopback connections. 65181624Skmacy */ 66181624Skmacy#define EVTCHNOP_bind_interdomain 0 67181624Skmacystruct evtchn_bind_interdomain { 68181624Skmacy /* IN parameters. */ 69181624Skmacy domid_t remote_dom; 70181624Skmacy evtchn_port_t remote_port; 71181624Skmacy /* OUT parameters. */ 72181624Skmacy evtchn_port_t local_port; 73181624Skmacy}; 74181624Skmacytypedef struct evtchn_bind_interdomain evtchn_bind_interdomain_t; 75181624Skmacy 76181624Skmacy/* 77181624Skmacy * EVTCHNOP_bind_virq: Bind a local event channel to VIRQ <irq> on specified 78181624Skmacy * vcpu. 79181624Skmacy * NOTES: 80181624Skmacy * 1. Virtual IRQs are classified as per-vcpu or global. See the VIRQ list 81181624Skmacy * in xen.h for the classification of each VIRQ. 82181624Skmacy * 2. Global VIRQs must be allocated on VCPU0 but can subsequently be 83181624Skmacy * re-bound via EVTCHNOP_bind_vcpu. 84181624Skmacy * 3. Per-vcpu VIRQs may be bound to at most one event channel per vcpu. 85181624Skmacy * The allocated event channel is bound to the specified vcpu and the 86181624Skmacy * binding cannot be changed. 87181624Skmacy */ 88181624Skmacy#define EVTCHNOP_bind_virq 1 89181624Skmacystruct evtchn_bind_virq { 90181624Skmacy /* IN parameters. */ 91181624Skmacy uint32_t virq; 92181624Skmacy uint32_t vcpu; 93181624Skmacy /* OUT parameters. */ 94181624Skmacy evtchn_port_t port; 95181624Skmacy}; 96181624Skmacytypedef struct evtchn_bind_virq evtchn_bind_virq_t; 97181624Skmacy 98181624Skmacy/* 99181624Skmacy * EVTCHNOP_bind_pirq: Bind a local event channel to PIRQ <irq>. 100181624Skmacy * NOTES: 101181624Skmacy * 1. A physical IRQ may be bound to at most one event channel per domain. 102181624Skmacy * 2. Only a sufficiently-privileged domain may bind to a physical IRQ. 103181624Skmacy */ 104181624Skmacy#define EVTCHNOP_bind_pirq 2 105181624Skmacystruct evtchn_bind_pirq { 106181624Skmacy /* IN parameters. */ 107181624Skmacy uint32_t pirq; 108181624Skmacy#define BIND_PIRQ__WILL_SHARE 1 109181624Skmacy uint32_t flags; /* BIND_PIRQ__* */ 110181624Skmacy /* OUT parameters. */ 111181624Skmacy evtchn_port_t port; 112181624Skmacy}; 113181624Skmacytypedef struct evtchn_bind_pirq evtchn_bind_pirq_t; 114181624Skmacy 115181624Skmacy/* 116181624Skmacy * EVTCHNOP_bind_ipi: Bind a local event channel to receive events. 117181624Skmacy * NOTES: 118181624Skmacy * 1. The allocated event channel is bound to the specified vcpu. The binding 119181624Skmacy * may not be changed. 120181624Skmacy */ 121181624Skmacy#define EVTCHNOP_bind_ipi 7 122181624Skmacystruct evtchn_bind_ipi { 123181624Skmacy uint32_t vcpu; 124181624Skmacy /* OUT parameters. */ 125181624Skmacy evtchn_port_t port; 126181624Skmacy}; 127181624Skmacytypedef struct evtchn_bind_ipi evtchn_bind_ipi_t; 128181624Skmacy 129181624Skmacy/* 130181624Skmacy * EVTCHNOP_close: Close a local event channel <port>. If the channel is 131181624Skmacy * interdomain then the remote end is placed in the unbound state 132181624Skmacy * (EVTCHNSTAT_unbound), awaiting a new connection. 133181624Skmacy */ 134181624Skmacy#define EVTCHNOP_close 3 135181624Skmacystruct evtchn_close { 136181624Skmacy /* IN parameters. */ 137181624Skmacy evtchn_port_t port; 138181624Skmacy}; 139181624Skmacytypedef struct evtchn_close evtchn_close_t; 140181624Skmacy 141181624Skmacy/* 142181624Skmacy * EVTCHNOP_send: Send an event to the remote end of the channel whose local 143181624Skmacy * endpoint is <port>. 144181624Skmacy */ 145181624Skmacy#define EVTCHNOP_send 4 146181624Skmacystruct evtchn_send { 147181624Skmacy /* IN parameters. */ 148181624Skmacy evtchn_port_t port; 149181624Skmacy}; 150181624Skmacytypedef struct evtchn_send evtchn_send_t; 151181624Skmacy 152181624Skmacy/* 153181624Skmacy * EVTCHNOP_status: Get the current status of the communication channel which 154181624Skmacy * has an endpoint at <dom, port>. 155181624Skmacy * NOTES: 156181624Skmacy * 1. <dom> may be specified as DOMID_SELF. 157181624Skmacy * 2. Only a sufficiently-privileged domain may obtain the status of an event 158181624Skmacy * channel for which <dom> is not DOMID_SELF. 159181624Skmacy */ 160181624Skmacy#define EVTCHNOP_status 5 161181624Skmacystruct evtchn_status { 162181624Skmacy /* IN parameters */ 163181624Skmacy domid_t dom; 164181624Skmacy evtchn_port_t port; 165181624Skmacy /* OUT parameters */ 166181624Skmacy#define EVTCHNSTAT_closed 0 /* Channel is not in use. */ 167181624Skmacy#define EVTCHNSTAT_unbound 1 /* Channel is waiting interdom connection.*/ 168181624Skmacy#define EVTCHNSTAT_interdomain 2 /* Channel is connected to remote domain. */ 169181624Skmacy#define EVTCHNSTAT_pirq 3 /* Channel is bound to a phys IRQ line. */ 170181624Skmacy#define EVTCHNSTAT_virq 4 /* Channel is bound to a virtual IRQ line */ 171181624Skmacy#define EVTCHNSTAT_ipi 5 /* Channel is bound to a virtual IPI line */ 172181624Skmacy uint32_t status; 173181624Skmacy uint32_t vcpu; /* VCPU to which this channel is bound. */ 174181624Skmacy union { 175181624Skmacy struct { 176181624Skmacy domid_t dom; 177181624Skmacy } unbound; /* EVTCHNSTAT_unbound */ 178181624Skmacy struct { 179181624Skmacy domid_t dom; 180181624Skmacy evtchn_port_t port; 181181624Skmacy } interdomain; /* EVTCHNSTAT_interdomain */ 182181624Skmacy uint32_t pirq; /* EVTCHNSTAT_pirq */ 183181624Skmacy uint32_t virq; /* EVTCHNSTAT_virq */ 184181624Skmacy } u; 185181624Skmacy}; 186181624Skmacytypedef struct evtchn_status evtchn_status_t; 187181624Skmacy 188181624Skmacy/* 189181624Skmacy * EVTCHNOP_bind_vcpu: Specify which vcpu a channel should notify when an 190181624Skmacy * event is pending. 191181624Skmacy * NOTES: 192181624Skmacy * 1. IPI-bound channels always notify the vcpu specified at bind time. 193181624Skmacy * This binding cannot be changed. 194181624Skmacy * 2. Per-VCPU VIRQ channels always notify the vcpu specified at bind time. 195181624Skmacy * This binding cannot be changed. 196181624Skmacy * 3. All other channels notify vcpu0 by default. This default is set when 197181624Skmacy * the channel is allocated (a port that is freed and subsequently reused 198181624Skmacy * has its binding reset to vcpu0). 199181624Skmacy */ 200181624Skmacy#define EVTCHNOP_bind_vcpu 8 201181624Skmacystruct evtchn_bind_vcpu { 202181624Skmacy /* IN parameters. */ 203181624Skmacy evtchn_port_t port; 204181624Skmacy uint32_t vcpu; 205181624Skmacy}; 206181624Skmacytypedef struct evtchn_bind_vcpu evtchn_bind_vcpu_t; 207181624Skmacy 208181624Skmacy/* 209181624Skmacy * EVTCHNOP_unmask: Unmask the specified local event-channel port and deliver 210181624Skmacy * a notification to the appropriate VCPU if an event is pending. 211181624Skmacy */ 212181624Skmacy#define EVTCHNOP_unmask 9 213181624Skmacystruct evtchn_unmask { 214181624Skmacy /* IN parameters. */ 215181624Skmacy evtchn_port_t port; 216181624Skmacy}; 217181624Skmacytypedef struct evtchn_unmask evtchn_unmask_t; 218181624Skmacy 219181624Skmacy/* 220181624Skmacy * EVTCHNOP_reset: Close all event channels associated with specified domain. 221181624Skmacy * NOTES: 222181624Skmacy * 1. <dom> may be specified as DOMID_SELF. 223181624Skmacy * 2. Only a sufficiently-privileged domain may specify other than DOMID_SELF. 224181624Skmacy */ 225181624Skmacy#define EVTCHNOP_reset 10 226181624Skmacystruct evtchn_reset { 227181624Skmacy /* IN parameters. */ 228181624Skmacy domid_t dom; 229181624Skmacy}; 230181624Skmacytypedef struct evtchn_reset evtchn_reset_t; 231181624Skmacy 232181624Skmacy/* 233181624Skmacy * Argument to event_channel_op_compat() hypercall. Superceded by new 234181624Skmacy * event_channel_op() hypercall since 0x00030202. 235181624Skmacy */ 236181624Skmacystruct evtchn_op { 237181624Skmacy uint32_t cmd; /* EVTCHNOP_* */ 238181624Skmacy union { 239181624Skmacy struct evtchn_alloc_unbound alloc_unbound; 240181624Skmacy struct evtchn_bind_interdomain bind_interdomain; 241181624Skmacy struct evtchn_bind_virq bind_virq; 242181624Skmacy struct evtchn_bind_pirq bind_pirq; 243181624Skmacy struct evtchn_bind_ipi bind_ipi; 244181624Skmacy struct evtchn_close close; 245181624Skmacy struct evtchn_send send; 246181624Skmacy struct evtchn_status status; 247181624Skmacy struct evtchn_bind_vcpu bind_vcpu; 248181624Skmacy struct evtchn_unmask unmask; 249181624Skmacy } u; 250181624Skmacy}; 251181624Skmacytypedef struct evtchn_op evtchn_op_t; 252181624SkmacyDEFINE_XEN_GUEST_HANDLE(evtchn_op_t); 253181624Skmacy 254181624Skmacy#endif /* __XEN_PUBLIC_EVENT_CHANNEL_H__ */ 255181624Skmacy 256181624Skmacy/* 257181624Skmacy * Local variables: 258181624Skmacy * mode: C 259181624Skmacy * c-set-style: "BSD" 260181624Skmacy * c-basic-offset: 4 261181624Skmacy * tab-width: 4 262181624Skmacy * indent-tabs-mode: nil 263181624Skmacy * End: 264181624Skmacy */ 265