1/*
2 * pvcalls.h -- Xen PV Calls Protocol
3 *
4 * Refer to docs/misc/pvcalls.markdown for the specification
5 *
6 * The header is provided as a C reference for the specification. In
7 * case of conflict, the specification is authoritative.
8 *
9 * Permission is hereby granted, free of charge, to any person obtaining a copy
10 * of this software and associated documentation files (the "Software"), to
11 * deal in the Software without restriction, including without limitation the
12 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
13 * sell copies of the Software, and to permit persons to whom the Software is
14 * furnished to do so, subject to the following conditions:
15 *
16 * The above copyright notice and this permission notice shall be included in
17 * all copies or substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25 * DEALINGS IN THE SOFTWARE.
26 *
27 * Copyright (C) 2017 Stefano Stabellini <stefano@aporeto.com>
28 */
29
30#ifndef __XEN_PUBLIC_IO_PVCALLS_H__
31#define __XEN_PUBLIC_IO_PVCALLS_H__
32
33#include "../grant_table.h"
34#include "ring.h"
35
36/*
37 * See docs/misc/pvcalls.markdown in xen.git for the full specification:
38 * https://xenbits.xen.org/docs/unstable/misc/pvcalls.html
39 */
40struct pvcalls_data_intf {
41    RING_IDX in_cons, in_prod, in_error;
42
43    uint8_t pad1[52];
44
45    RING_IDX out_cons, out_prod, out_error;
46
47    uint8_t pad2[52];
48
49    RING_IDX ring_order;
50    grant_ref_t ref[];
51};
52DEFINE_XEN_FLEX_RING(pvcalls);
53
54#define PVCALLS_SOCKET         0
55#define PVCALLS_CONNECT        1
56#define PVCALLS_RELEASE        2
57#define PVCALLS_BIND           3
58#define PVCALLS_LISTEN         4
59#define PVCALLS_ACCEPT         5
60#define PVCALLS_POLL           6
61
62struct xen_pvcalls_request {
63    uint32_t req_id; /* private to guest, echoed in response */
64    uint32_t cmd;    /* command to execute */
65    union {
66        struct xen_pvcalls_socket {
67            uint64_t id;
68            uint32_t domain;
69            uint32_t type;
70            uint32_t protocol;
71            uint8_t pad[4];
72        } socket;
73        struct xen_pvcalls_connect {
74            uint64_t id;
75            uint8_t addr[28];
76            uint32_t len;
77            uint32_t flags;
78            grant_ref_t ref;
79            uint32_t evtchn;
80            uint8_t pad[4];
81        } connect;
82        struct xen_pvcalls_release {
83            uint64_t id;
84            uint8_t reuse;
85            uint8_t pad[7];
86        } release;
87        struct xen_pvcalls_bind {
88            uint64_t id;
89            uint8_t addr[28];
90            uint32_t len;
91        } bind;
92        struct xen_pvcalls_listen {
93            uint64_t id;
94            uint32_t backlog;
95            uint8_t pad[4];
96        } listen;
97        struct xen_pvcalls_accept {
98            uint64_t id;
99            uint64_t id_new;
100            grant_ref_t ref;
101            uint32_t evtchn;
102        } accept;
103        struct xen_pvcalls_poll {
104            uint64_t id;
105        } poll;
106        /* dummy member to force sizeof(struct xen_pvcalls_request)
107         * to match across archs */
108        struct xen_pvcalls_dummy {
109            uint8_t dummy[56];
110        } dummy;
111    } u;
112};
113
114struct xen_pvcalls_response {
115    uint32_t req_id;
116    uint32_t cmd;
117    int32_t ret;
118    uint32_t pad;
119    union {
120        struct _xen_pvcalls_socket {
121            uint64_t id;
122        } socket;
123        struct _xen_pvcalls_connect {
124            uint64_t id;
125        } connect;
126        struct _xen_pvcalls_release {
127            uint64_t id;
128        } release;
129        struct _xen_pvcalls_bind {
130            uint64_t id;
131        } bind;
132        struct _xen_pvcalls_listen {
133            uint64_t id;
134        } listen;
135        struct _xen_pvcalls_accept {
136            uint64_t id;
137        } accept;
138        struct _xen_pvcalls_poll {
139            uint64_t id;
140        } poll;
141        struct _xen_pvcalls_dummy {
142            uint8_t dummy[8];
143        } dummy;
144    } u;
145};
146
147DEFINE_RING_TYPES(xen_pvcalls, struct xen_pvcalls_request,
148                  struct xen_pvcalls_response);
149
150#endif
151
152/*
153 * Local variables:
154 * mode: C
155 * c-file-style: "BSD"
156 * c-basic-offset: 4
157 * tab-width: 4
158 * indent-tabs-mode: nil
159 * End:
160 */
161