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