1*75e3ea5bSStefano Stabellini #ifndef __XEN_PUBLIC_IO_XEN_PVCALLS_H__ 2*75e3ea5bSStefano Stabellini #define __XEN_PUBLIC_IO_XEN_PVCALLS_H__ 3*75e3ea5bSStefano Stabellini 4*75e3ea5bSStefano Stabellini #include <linux/net.h> 5*75e3ea5bSStefano Stabellini #include <xen/interface/io/ring.h> 6*75e3ea5bSStefano Stabellini #include <xen/interface/grant_table.h> 7*75e3ea5bSStefano Stabellini 8*75e3ea5bSStefano Stabellini /* "1" means socket, connect, release, bind, listen, accept and poll */ 9*75e3ea5bSStefano Stabellini #define XENBUS_FUNCTIONS_CALLS "1" 10*75e3ea5bSStefano Stabellini 11*75e3ea5bSStefano Stabellini /* 12*75e3ea5bSStefano Stabellini * See docs/misc/pvcalls.markdown in xen.git for the full specification: 13*75e3ea5bSStefano Stabellini * https://xenbits.xen.org/docs/unstable/misc/pvcalls.html 14*75e3ea5bSStefano Stabellini */ 15*75e3ea5bSStefano Stabellini struct pvcalls_data_intf { 16*75e3ea5bSStefano Stabellini RING_IDX in_cons, in_prod, in_error; 17*75e3ea5bSStefano Stabellini 18*75e3ea5bSStefano Stabellini uint8_t pad1[52]; 19*75e3ea5bSStefano Stabellini 20*75e3ea5bSStefano Stabellini RING_IDX out_cons, out_prod, out_error; 21*75e3ea5bSStefano Stabellini 22*75e3ea5bSStefano Stabellini uint8_t pad2[52]; 23*75e3ea5bSStefano Stabellini 24*75e3ea5bSStefano Stabellini RING_IDX ring_order; 25*75e3ea5bSStefano Stabellini grant_ref_t ref[]; 26*75e3ea5bSStefano Stabellini }; 27*75e3ea5bSStefano Stabellini DEFINE_XEN_FLEX_RING(pvcalls); 28*75e3ea5bSStefano Stabellini 29*75e3ea5bSStefano Stabellini #define PVCALLS_SOCKET 0 30*75e3ea5bSStefano Stabellini #define PVCALLS_CONNECT 1 31*75e3ea5bSStefano Stabellini #define PVCALLS_RELEASE 2 32*75e3ea5bSStefano Stabellini #define PVCALLS_BIND 3 33*75e3ea5bSStefano Stabellini #define PVCALLS_LISTEN 4 34*75e3ea5bSStefano Stabellini #define PVCALLS_ACCEPT 5 35*75e3ea5bSStefano Stabellini #define PVCALLS_POLL 6 36*75e3ea5bSStefano Stabellini 37*75e3ea5bSStefano Stabellini struct xen_pvcalls_request { 38*75e3ea5bSStefano Stabellini uint32_t req_id; /* private to guest, echoed in response */ 39*75e3ea5bSStefano Stabellini uint32_t cmd; /* command to execute */ 40*75e3ea5bSStefano Stabellini union { 41*75e3ea5bSStefano Stabellini struct xen_pvcalls_socket { 42*75e3ea5bSStefano Stabellini uint64_t id; 43*75e3ea5bSStefano Stabellini uint32_t domain; 44*75e3ea5bSStefano Stabellini uint32_t type; 45*75e3ea5bSStefano Stabellini uint32_t protocol; 46*75e3ea5bSStefano Stabellini } socket; 47*75e3ea5bSStefano Stabellini struct xen_pvcalls_connect { 48*75e3ea5bSStefano Stabellini uint64_t id; 49*75e3ea5bSStefano Stabellini uint8_t addr[28]; 50*75e3ea5bSStefano Stabellini uint32_t len; 51*75e3ea5bSStefano Stabellini uint32_t flags; 52*75e3ea5bSStefano Stabellini grant_ref_t ref; 53*75e3ea5bSStefano Stabellini uint32_t evtchn; 54*75e3ea5bSStefano Stabellini } connect; 55*75e3ea5bSStefano Stabellini struct xen_pvcalls_release { 56*75e3ea5bSStefano Stabellini uint64_t id; 57*75e3ea5bSStefano Stabellini uint8_t reuse; 58*75e3ea5bSStefano Stabellini } release; 59*75e3ea5bSStefano Stabellini struct xen_pvcalls_bind { 60*75e3ea5bSStefano Stabellini uint64_t id; 61*75e3ea5bSStefano Stabellini uint8_t addr[28]; 62*75e3ea5bSStefano Stabellini uint32_t len; 63*75e3ea5bSStefano Stabellini } bind; 64*75e3ea5bSStefano Stabellini struct xen_pvcalls_listen { 65*75e3ea5bSStefano Stabellini uint64_t id; 66*75e3ea5bSStefano Stabellini uint32_t backlog; 67*75e3ea5bSStefano Stabellini } listen; 68*75e3ea5bSStefano Stabellini struct xen_pvcalls_accept { 69*75e3ea5bSStefano Stabellini uint64_t id; 70*75e3ea5bSStefano Stabellini uint64_t id_new; 71*75e3ea5bSStefano Stabellini grant_ref_t ref; 72*75e3ea5bSStefano Stabellini uint32_t evtchn; 73*75e3ea5bSStefano Stabellini } accept; 74*75e3ea5bSStefano Stabellini struct xen_pvcalls_poll { 75*75e3ea5bSStefano Stabellini uint64_t id; 76*75e3ea5bSStefano Stabellini } poll; 77*75e3ea5bSStefano Stabellini /* dummy member to force sizeof(struct xen_pvcalls_request) 78*75e3ea5bSStefano Stabellini * to match across archs */ 79*75e3ea5bSStefano Stabellini struct xen_pvcalls_dummy { 80*75e3ea5bSStefano Stabellini uint8_t dummy[56]; 81*75e3ea5bSStefano Stabellini } dummy; 82*75e3ea5bSStefano Stabellini } u; 83*75e3ea5bSStefano Stabellini }; 84*75e3ea5bSStefano Stabellini 85*75e3ea5bSStefano Stabellini struct xen_pvcalls_response { 86*75e3ea5bSStefano Stabellini uint32_t req_id; 87*75e3ea5bSStefano Stabellini uint32_t cmd; 88*75e3ea5bSStefano Stabellini int32_t ret; 89*75e3ea5bSStefano Stabellini uint32_t pad; 90*75e3ea5bSStefano Stabellini union { 91*75e3ea5bSStefano Stabellini struct _xen_pvcalls_socket { 92*75e3ea5bSStefano Stabellini uint64_t id; 93*75e3ea5bSStefano Stabellini } socket; 94*75e3ea5bSStefano Stabellini struct _xen_pvcalls_connect { 95*75e3ea5bSStefano Stabellini uint64_t id; 96*75e3ea5bSStefano Stabellini } connect; 97*75e3ea5bSStefano Stabellini struct _xen_pvcalls_release { 98*75e3ea5bSStefano Stabellini uint64_t id; 99*75e3ea5bSStefano Stabellini } release; 100*75e3ea5bSStefano Stabellini struct _xen_pvcalls_bind { 101*75e3ea5bSStefano Stabellini uint64_t id; 102*75e3ea5bSStefano Stabellini } bind; 103*75e3ea5bSStefano Stabellini struct _xen_pvcalls_listen { 104*75e3ea5bSStefano Stabellini uint64_t id; 105*75e3ea5bSStefano Stabellini } listen; 106*75e3ea5bSStefano Stabellini struct _xen_pvcalls_accept { 107*75e3ea5bSStefano Stabellini uint64_t id; 108*75e3ea5bSStefano Stabellini } accept; 109*75e3ea5bSStefano Stabellini struct _xen_pvcalls_poll { 110*75e3ea5bSStefano Stabellini uint64_t id; 111*75e3ea5bSStefano Stabellini } poll; 112*75e3ea5bSStefano Stabellini struct _xen_pvcalls_dummy { 113*75e3ea5bSStefano Stabellini uint8_t dummy[8]; 114*75e3ea5bSStefano Stabellini } dummy; 115*75e3ea5bSStefano Stabellini } u; 116*75e3ea5bSStefano Stabellini }; 117*75e3ea5bSStefano Stabellini 118*75e3ea5bSStefano Stabellini DEFINE_RING_TYPES(xen_pvcalls, struct xen_pvcalls_request, 119*75e3ea5bSStefano Stabellini struct xen_pvcalls_response); 120*75e3ea5bSStefano Stabellini 121*75e3ea5bSStefano Stabellini #endif 122