qemu/include/hw/hyperv/vmbus-proto.h
<<
>>
Prefs
   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
  81typedef struct vmbus_message_header {
  82    uint32_t message_type;
  83    uint32_t _padding;
  84} vmbus_message_header;
  85
  86typedef 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
  95typedef 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
 101typedef 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
 119typedef struct vmbus_message_rescind_channel_offer {
 120    vmbus_message_header header;
 121    uint32_t child_relid;
 122} vmbus_message_rescind_channel_offer;
 123
 124typedef struct vmbus_gpa_range {
 125    uint32_t byte_count;
 126    uint32_t byte_offset;
 127    uint64_t pfn_array[];
 128} vmbus_gpa_range;
 129
 130typedef 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
 139typedef 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
 146typedef 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
 153typedef 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
 159typedef struct vmbus_message_gpadl_torndown {
 160    vmbus_message_header header;
 161    uint32_t gpadl_id;
 162} vmbus_message_gpadl_torndown;
 163
 164typedef 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
 174typedef 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
 181typedef struct vmbus_message_close_channel {
 182    vmbus_message_header header;
 183    uint32_t child_relid;
 184} vmbus_message_close_channel;
 185
 186typedef 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
 195typedef 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
 203typedef struct vmbus_pkt_gpa_direct {
 204    uint32_t _reserved;
 205    uint32_t rangecount;
 206    vmbus_gpa_range range[];
 207} vmbus_pkt_gpa_direct;
 208
 209typedef struct vmbus_xferpg_range {
 210    uint32_t byte_count;
 211    uint32_t byte_offset;
 212} vmbus_xferpg_range;
 213
 214typedef 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
 223