xref: /OK3568_Linux_fs/kernel/include/xen/interface/io/pvcalls.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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