xref: /openbmc/linux/include/xen/interface/io/pvcalls.h (revision 75e3ea5ba7d7a6c171c62c710990f2a5fb07e19a)
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