Home | History | Annotate | Line # | Download | only in io
      1 /*
      2  * pvcalls.h -- Xen PV Calls Protocol
      3  *
      4  * Refer to docs/misc/pvcalls.markdown for the specification
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining a copy
      7  * of this software and associated documentation files (the "Software"), to
      8  * deal in the Software without restriction, including without limitation the
      9  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
     10  * sell copies of the Software, and to permit persons to whom the Software is
     11  * furnished to do so, subject to the following conditions:
     12  *
     13  * The above copyright notice and this permission notice shall be included in
     14  * all copies or substantial portions of the Software.
     15  *
     16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     22  * DEALINGS IN THE SOFTWARE.
     23  *
     24  * Copyright (C) 2017 Stefano Stabellini <stefano (at) aporeto.com>
     25  */
     26 
     27 #ifndef __XEN_PUBLIC_IO_PVCALLS_H__
     28 #define __XEN_PUBLIC_IO_PVCALLS_H__
     29 
     30 #include "../grant_table.h"
     31 #include "ring.h"
     32 
     33 /*
     34  * See docs/misc/pvcalls.markdown in xen.git for the full specification:
     35  * https://xenbits.xen.org/docs/unstable/misc/pvcalls.html
     36  */
     37 struct pvcalls_data_intf {
     38     RING_IDX in_cons, in_prod, in_error;
     39 
     40     uint8_t pad1[52];
     41 
     42     RING_IDX out_cons, out_prod, out_error;
     43 
     44     uint8_t pad2[52];
     45 
     46     RING_IDX ring_order;
     47     grant_ref_t ref[];
     48 };
     49 DEFINE_XEN_FLEX_RING(pvcalls);
     50 
     51 #define PVCALLS_SOCKET         0
     52 #define PVCALLS_CONNECT        1
     53 #define PVCALLS_RELEASE        2
     54 #define PVCALLS_BIND           3
     55 #define PVCALLS_LISTEN         4
     56 #define PVCALLS_ACCEPT         5
     57 #define PVCALLS_POLL           6
     58 
     59 struct xen_pvcalls_request {
     60     uint32_t req_id; /* private to guest, echoed in response */
     61     uint32_t cmd;    /* command to execute */
     62     union {
     63         struct xen_pvcalls_socket {
     64             uint64_t id;
     65             uint32_t domain;
     66             uint32_t type;
     67             uint32_t protocol;
     68         } socket;
     69         struct xen_pvcalls_connect {
     70             uint64_t id;
     71             uint8_t addr[28];
     72             uint32_t len;
     73             uint32_t flags;
     74             grant_ref_t ref;
     75             uint32_t evtchn;
     76         } connect;
     77         struct xen_pvcalls_release {
     78             uint64_t id;
     79             uint8_t reuse;
     80         } release;
     81         struct xen_pvcalls_bind {
     82             uint64_t id;
     83             uint8_t addr[28];
     84             uint32_t len;
     85         } bind;
     86         struct xen_pvcalls_listen {
     87             uint64_t id;
     88             uint32_t backlog;
     89         } listen;
     90         struct xen_pvcalls_accept {
     91             uint64_t id;
     92             uint64_t id_new;
     93             grant_ref_t ref;
     94             uint32_t evtchn;
     95         } accept;
     96         struct xen_pvcalls_poll {
     97             uint64_t id;
     98         } poll;
     99         /* dummy member to force sizeof(struct xen_pvcalls_request)
    100          * to match across archs */
    101         struct xen_pvcalls_dummy {
    102             uint8_t dummy[56];
    103         } dummy;
    104     } u;
    105 };
    106 
    107 struct xen_pvcalls_response {
    108     uint32_t req_id;
    109     uint32_t cmd;
    110     int32_t ret;
    111     uint32_t pad;
    112     union {
    113         struct _xen_pvcalls_socket {
    114             uint64_t id;
    115         } socket;
    116         struct _xen_pvcalls_connect {
    117             uint64_t id;
    118         } connect;
    119         struct _xen_pvcalls_release {
    120             uint64_t id;
    121         } release;
    122         struct _xen_pvcalls_bind {
    123             uint64_t id;
    124         } bind;
    125         struct _xen_pvcalls_listen {
    126             uint64_t id;
    127         } listen;
    128         struct _xen_pvcalls_accept {
    129             uint64_t id;
    130         } accept;
    131         struct _xen_pvcalls_poll {
    132             uint64_t id;
    133         } poll;
    134         struct _xen_pvcalls_dummy {
    135             uint8_t dummy[8];
    136         } dummy;
    137     } u;
    138 };
    139 
    140 DEFINE_RING_TYPES(xen_pvcalls, struct xen_pvcalls_request,
    141                   struct xen_pvcalls_response);
    142 
    143 #endif
    144 
    145 /*
    146  * Local variables:
    147  * mode: C
    148  * c-file-style: "BSD"
    149  * c-basic-offset: 4
    150  * tab-width: 4
    151  * indent-tabs-mode: nil
    152  * End:
    153  */
    154