|
|
1.1 ! root 1: /****************************************************************************** ! 2: * event_channel.h ! 3: * ! 4: * Event channels between domains. ! 5: * ! 6: * Permission is hereby granted, free of charge, to any person obtaining a copy ! 7: * of this software and associated documentation files (the "Software"), to ! 8: * deal in the Software without restriction, including without limitation the ! 9: * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or ! 10: * sell copies of the Software, and to permit persons to whom the Software is ! 11: * furnished to do so, subject to the following conditions: ! 12: * ! 13: * The above copyright notice and this permission notice shall be included in ! 14: * all copies or substantial portions of the Software. ! 15: * ! 16: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ! 17: * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ! 18: * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ! 19: * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ! 20: * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ! 21: * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ! 22: * DEALINGS IN THE SOFTWARE. ! 23: * ! 24: * Copyright (c) 2003-2004, K A Fraser. ! 25: */ ! 26: ! 27: #ifndef __XEN_PUBLIC_EVENT_CHANNEL_H__ ! 28: #define __XEN_PUBLIC_EVENT_CHANNEL_H__ ! 29: ! 30: /* ! 31: * Prototype for this hypercall is: ! 32: * int event_channel_op(int cmd, void *args) ! 33: * @cmd == EVTCHNOP_??? (event-channel operation). ! 34: * @args == Operation-specific extra arguments (NULL if none). ! 35: */ ! 36: ! 37: typedef uint32_t evtchn_port_t; ! 38: DEFINE_XEN_GUEST_HANDLE(evtchn_port_t); ! 39: ! 40: /* ! 41: * EVTCHNOP_alloc_unbound: Allocate a port in domain <dom> and mark as ! 42: * accepting interdomain bindings from domain <remote_dom>. A fresh port ! 43: * is allocated in <dom> and returned as <port>. ! 44: * NOTES: ! 45: * 1. If the caller is unprivileged then <dom> must be DOMID_SELF. ! 46: * 2. <rdom> may be DOMID_SELF, allowing loopback connections. ! 47: */ ! 48: #define EVTCHNOP_alloc_unbound 6 ! 49: struct evtchn_alloc_unbound { ! 50: /* IN parameters */ ! 51: domid_t dom, remote_dom; ! 52: /* OUT parameters */ ! 53: evtchn_port_t port; ! 54: }; ! 55: typedef struct evtchn_alloc_unbound evtchn_alloc_unbound_t; ! 56: ! 57: /* ! 58: * EVTCHNOP_bind_interdomain: Construct an interdomain event channel between ! 59: * the calling domain and <remote_dom>. <remote_dom,remote_port> must identify ! 60: * a port that is unbound and marked as accepting bindings from the calling ! 61: * domain. A fresh port is allocated in the calling domain and returned as ! 62: * <local_port>. ! 63: * NOTES: ! 64: * 2. <remote_dom> may be DOMID_SELF, allowing loopback connections. ! 65: */ ! 66: #define EVTCHNOP_bind_interdomain 0 ! 67: struct evtchn_bind_interdomain { ! 68: /* IN parameters. */ ! 69: domid_t remote_dom; ! 70: evtchn_port_t remote_port; ! 71: /* OUT parameters. */ ! 72: evtchn_port_t local_port; ! 73: }; ! 74: typedef struct evtchn_bind_interdomain evtchn_bind_interdomain_t; ! 75: ! 76: /* ! 77: * EVTCHNOP_bind_virq: Bind a local event channel to VIRQ <irq> on specified ! 78: * vcpu. ! 79: * NOTES: ! 80: * 1. Virtual IRQs are classified as per-vcpu or global. See the VIRQ list ! 81: * in xen.h for the classification of each VIRQ. ! 82: * 2. Global VIRQs must be allocated on VCPU0 but can subsequently be ! 83: * re-bound via EVTCHNOP_bind_vcpu. ! 84: * 3. Per-vcpu VIRQs may be bound to at most one event channel per vcpu. ! 85: * The allocated event channel is bound to the specified vcpu and the ! 86: * binding cannot be changed. ! 87: */ ! 88: #define EVTCHNOP_bind_virq 1 ! 89: struct evtchn_bind_virq { ! 90: /* IN parameters. */ ! 91: uint32_t virq; ! 92: uint32_t vcpu; ! 93: /* OUT parameters. */ ! 94: evtchn_port_t port; ! 95: }; ! 96: typedef struct evtchn_bind_virq evtchn_bind_virq_t; ! 97: ! 98: /* ! 99: * EVTCHNOP_bind_pirq: Bind a local event channel to PIRQ <irq>. ! 100: * NOTES: ! 101: * 1. A physical IRQ may be bound to at most one event channel per domain. ! 102: * 2. Only a sufficiently-privileged domain may bind to a physical IRQ. ! 103: */ ! 104: #define EVTCHNOP_bind_pirq 2 ! 105: struct evtchn_bind_pirq { ! 106: /* IN parameters. */ ! 107: uint32_t pirq; ! 108: #define BIND_PIRQ__WILL_SHARE 1 ! 109: uint32_t flags; /* BIND_PIRQ__* */ ! 110: /* OUT parameters. */ ! 111: evtchn_port_t port; ! 112: }; ! 113: typedef struct evtchn_bind_pirq evtchn_bind_pirq_t; ! 114: ! 115: /* ! 116: * EVTCHNOP_bind_ipi: Bind a local event channel to receive events. ! 117: * NOTES: ! 118: * 1. The allocated event channel is bound to the specified vcpu. The binding ! 119: * may not be changed. ! 120: */ ! 121: #define EVTCHNOP_bind_ipi 7 ! 122: struct evtchn_bind_ipi { ! 123: uint32_t vcpu; ! 124: /* OUT parameters. */ ! 125: evtchn_port_t port; ! 126: }; ! 127: typedef struct evtchn_bind_ipi evtchn_bind_ipi_t; ! 128: ! 129: /* ! 130: * EVTCHNOP_close: Close a local event channel <port>. If the channel is ! 131: * interdomain then the remote end is placed in the unbound state ! 132: * (EVTCHNSTAT_unbound), awaiting a new connection. ! 133: */ ! 134: #define EVTCHNOP_close 3 ! 135: struct evtchn_close { ! 136: /* IN parameters. */ ! 137: evtchn_port_t port; ! 138: }; ! 139: typedef struct evtchn_close evtchn_close_t; ! 140: ! 141: /* ! 142: * EVTCHNOP_send: Send an event to the remote end of the channel whose local ! 143: * endpoint is <port>. ! 144: */ ! 145: #define EVTCHNOP_send 4 ! 146: struct evtchn_send { ! 147: /* IN parameters. */ ! 148: evtchn_port_t port; ! 149: }; ! 150: typedef struct evtchn_send evtchn_send_t; ! 151: ! 152: /* ! 153: * EVTCHNOP_status: Get the current status of the communication channel which ! 154: * has an endpoint at <dom, port>. ! 155: * NOTES: ! 156: * 1. <dom> may be specified as DOMID_SELF. ! 157: * 2. Only a sufficiently-privileged domain may obtain the status of an event ! 158: * channel for which <dom> is not DOMID_SELF. ! 159: */ ! 160: #define EVTCHNOP_status 5 ! 161: struct evtchn_status { ! 162: /* IN parameters */ ! 163: domid_t dom; ! 164: evtchn_port_t port; ! 165: /* OUT parameters */ ! 166: #define EVTCHNSTAT_closed 0 /* Channel is not in use. */ ! 167: #define EVTCHNSTAT_unbound 1 /* Channel is waiting interdom connection.*/ ! 168: #define EVTCHNSTAT_interdomain 2 /* Channel is connected to remote domain. */ ! 169: #define EVTCHNSTAT_pirq 3 /* Channel is bound to a phys IRQ line. */ ! 170: #define EVTCHNSTAT_virq 4 /* Channel is bound to a virtual IRQ line */ ! 171: #define EVTCHNSTAT_ipi 5 /* Channel is bound to a virtual IPI line */ ! 172: uint32_t status; ! 173: uint32_t vcpu; /* VCPU to which this channel is bound. */ ! 174: union { ! 175: struct { ! 176: domid_t dom; ! 177: } unbound; /* EVTCHNSTAT_unbound */ ! 178: struct { ! 179: domid_t dom; ! 180: evtchn_port_t port; ! 181: } interdomain; /* EVTCHNSTAT_interdomain */ ! 182: uint32_t pirq; /* EVTCHNSTAT_pirq */ ! 183: uint32_t virq; /* EVTCHNSTAT_virq */ ! 184: } u; ! 185: }; ! 186: typedef struct evtchn_status evtchn_status_t; ! 187: ! 188: /* ! 189: * EVTCHNOP_bind_vcpu: Specify which vcpu a channel should notify when an ! 190: * event is pending. ! 191: * NOTES: ! 192: * 1. IPI-bound channels always notify the vcpu specified at bind time. ! 193: * This binding cannot be changed. ! 194: * 2. Per-VCPU VIRQ channels always notify the vcpu specified at bind time. ! 195: * This binding cannot be changed. ! 196: * 3. All other channels notify vcpu0 by default. This default is set when ! 197: * the channel is allocated (a port that is freed and subsequently reused ! 198: * has its binding reset to vcpu0). ! 199: */ ! 200: #define EVTCHNOP_bind_vcpu 8 ! 201: struct evtchn_bind_vcpu { ! 202: /* IN parameters. */ ! 203: evtchn_port_t port; ! 204: uint32_t vcpu; ! 205: }; ! 206: typedef struct evtchn_bind_vcpu evtchn_bind_vcpu_t; ! 207: ! 208: /* ! 209: * EVTCHNOP_unmask: Unmask the specified local event-channel port and deliver ! 210: * a notification to the appropriate VCPU if an event is pending. ! 211: */ ! 212: #define EVTCHNOP_unmask 9 ! 213: struct evtchn_unmask { ! 214: /* IN parameters. */ ! 215: evtchn_port_t port; ! 216: }; ! 217: typedef struct evtchn_unmask evtchn_unmask_t; ! 218: ! 219: /* ! 220: * EVTCHNOP_reset: Close all event channels associated with specified domain. ! 221: * NOTES: ! 222: * 1. <dom> may be specified as DOMID_SELF. ! 223: * 2. Only a sufficiently-privileged domain may specify other than DOMID_SELF. ! 224: */ ! 225: #define EVTCHNOP_reset 10 ! 226: struct evtchn_reset { ! 227: /* IN parameters. */ ! 228: domid_t dom; ! 229: }; ! 230: typedef struct evtchn_reset evtchn_reset_t; ! 231: ! 232: /* ! 233: * Argument to event_channel_op_compat() hypercall. Superceded by new ! 234: * event_channel_op() hypercall since 0x00030202. ! 235: */ ! 236: struct evtchn_op { ! 237: uint32_t cmd; /* EVTCHNOP_* */ ! 238: union { ! 239: struct evtchn_alloc_unbound alloc_unbound; ! 240: struct evtchn_bind_interdomain bind_interdomain; ! 241: struct evtchn_bind_virq bind_virq; ! 242: struct evtchn_bind_pirq bind_pirq; ! 243: struct evtchn_bind_ipi bind_ipi; ! 244: struct evtchn_close close; ! 245: struct evtchn_send send; ! 246: struct evtchn_status status; ! 247: struct evtchn_bind_vcpu bind_vcpu; ! 248: struct evtchn_unmask unmask; ! 249: } u; ! 250: }; ! 251: typedef struct evtchn_op evtchn_op_t; ! 252: DEFINE_XEN_GUEST_HANDLE(evtchn_op_t); ! 253: ! 254: #endif /* __XEN_PUBLIC_EVENT_CHANNEL_H__ */ ! 255: ! 256: /* ! 257: * Local variables: ! 258: * mode: C ! 259: * c-set-style: "BSD" ! 260: * c-basic-offset: 4 ! 261: * tab-width: 4 ! 262: * indent-tabs-mode: nil ! 263: * End: ! 264: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.