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