qemu with hax to log dma reads & writes jcs.org/2018/11/12/vfio

vmbus: add vmbus protocol definitions

Add a header with data structures and constants used in Hyper-V VMBus
hypervisor <-> guest interactions.

Based on the respective stuff from Linux kernel.

Signed-off-by: Roman Kagan <rkagan@virtuozzo.com>
Signed-off-by: Maciej S. Szmigiero <maciej.szmigiero@oracle.com>
Signed-off-by: Jon Doron <arilou@gmail.com>
Message-Id: <20200424123444.3481728-3-arilou@gmail.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

authored by

Jon Doron and committed by
Paolo Bonzini
973b1fbd d42cd961

+222
+222
include/hw/hyperv/vmbus-proto.h
··· 1 + /* 2 + * QEMU Hyper-V VMBus support 3 + * 4 + * Copyright (c) 2017-2018 Virtuozzo International GmbH. 5 + * 6 + * This work is licensed under the terms of the GNU GPL, version 2 or later. 7 + * See the COPYING file in the top-level directory. 8 + */ 9 + 10 + #ifndef HW_HYPERV_VMBUS_PROTO_H 11 + #define HW_HYPERV_VMBUS_PROTO_H 12 + 13 + #define VMBUS_VERSION_WS2008 ((0 << 16) | (13)) 14 + #define VMBUS_VERSION_WIN7 ((1 << 16) | (1)) 15 + #define VMBUS_VERSION_WIN8 ((2 << 16) | (4)) 16 + #define VMBUS_VERSION_WIN8_1 ((3 << 16) | (0)) 17 + #define VMBUS_VERSION_WIN10 ((4 << 16) | (0)) 18 + #define VMBUS_VERSION_INVAL -1 19 + #define VMBUS_VERSION_CURRENT VMBUS_VERSION_WIN10 20 + 21 + #define VMBUS_MESSAGE_CONNECTION_ID 1 22 + #define VMBUS_EVENT_CONNECTION_ID 2 23 + #define VMBUS_MONITOR_CONNECTION_ID 3 24 + #define VMBUS_SINT 2 25 + 26 + #define VMBUS_MSG_INVALID 0 27 + #define VMBUS_MSG_OFFERCHANNEL 1 28 + #define VMBUS_MSG_RESCIND_CHANNELOFFER 2 29 + #define VMBUS_MSG_REQUESTOFFERS 3 30 + #define VMBUS_MSG_ALLOFFERS_DELIVERED 4 31 + #define VMBUS_MSG_OPENCHANNEL 5 32 + #define VMBUS_MSG_OPENCHANNEL_RESULT 6 33 + #define VMBUS_MSG_CLOSECHANNEL 7 34 + #define VMBUS_MSG_GPADL_HEADER 8 35 + #define VMBUS_MSG_GPADL_BODY 9 36 + #define VMBUS_MSG_GPADL_CREATED 10 37 + #define VMBUS_MSG_GPADL_TEARDOWN 11 38 + #define VMBUS_MSG_GPADL_TORNDOWN 12 39 + #define VMBUS_MSG_RELID_RELEASED 13 40 + #define VMBUS_MSG_INITIATE_CONTACT 14 41 + #define VMBUS_MSG_VERSION_RESPONSE 15 42 + #define VMBUS_MSG_UNLOAD 16 43 + #define VMBUS_MSG_UNLOAD_RESPONSE 17 44 + #define VMBUS_MSG_COUNT 18 45 + 46 + #define VMBUS_MESSAGE_SIZE_ALIGN sizeof(uint64_t) 47 + 48 + #define VMBUS_PACKET_INVALID 0x0 49 + #define VMBUS_PACKET_SYNCH 0x1 50 + #define VMBUS_PACKET_ADD_XFER_PAGESET 0x2 51 + #define VMBUS_PACKET_RM_XFER_PAGESET 0x3 52 + #define VMBUS_PACKET_ESTABLISH_GPADL 0x4 53 + #define VMBUS_PACKET_TEARDOWN_GPADL 0x5 54 + #define VMBUS_PACKET_DATA_INBAND 0x6 55 + #define VMBUS_PACKET_DATA_USING_XFER_PAGES 0x7 56 + #define VMBUS_PACKET_DATA_USING_GPADL 0x8 57 + #define VMBUS_PACKET_DATA_USING_GPA_DIRECT 0x9 58 + #define VMBUS_PACKET_CANCEL_REQUEST 0xa 59 + #define VMBUS_PACKET_COMP 0xb 60 + #define VMBUS_PACKET_DATA_USING_ADDITIONAL_PKT 0xc 61 + #define VMBUS_PACKET_ADDITIONAL_DATA 0xd 62 + 63 + #define VMBUS_CHANNEL_USER_DATA_SIZE 120 64 + 65 + #define VMBUS_OFFER_MONITOR_ALLOCATED 0x1 66 + #define VMBUS_OFFER_INTERRUPT_DEDICATED 0x1 67 + 68 + #define VMBUS_RING_BUFFER_FEAT_PENDING_SZ (1ul << 0) 69 + 70 + #define VMBUS_CHANNEL_ENUMERATE_DEVICE_INTERFACE 0x1 71 + #define VMBUS_CHANNEL_SERVER_SUPPORTS_TRANSFER_PAGES 0x2 72 + #define VMBUS_CHANNEL_SERVER_SUPPORTS_GPADLS 0x4 73 + #define VMBUS_CHANNEL_NAMED_PIPE_MODE 0x10 74 + #define VMBUS_CHANNEL_LOOPBACK_OFFER 0x100 75 + #define VMBUS_CHANNEL_PARENT_OFFER 0x200 76 + #define VMBUS_CHANNEL_REQUEST_MONITORED_NOTIFICATION 0x400 77 + #define VMBUS_CHANNEL_TLNPI_PROVIDER_OFFER 0x2000 78 + 79 + #define VMBUS_PACKET_FLAG_REQUEST_COMPLETION 1 80 + 81 + typedef struct vmbus_message_header { 82 + uint32_t message_type; 83 + uint32_t _padding; 84 + } vmbus_message_header; 85 + 86 + typedef struct vmbus_message_initiate_contact { 87 + vmbus_message_header header; 88 + uint32_t version_requested; 89 + uint32_t target_vcpu; 90 + uint64_t interrupt_page; 91 + uint64_t monitor_page1; 92 + uint64_t monitor_page2; 93 + } vmbus_message_initiate_contact; 94 + 95 + typedef struct vmbus_message_version_response { 96 + vmbus_message_header header; 97 + uint8_t version_supported; 98 + uint8_t status; 99 + } vmbus_message_version_response; 100 + 101 + typedef struct vmbus_message_offer_channel { 102 + vmbus_message_header header; 103 + uint8_t type_uuid[16]; 104 + uint8_t instance_uuid[16]; 105 + uint64_t _reserved1; 106 + uint64_t _reserved2; 107 + uint16_t channel_flags; 108 + uint16_t mmio_size_mb; 109 + uint8_t user_data[VMBUS_CHANNEL_USER_DATA_SIZE]; 110 + uint16_t sub_channel_index; 111 + uint16_t _reserved3; 112 + uint32_t child_relid; 113 + uint8_t monitor_id; 114 + uint8_t monitor_flags; 115 + uint16_t interrupt_flags; 116 + uint32_t connection_id; 117 + } vmbus_message_offer_channel; 118 + 119 + typedef struct vmbus_message_rescind_channel_offer { 120 + vmbus_message_header header; 121 + uint32_t child_relid; 122 + } vmbus_message_rescind_channel_offer; 123 + 124 + typedef struct vmbus_gpa_range { 125 + uint32_t byte_count; 126 + uint32_t byte_offset; 127 + uint64_t pfn_array[]; 128 + } vmbus_gpa_range; 129 + 130 + typedef struct vmbus_message_gpadl_header { 131 + vmbus_message_header header; 132 + uint32_t child_relid; 133 + uint32_t gpadl_id; 134 + uint16_t range_buflen; 135 + uint16_t rangecount; 136 + vmbus_gpa_range range[]; 137 + } QEMU_PACKED vmbus_message_gpadl_header; 138 + 139 + typedef struct vmbus_message_gpadl_body { 140 + vmbus_message_header header; 141 + uint32_t message_number; 142 + uint32_t gpadl_id; 143 + uint64_t pfn_array[]; 144 + } vmbus_message_gpadl_body; 145 + 146 + typedef struct vmbus_message_gpadl_created { 147 + vmbus_message_header header; 148 + uint32_t child_relid; 149 + uint32_t gpadl_id; 150 + uint32_t status; 151 + } vmbus_message_gpadl_created; 152 + 153 + typedef struct vmbus_message_gpadl_teardown { 154 + vmbus_message_header header; 155 + uint32_t child_relid; 156 + uint32_t gpadl_id; 157 + } vmbus_message_gpadl_teardown; 158 + 159 + typedef struct vmbus_message_gpadl_torndown { 160 + vmbus_message_header header; 161 + uint32_t gpadl_id; 162 + } vmbus_message_gpadl_torndown; 163 + 164 + typedef struct vmbus_message_open_channel { 165 + vmbus_message_header header; 166 + uint32_t child_relid; 167 + uint32_t open_id; 168 + uint32_t ring_buffer_gpadl_id; 169 + uint32_t target_vp; 170 + uint32_t ring_buffer_offset; 171 + uint8_t user_data[VMBUS_CHANNEL_USER_DATA_SIZE]; 172 + } vmbus_message_open_channel; 173 + 174 + typedef struct vmbus_message_open_result { 175 + vmbus_message_header header; 176 + uint32_t child_relid; 177 + uint32_t open_id; 178 + uint32_t status; 179 + } vmbus_message_open_result; 180 + 181 + typedef struct vmbus_message_close_channel { 182 + vmbus_message_header header; 183 + uint32_t child_relid; 184 + } vmbus_message_close_channel; 185 + 186 + typedef struct vmbus_ring_buffer { 187 + uint32_t write_index; 188 + uint32_t read_index; 189 + uint32_t interrupt_mask; 190 + uint32_t pending_send_sz; 191 + uint32_t _reserved1[12]; 192 + uint32_t feature_bits; 193 + } vmbus_ring_buffer; 194 + 195 + typedef struct vmbus_packet_hdr { 196 + uint16_t type; 197 + uint16_t offset_qwords; 198 + uint16_t len_qwords; 199 + uint16_t flags; 200 + uint64_t transaction_id; 201 + } vmbus_packet_hdr; 202 + 203 + typedef struct vmbus_pkt_gpa_direct { 204 + uint32_t _reserved; 205 + uint32_t rangecount; 206 + vmbus_gpa_range range[]; 207 + } vmbus_pkt_gpa_direct; 208 + 209 + typedef struct vmbus_xferpg_range { 210 + uint32_t byte_count; 211 + uint32_t byte_offset; 212 + } vmbus_xferpg_range; 213 + 214 + typedef struct vmbus_pkt_xferpg { 215 + uint16_t buffer_id; 216 + uint8_t sender_owns_set; 217 + uint8_t _reserved; 218 + uint32_t rangecount; 219 + vmbus_xferpg_range range[]; 220 + } vmbus_pkt_xferpg; 221 + 222 + #endif