2007-07-17 18:37:04 -07:00
/******************************************************************************
* 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__
2008-12-16 12:37:07 -08:00
# include <xen/interface/xen.h>
2007-07-17 18:37:04 -07:00
typedef uint32_t evtchn_port_t ;
DEFINE_GUEST_HANDLE ( evtchn_port_t ) ;
/*
* 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 6
struct evtchn_alloc_unbound {
/* IN parameters */
domid_t dom , remote_dom ;
/* OUT parameters */
evtchn_port_t port ;
} ;
/*
* 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 0
struct evtchn_bind_interdomain {
/* IN parameters. */
domid_t remote_dom ;
evtchn_port_t remote_port ;
/* OUT parameters. */
evtchn_port_t local_port ;
} ;
/*
* 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 1
struct evtchn_bind_virq {
/* IN parameters. */
uint32_t virq ;
uint32_t vcpu ;
/* OUT parameters. */
evtchn_port_t port ;
} ;
/*
* 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 2
struct evtchn_bind_pirq {
/* IN parameters. */
uint32_t pirq ;
# define BIND_PIRQ__WILL_SHARE 1
uint32_t flags ; /* BIND_PIRQ__* */
/* OUT parameters. */
evtchn_port_t port ;
} ;
/*
* 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 7
struct evtchn_bind_ipi {
uint32_t vcpu ;
/* OUT parameters. */
evtchn_port_t port ;
} ;
/*
* 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 3
struct evtchn_close {
/* IN parameters. */
evtchn_port_t port ;
} ;
/*
* EVTCHNOP_send : Send an event to the remote end of the channel whose local
* endpoint is < port > .
*/
# define EVTCHNOP_send 4
struct evtchn_send {
/* IN parameters. */
evtchn_port_t port ;
} ;
/*
* 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 5
struct evtchn_status {
/* IN parameters */
domid_t dom ;
evtchn_port_t port ;
/* OUT parameters */
# define EVTCHNSTAT_closed 0 /* Channel is not in use. */
# define EVTCHNSTAT_unbound 1 /* Channel is waiting interdom connection.*/
# define EVTCHNSTAT_interdomain 2 /* Channel is connected to remote domain. */
# define EVTCHNSTAT_pirq 3 /* Channel is bound to a phys IRQ line. */
# define EVTCHNSTAT_virq 4 /* Channel is bound to a virtual IRQ line */
# define EVTCHNSTAT_ipi 5 /* Channel is bound to a virtual IPI line */
uint32_t status ;
uint32_t vcpu ; /* VCPU to which this channel is bound. */
union {
struct {
domid_t dom ;
} unbound ; /* EVTCHNSTAT_unbound */
struct {
domid_t dom ;
evtchn_port_t port ;
} interdomain ; /* EVTCHNSTAT_interdomain */
uint32_t pirq ; /* EVTCHNSTAT_pirq */
uint32_t virq ; /* EVTCHNSTAT_virq */
} u ;
} ;
/*
* 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 8
struct evtchn_bind_vcpu {
/* IN parameters. */
evtchn_port_t port ;
uint32_t 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 9
struct evtchn_unmask {
/* IN parameters. */
evtchn_port_t port ;
} ;
struct evtchn_op {
uint32_t cmd ; /* EVTCHNOP_* */
union {
struct evtchn_alloc_unbound alloc_unbound ;
struct evtchn_bind_interdomain bind_interdomain ;
struct evtchn_bind_virq bind_virq ;
struct evtchn_bind_pirq bind_pirq ;
struct evtchn_bind_ipi bind_ipi ;
struct evtchn_close close ;
struct evtchn_send send ;
struct evtchn_status status ;
struct evtchn_bind_vcpu bind_vcpu ;
struct evtchn_unmask unmask ;
} u ;
} ;
DEFINE_GUEST_HANDLE_STRUCT ( evtchn_op ) ;
# endif /* __XEN_PUBLIC_EVENT_CHANNEL_H__ */