Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: MIT */
0002 
0003 #ifndef __XEN_PUBLIC_IO_XEN_PVCALLS_H__
0004 #define __XEN_PUBLIC_IO_XEN_PVCALLS_H__
0005 
0006 #include <linux/net.h>
0007 #include <xen/interface/io/ring.h>
0008 #include <xen/interface/grant_table.h>
0009 
0010 /* "1" means socket, connect, release, bind, listen, accept and poll */
0011 #define XENBUS_FUNCTIONS_CALLS "1"
0012 
0013 /*
0014  * See docs/misc/pvcalls.markdown in xen.git for the full specification:
0015  * https://xenbits.xen.org/docs/unstable/misc/pvcalls.html
0016  */
0017 struct pvcalls_data_intf {
0018     RING_IDX in_cons, in_prod, in_error;
0019 
0020     uint8_t pad1[52];
0021 
0022     RING_IDX out_cons, out_prod, out_error;
0023 
0024     uint8_t pad2[52];
0025 
0026     RING_IDX ring_order;
0027     grant_ref_t ref[];
0028 };
0029 DEFINE_XEN_FLEX_RING(pvcalls);
0030 
0031 #define PVCALLS_SOCKET         0
0032 #define PVCALLS_CONNECT        1
0033 #define PVCALLS_RELEASE        2
0034 #define PVCALLS_BIND           3
0035 #define PVCALLS_LISTEN         4
0036 #define PVCALLS_ACCEPT         5
0037 #define PVCALLS_POLL           6
0038 
0039 struct xen_pvcalls_request {
0040     uint32_t req_id; /* private to guest, echoed in response */
0041     uint32_t cmd;    /* command to execute */
0042     union {
0043         struct xen_pvcalls_socket {
0044             uint64_t id;
0045             uint32_t domain;
0046             uint32_t type;
0047             uint32_t protocol;
0048         } socket;
0049         struct xen_pvcalls_connect {
0050             uint64_t id;
0051             uint8_t addr[28];
0052             uint32_t len;
0053             uint32_t flags;
0054             grant_ref_t ref;
0055             uint32_t evtchn;
0056         } connect;
0057         struct xen_pvcalls_release {
0058             uint64_t id;
0059             uint8_t reuse;
0060         } release;
0061         struct xen_pvcalls_bind {
0062             uint64_t id;
0063             uint8_t addr[28];
0064             uint32_t len;
0065         } bind;
0066         struct xen_pvcalls_listen {
0067             uint64_t id;
0068             uint32_t backlog;
0069         } listen;
0070         struct xen_pvcalls_accept {
0071             uint64_t id;
0072             uint64_t id_new;
0073             grant_ref_t ref;
0074             uint32_t evtchn;
0075         } accept;
0076         struct xen_pvcalls_poll {
0077             uint64_t id;
0078         } poll;
0079         /* dummy member to force sizeof(struct xen_pvcalls_request)
0080          * to match across archs */
0081         struct xen_pvcalls_dummy {
0082             uint8_t dummy[56];
0083         } dummy;
0084     } u;
0085 };
0086 
0087 struct xen_pvcalls_response {
0088     uint32_t req_id;
0089     uint32_t cmd;
0090     int32_t ret;
0091     uint32_t pad;
0092     union {
0093         struct _xen_pvcalls_socket {
0094             uint64_t id;
0095         } socket;
0096         struct _xen_pvcalls_connect {
0097             uint64_t id;
0098         } connect;
0099         struct _xen_pvcalls_release {
0100             uint64_t id;
0101         } release;
0102         struct _xen_pvcalls_bind {
0103             uint64_t id;
0104         } bind;
0105         struct _xen_pvcalls_listen {
0106             uint64_t id;
0107         } listen;
0108         struct _xen_pvcalls_accept {
0109             uint64_t id;
0110         } accept;
0111         struct _xen_pvcalls_poll {
0112             uint64_t id;
0113         } poll;
0114         struct _xen_pvcalls_dummy {
0115             uint8_t dummy[8];
0116         } dummy;
0117     } u;
0118 };
0119 
0120 DEFINE_RING_TYPES(xen_pvcalls, struct xen_pvcalls_request,
0121                   struct xen_pvcalls_response);
0122 
0123 #endif