linux/include/xen/interface/event_channel.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/******************************************************************************
   3 * event_channel.h
   4 *
   5 * Event channels between domains.
   6 *
   7 * Copyright (c) 2003-2004, K A Fraser.
   8 */
   9
  10#ifndef __XEN_PUBLIC_EVENT_CHANNEL_H__
  11#define __XEN_PUBLIC_EVENT_CHANNEL_H__
  12
  13#include <xen/interface/xen.h>
  14
  15typedef uint32_t evtchn_port_t;
  16DEFINE_GUEST_HANDLE(evtchn_port_t);
  17
  18/*
  19 * EVTCHNOP_alloc_unbound: Allocate a port in domain <dom> and mark as
  20 * accepting interdomain bindings from domain <remote_dom>. A fresh port
  21 * is allocated in <dom> and returned as <port>.
  22 * NOTES:
  23 *  1. If the caller is unprivileged then <dom> must be DOMID_SELF.
  24 *  2. <rdom> may be DOMID_SELF, allowing loopback connections.
  25 */
  26#define EVTCHNOP_alloc_unbound    6
  27struct evtchn_alloc_unbound {
  28        /* IN parameters */
  29        domid_t dom, remote_dom;
  30        /* OUT parameters */
  31        evtchn_port_t port;
  32};
  33
  34/*
  35 * EVTCHNOP_bind_interdomain: Construct an interdomain event channel between
  36 * the calling domain and <remote_dom>. <remote_dom,remote_port> must identify
  37 * a port that is unbound and marked as accepting bindings from the calling
  38 * domain. A fresh port is allocated in the calling domain and returned as
  39 * <local_port>.
  40 * NOTES:
  41 *  2. <remote_dom> may be DOMID_SELF, allowing loopback connections.
  42 */
  43#define EVTCHNOP_bind_interdomain 0
  44struct evtchn_bind_interdomain {
  45        /* IN parameters. */
  46        domid_t remote_dom;
  47        evtchn_port_t remote_port;
  48        /* OUT parameters. */
  49        evtchn_port_t local_port;
  50};
  51
  52/*
  53 * EVTCHNOP_bind_virq: Bind a local event channel to VIRQ <irq> on specified
  54 * vcpu.
  55 * NOTES:
  56 *  1. A virtual IRQ may be bound to at most one event channel per vcpu.
  57 *  2. The allocated event channel is bound to the specified vcpu. The binding
  58 *     may not be changed.
  59 */
  60#define EVTCHNOP_bind_virq        1
  61struct evtchn_bind_virq {
  62        /* IN parameters. */
  63        uint32_t virq;
  64        uint32_t vcpu;
  65        /* OUT parameters. */
  66        evtchn_port_t port;
  67};
  68
  69/*
  70 * EVTCHNOP_bind_pirq: Bind a local event channel to PIRQ <irq>.
  71 * NOTES:
  72 *  1. A physical IRQ may be bound to at most one event channel per domain.
  73 *  2. Only a sufficiently-privileged domain may bind to a physical IRQ.
  74 */
  75#define EVTCHNOP_bind_pirq        2
  76struct evtchn_bind_pirq {
  77        /* IN parameters. */
  78        uint32_t pirq;
  79#define BIND_PIRQ__WILL_SHARE 1
  80        uint32_t flags; /* BIND_PIRQ__* */
  81        /* OUT parameters. */
  82        evtchn_port_t port;
  83};
  84
  85/*
  86 * EVTCHNOP_bind_ipi: Bind a local event channel to receive events.
  87 * NOTES:
  88 *  1. The allocated event channel is bound to the specified vcpu. The binding
  89 *     may not be changed.
  90 */
  91#define EVTCHNOP_bind_ipi         7
  92struct evtchn_bind_ipi {
  93        uint32_t vcpu;
  94        /* OUT parameters. */
  95        evtchn_port_t port;
  96};
  97
  98/*
  99 * EVTCHNOP_close: Close a local event channel <port>. If the channel is
 100 * interdomain then the remote end is placed in the unbound state
 101 * (EVTCHNSTAT_unbound), awaiting a new connection.
 102 */
 103#define EVTCHNOP_close            3
 104struct evtchn_close {
 105        /* IN parameters. */
 106        evtchn_port_t port;
 107};
 108
 109/*
 110 * EVTCHNOP_send: Send an event to the remote end of the channel whose local
 111 * endpoint is <port>.
 112 */
 113#define EVTCHNOP_send             4
 114struct evtchn_send {
 115        /* IN parameters. */
 116        evtchn_port_t port;
 117};
 118
 119/*
 120 * EVTCHNOP_status: Get the current status of the communication channel which
 121 * has an endpoint at <dom, port>.
 122 * NOTES:
 123 *  1. <dom> may be specified as DOMID_SELF.
 124 *  2. Only a sufficiently-privileged domain may obtain the status of an event
 125 *     channel for which <dom> is not DOMID_SELF.
 126 */
 127#define EVTCHNOP_status           5
 128struct evtchn_status {
 129        /* IN parameters */
 130        domid_t  dom;
 131        evtchn_port_t port;
 132        /* OUT parameters */
 133#define EVTCHNSTAT_closed       0  /* Channel is not in use.                 */
 134#define EVTCHNSTAT_unbound      1  /* Channel is waiting interdom connection.*/
 135#define EVTCHNSTAT_interdomain  2  /* Channel is connected to remote domain. */
 136#define EVTCHNSTAT_pirq         3  /* Channel is bound to a phys IRQ line.   */
 137#define EVTCHNSTAT_virq         4  /* Channel is bound to a virtual IRQ line */
 138#define EVTCHNSTAT_ipi          5  /* Channel is bound to a virtual IPI line */
 139        uint32_t status;
 140        uint32_t vcpu;             /* VCPU to which this channel is bound.   */
 141        union {
 142                struct {
 143                        domid_t dom;
 144                } unbound; /* EVTCHNSTAT_unbound */
 145                struct {
 146                        domid_t dom;
 147                        evtchn_port_t port;
 148                } interdomain; /* EVTCHNSTAT_interdomain */
 149                uint32_t pirq;      /* EVTCHNSTAT_pirq        */
 150                uint32_t virq;      /* EVTCHNSTAT_virq        */
 151        } u;
 152};
 153
 154/*
 155 * EVTCHNOP_bind_vcpu: Specify which vcpu a channel should notify when an
 156 * event is pending.
 157 * NOTES:
 158 *  1. IPI- and VIRQ-bound channels always notify the vcpu that initialised
 159 *     the binding. This binding cannot be changed.
 160 *  2. All other channels notify vcpu0 by default. This default is set when
 161 *     the channel is allocated (a port that is freed and subsequently reused
 162 *     has its binding reset to vcpu0).
 163 */
 164#define EVTCHNOP_bind_vcpu        8
 165struct evtchn_bind_vcpu {
 166        /* IN parameters. */
 167        evtchn_port_t port;
 168        uint32_t vcpu;
 169};
 170
 171/*
 172 * EVTCHNOP_unmask: Unmask the specified local event-channel port and deliver
 173 * a notification to the appropriate VCPU if an event is pending.
 174 */
 175#define EVTCHNOP_unmask           9
 176struct evtchn_unmask {
 177        /* IN parameters. */
 178        evtchn_port_t port;
 179};
 180
 181/*
 182 * EVTCHNOP_reset: Close all event channels associated with specified domain.
 183 * NOTES:
 184 *  1. <dom> may be specified as DOMID_SELF.
 185 *  2. Only a sufficiently-privileged domain may specify other than DOMID_SELF.
 186 */
 187#define EVTCHNOP_reset           10
 188struct evtchn_reset {
 189        /* IN parameters. */
 190        domid_t dom;
 191};
 192typedef struct evtchn_reset evtchn_reset_t;
 193
 194/*
 195 * EVTCHNOP_init_control: initialize the control block for the FIFO ABI.
 196 */
 197#define EVTCHNOP_init_control    11
 198struct evtchn_init_control {
 199        /* IN parameters. */
 200        uint64_t control_gfn;
 201        uint32_t offset;
 202        uint32_t vcpu;
 203        /* OUT parameters. */
 204        uint8_t link_bits;
 205        uint8_t _pad[7];
 206};
 207
 208/*
 209 * EVTCHNOP_expand_array: add an additional page to the event array.
 210 */
 211#define EVTCHNOP_expand_array    12
 212struct evtchn_expand_array {
 213        /* IN parameters. */
 214        uint64_t array_gfn;
 215};
 216
 217/*
 218 * EVTCHNOP_set_priority: set the priority for an event channel.
 219 */
 220#define EVTCHNOP_set_priority    13
 221struct evtchn_set_priority {
 222        /* IN parameters. */
 223        evtchn_port_t port;
 224        uint32_t priority;
 225};
 226
 227struct evtchn_op {
 228        uint32_t cmd; /* EVTCHNOP_* */
 229        union {
 230                struct evtchn_alloc_unbound    alloc_unbound;
 231                struct evtchn_bind_interdomain bind_interdomain;
 232                struct evtchn_bind_virq        bind_virq;
 233                struct evtchn_bind_pirq        bind_pirq;
 234                struct evtchn_bind_ipi         bind_ipi;
 235                struct evtchn_close            close;
 236                struct evtchn_send             send;
 237                struct evtchn_status           status;
 238                struct evtchn_bind_vcpu        bind_vcpu;
 239                struct evtchn_unmask           unmask;
 240        } u;
 241};
 242DEFINE_GUEST_HANDLE_STRUCT(evtchn_op);
 243
 244/*
 245 * 2-level ABI
 246 */
 247
 248#define EVTCHN_2L_NR_CHANNELS (sizeof(xen_ulong_t) * sizeof(xen_ulong_t) * 64)
 249
 250/*
 251 * FIFO ABI
 252 */
 253
 254/* Events may have priorities from 0 (highest) to 15 (lowest). */
 255#define EVTCHN_FIFO_PRIORITY_MAX     0
 256#define EVTCHN_FIFO_PRIORITY_DEFAULT 7
 257#define EVTCHN_FIFO_PRIORITY_MIN     15
 258
 259#define EVTCHN_FIFO_MAX_QUEUES (EVTCHN_FIFO_PRIORITY_MIN + 1)
 260
 261typedef uint32_t event_word_t;
 262
 263#define EVTCHN_FIFO_PENDING 31
 264#define EVTCHN_FIFO_MASKED  30
 265#define EVTCHN_FIFO_LINKED  29
 266#define EVTCHN_FIFO_BUSY    28
 267
 268#define EVTCHN_FIFO_LINK_BITS 17
 269#define EVTCHN_FIFO_LINK_MASK ((1 << EVTCHN_FIFO_LINK_BITS) - 1)
 270
 271#define EVTCHN_FIFO_NR_CHANNELS (1 << EVTCHN_FIFO_LINK_BITS)
 272
 273struct evtchn_fifo_control_block {
 274        uint32_t     ready;
 275        uint32_t     _rsvd;
 276        event_word_t head[EVTCHN_FIFO_MAX_QUEUES];
 277};
 278
 279#endif /* __XEN_PUBLIC_EVENT_CHANNEL_H__ */
 280