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 */
17struct 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};
29DEFINE_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
39struct 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
87struct 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
120DEFINE_RING_TYPES(xen_pvcalls, struct xen_pvcalls_request,
121                  struct xen_pvcalls_response);
122
123#endif
124