/* SPDX-License-Identifier: MIT */ /****************************************************************************** * event_channel.h * * Event channels between domains. * * Copyright (c) 2003-2004, K A Fraser. */ #ifndef __XEN_PUBLIC_EVENT_CHANNEL_H__ #define __XEN_PUBLIC_EVENT_CHANNEL_H__ #include <xen/interface/xen.h> evtchn_port_t; DEFINE_GUEST_HANDLE(…); /* * EVTCHNOP_alloc_unbound: Allocate a port in domain <dom> and mark as * accepting interdomain bindings from domain <remote_dom>. A fresh port * is allocated in <dom> and returned as <port>. * NOTES: * 1. If the caller is unprivileged then <dom> must be DOMID_SELF. * 2. <rdom> may be DOMID_SELF, allowing loopback connections. */ #define EVTCHNOP_alloc_unbound … struct evtchn_alloc_unbound { … }; /* * EVTCHNOP_bind_interdomain: Construct an interdomain event channel between * the calling domain and <remote_dom>. <remote_dom,remote_port> must identify * a port that is unbound and marked as accepting bindings from the calling * domain. A fresh port is allocated in the calling domain and returned as * <local_port>. * NOTES: * 2. <remote_dom> may be DOMID_SELF, allowing loopback connections. */ #define EVTCHNOP_bind_interdomain … struct evtchn_bind_interdomain { … }; /* * EVTCHNOP_bind_virq: Bind a local event channel to VIRQ <irq> on specified * vcpu. * NOTES: * 1. A virtual IRQ may be bound to at most one event channel per vcpu. * 2. The allocated event channel is bound to the specified vcpu. The binding * may not be changed. */ #define EVTCHNOP_bind_virq … struct evtchn_bind_virq { … }; /* * EVTCHNOP_bind_pirq: Bind a local event channel to PIRQ <irq>. * NOTES: * 1. A physical IRQ may be bound to at most one event channel per domain. * 2. Only a sufficiently-privileged domain may bind to a physical IRQ. */ #define EVTCHNOP_bind_pirq … struct evtchn_bind_pirq { … }; /* * EVTCHNOP_bind_ipi: Bind a local event channel to receive events. * NOTES: * 1. The allocated event channel is bound to the specified vcpu. The binding * may not be changed. */ #define EVTCHNOP_bind_ipi … struct evtchn_bind_ipi { … }; /* * EVTCHNOP_close: Close a local event channel <port>. If the channel is * interdomain then the remote end is placed in the unbound state * (EVTCHNSTAT_unbound), awaiting a new connection. */ #define EVTCHNOP_close … struct evtchn_close { … }; /* * EVTCHNOP_send: Send an event to the remote end of the channel whose local * endpoint is <port>. */ #define EVTCHNOP_send … struct evtchn_send { … }; /* * EVTCHNOP_status: Get the current status of the communication channel which * has an endpoint at <dom, port>. * NOTES: * 1. <dom> may be specified as DOMID_SELF. * 2. Only a sufficiently-privileged domain may obtain the status of an event * channel for which <dom> is not DOMID_SELF. */ #define EVTCHNOP_status … struct evtchn_status { … }; /* * EVTCHNOP_bind_vcpu: Specify which vcpu a channel should notify when an * event is pending. * NOTES: * 1. IPI- and VIRQ-bound channels always notify the vcpu that initialised * the binding. This binding cannot be changed. * 2. All other channels notify vcpu0 by default. This default is set when * the channel is allocated (a port that is freed and subsequently reused * has its binding reset to vcpu0). */ #define EVTCHNOP_bind_vcpu … struct evtchn_bind_vcpu { … }; /* * EVTCHNOP_unmask: Unmask the specified local event-channel port and deliver * a notification to the appropriate VCPU if an event is pending. */ #define EVTCHNOP_unmask … struct evtchn_unmask { … }; /* * EVTCHNOP_reset: Close all event channels associated with specified domain. * NOTES: * 1. <dom> may be specified as DOMID_SELF. * 2. Only a sufficiently-privileged domain may specify other than DOMID_SELF. */ #define EVTCHNOP_reset … struct evtchn_reset { … }; evtchn_reset_t; /* * EVTCHNOP_init_control: initialize the control block for the FIFO ABI. */ #define EVTCHNOP_init_control … struct evtchn_init_control { … }; /* * EVTCHNOP_expand_array: add an additional page to the event array. */ #define EVTCHNOP_expand_array … struct evtchn_expand_array { … }; /* * EVTCHNOP_set_priority: set the priority for an event channel. */ #define EVTCHNOP_set_priority … struct evtchn_set_priority { … }; struct evtchn_op { … }; DEFINE_GUEST_HANDLE_STRUCT(…); /* * 2-level ABI */ #define EVTCHN_2L_NR_CHANNELS … /* * FIFO ABI */ /* Events may have priorities from 0 (highest) to 15 (lowest). */ #define EVTCHN_FIFO_PRIORITY_MAX … #define EVTCHN_FIFO_PRIORITY_DEFAULT … #define EVTCHN_FIFO_PRIORITY_MIN … #define EVTCHN_FIFO_MAX_QUEUES … event_word_t; #define EVTCHN_FIFO_PENDING … #define EVTCHN_FIFO_MASKED … #define EVTCHN_FIFO_LINKED … #define EVTCHN_FIFO_BUSY … #define EVTCHN_FIFO_LINK_BITS … #define EVTCHN_FIFO_LINK_MASK … #define EVTCHN_FIFO_NR_CHANNELS … struct evtchn_fifo_control_block { … }; #endif /* __XEN_PUBLIC_EVENT_CHANNEL_H__ */