NetBSD-5.0.2/sys/arch/xen/include/xen-public/event_channel.h

Compare this file to the similar file:
Show the results in this format:

/* $NetBSD: event_channel.h,v 1.3 2005/12/11 12:19:49 christos Exp $ */

/*
 * Copyright (c) 2003-2004, K A Fraser.
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to
 * deal in the Software without restriction, including without limitation the
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 * sell copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
 * DEALINGS IN THE SOFTWARE.
 */

/******************************************************************************
 * event_channel.h
 * 
 * Event channels between domains.
 * 
 */

#ifndef __XEN_PUBLIC_EVENT_CHANNEL_H__
#define __XEN_PUBLIC_EVENT_CHANNEL_H__

/*
 * EVTCHNOP_alloc_unbound: Allocate a fresh local port and prepare
 * it for binding to <dom>.
 */
#define EVTCHNOP_alloc_unbound    6
typedef struct {
    /* IN parameters */
    domid_t dom;                      /*  0 */
    u16     __pad;
    /* OUT parameters */
    u32     port;                     /*  4 */
} PACKED evtchn_alloc_unbound_t; /* 8 bytes */

/*
 * EVTCHNOP_bind_interdomain: Construct an interdomain event channel between
 * <dom1> and <dom2>. Either <port1> or <port2> may be wildcarded by setting to
 * zero. On successful return both <port1> and <port2> are filled in and
 * <dom1,port1> is fully bound to <dom2,port2>.
 * 
 * NOTES:
 *  1. A wildcarded port is allocated from the relevant domain's free list
 *     (i.e., some port that was previously EVTCHNSTAT_closed). However, if the
 *     remote port pair is already fully bound then a port is not allocated,
 *     and instead the existing local port is returned to the caller.
 *  2. If the caller is unprivileged then <dom1> must be DOMID_SELF.
 *  3. If the caller is unprivileged and <dom2,port2> is EVTCHNSTAT_closed
 *     then <dom2> must be DOMID_SELF.
 *  4. If either port is already bound then it must be bound to the other
 *     specified domain and port (if not wildcarded).
 *  5. If either port is awaiting binding (EVTCHNSTAT_unbound) then it must
 *     be awaiting binding to the other domain, and the other port pair must
 *     be closed or unbound.
 */
#define EVTCHNOP_bind_interdomain 0
typedef struct {
    /* IN parameters. */
    domid_t dom1, dom2;               /*  0,  2 */
    /* IN/OUT parameters. */
    u32     port1, port2;             /*  4,  8 */
} PACKED evtchn_bind_interdomain_t; /* 12 bytes */

/*
 * EVTCHNOP_bind_virq: Bind a local event channel to IRQ <irq>.
 * NOTES:
 *  1. A virtual IRQ may be bound to at most one event channel per domain.
 */
#define EVTCHNOP_bind_virq        1
typedef struct {
    /* IN parameters. */
    u32 virq;                         /*  0 */
    /* OUT parameters. */
    u32 port;                         /*  4 */
} PACKED evtchn_bind_virq_t; /* 8 bytes */

/*
 * EVTCHNOP_bind_pirq: Bind a local event channel to IRQ <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
typedef struct {
    /* IN parameters. */
    u32 pirq;                         /*  0 */
#define BIND_PIRQ__WILL_SHARE 1
    u32 flags; /* BIND_PIRQ__* */     /*  4 */
    /* OUT parameters. */
    u32 port;                         /*  8 */
} PACKED evtchn_bind_pirq_t; /* 12 bytes */

/*
 * EVTCHNOP_close: Close the communication channel which has an endpoint at
 * <dom, port>. If the channel is interdomain then the remote end is placed in
 * the unbound state (EVTCHNSTAT_unbound), awaiting a new connection.
 * NOTES:
 *  1. <dom> may be specified as DOMID_SELF.
 *  2. Only a sufficiently-privileged domain may close an event channel
 *     for which <dom> is not DOMID_SELF.
 */
#define EVTCHNOP_close            3
typedef struct {
    /* IN parameters. */
    domid_t dom;                      /*  0 */
    u16     __pad;
    u32     port;                     /*  4 */
    /* No OUT parameters. */
} PACKED evtchn_close_t; /* 8 bytes */

/*
 * EVTCHNOP_send: Send an event to the remote end of the channel whose local
 * endpoint is <DOMID_SELF, local_port>.
 */
#define EVTCHNOP_send             4
typedef struct {
    /* IN parameters. */
    u32     local_port;               /*  0 */
    /* No OUT parameters. */
} PACKED evtchn_send_t; /* 4 bytes */

/*
 * 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
typedef struct {
    /* IN parameters */
    domid_t dom;                      /*  0 */
    u16     __pad;
    u32     port;                     /*  4 */
    /* 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 */
    u32     status;                   /*  8 */
    union {                           /* 12 */
        struct {
            domid_t dom;                              /* 12 */
        } PACKED unbound; /* EVTCHNSTAT_unbound */
        struct {
            domid_t dom;                              /* 12 */
            u16     __pad;
            u32     port;                             /* 16 */
        } PACKED interdomain; /* EVTCHNSTAT_interdomain */
        u32 pirq;      /* EVTCHNSTAT_pirq        */   /* 12 */
        u32 virq;      /* EVTCHNSTAT_virq        */   /* 12 */
    } PACKED u;
} PACKED evtchn_status_t; /* 20 bytes */

typedef struct {
    u32 cmd; /* EVTCHNOP_* */         /*  0 */
    u32 __reserved;                   /*  4 */
    union {                           /*  8 */
        evtchn_alloc_unbound_t    alloc_unbound;
        evtchn_bind_interdomain_t bind_interdomain;
        evtchn_bind_virq_t        bind_virq;
        evtchn_bind_pirq_t        bind_pirq;
        evtchn_close_t            close;
        evtchn_send_t             send;
        evtchn_status_t           status;
        u8                        __dummy[24];
    } PACKED u;
} PACKED evtchn_op_t; /* 32 bytes */

#endif /* __XEN_PUBLIC_EVENT_CHANNEL_H__ */