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 | |