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