aboutsummaryrefslogtreecommitdiff
path: root/include/hw/hyperv/vmbus-proto.h
blob: 4628d3b323a66a98175d141a3b89d0a783aad5d8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
/*
 * QEMU Hyper-V VMBus support
 *
 * Copyright (c) 2017-2018 Virtuozzo International GmbH.
 *
 * This work is licensed under the terms of the GNU GPL, version 2 or later.
 * See the COPYING file in the top-level directory.
 */

#ifndef HW_HYPERV_VMBUS_PROTO_H
#define HW_HYPERV_VMBUS_PROTO_H

#define VMBUS_VERSION_WS2008                    ((0 << 16) | (13))
#define VMBUS_VERSION_WIN7                      ((1 << 16) | (1))
#define VMBUS_VERSION_WIN8                      ((2 << 16) | (4))
#define VMBUS_VERSION_WIN8_1                    ((3 << 16) | (0))
#define VMBUS_VERSION_WIN10                     ((4 << 16) | (0))
#define VMBUS_VERSION_INVAL                     -1
#define VMBUS_VERSION_CURRENT                   VMBUS_VERSION_WIN10

#define VMBUS_MESSAGE_CONNECTION_ID             1
#define VMBUS_EVENT_CONNECTION_ID               2
#define VMBUS_MONITOR_CONNECTION_ID             3
#define VMBUS_SINT                              2

#define VMBUS_MSG_INVALID               0
#define VMBUS_MSG_OFFERCHANNEL          1
#define VMBUS_MSG_RESCIND_CHANNELOFFER  2
#define VMBUS_MSG_REQUESTOFFERS         3
#define VMBUS_MSG_ALLOFFERS_DELIVERED   4
#define VMBUS_MSG_OPENCHANNEL           5
#define VMBUS_MSG_OPENCHANNEL_RESULT    6
#define VMBUS_MSG_CLOSECHANNEL          7
#define VMBUS_MSG_GPADL_HEADER          8
#define VMBUS_MSG_GPADL_BODY            9
#define VMBUS_MSG_GPADL_CREATED         10
#define VMBUS_MSG_GPADL_TEARDOWN        11
#define VMBUS_MSG_GPADL_TORNDOWN        12
#define VMBUS_MSG_RELID_RELEASED        13
#define VMBUS_MSG_INITIATE_CONTACT      14
#define VMBUS_MSG_VERSION_RESPONSE      15
#define VMBUS_MSG_UNLOAD                16
#define VMBUS_MSG_UNLOAD_RESPONSE       17
#define VMBUS_MSG_COUNT                 18

#define VMBUS_MESSAGE_SIZE_ALIGN        sizeof(uint64_t)

#define VMBUS_PACKET_INVALID                    0x0
#define VMBUS_PACKET_SYNCH                      0x1
#define VMBUS_PACKET_ADD_XFER_PAGESET           0x2
#define VMBUS_PACKET_RM_XFER_PAGESET            0x3
#define VMBUS_PACKET_ESTABLISH_GPADL            0x4
#define VMBUS_PACKET_TEARDOWN_GPADL             0x5
#define VMBUS_PACKET_DATA_INBAND                0x6
#define VMBUS_PACKET_DATA_USING_XFER_PAGES      0x7
#define VMBUS_PACKET_DATA_USING_GPADL           0x8
#define VMBUS_PACKET_DATA_USING_GPA_DIRECT      0x9
#define VMBUS_PACKET_CANCEL_REQUEST             0xa
#define VMBUS_PACKET_COMP                       0xb
#define VMBUS_PACKET_DATA_USING_ADDITIONAL_PKT  0xc
#define VMBUS_PACKET_ADDITIONAL_DATA            0xd

#define VMBUS_CHANNEL_USER_DATA_SIZE            120

#define VMBUS_OFFER_MONITOR_ALLOCATED           0x1
#define VMBUS_OFFER_INTERRUPT_DEDICATED         0x1

#define VMBUS_RING_BUFFER_FEAT_PENDING_SZ       (1ul << 0)

#define VMBUS_CHANNEL_ENUMERATE_DEVICE_INTERFACE      0x1
#define VMBUS_CHANNEL_SERVER_SUPPORTS_TRANSFER_PAGES  0x2
#define VMBUS_CHANNEL_SERVER_SUPPORTS_GPADLS          0x4
#define VMBUS_CHANNEL_NAMED_PIPE_MODE                 0x10
#define VMBUS_CHANNEL_LOOPBACK_OFFER                  0x100
#define VMBUS_CHANNEL_PARENT_OFFER                    0x200
#define VMBUS_CHANNEL_REQUEST_MONITORED_NOTIFICATION  0x400
#define VMBUS_CHANNEL_TLNPI_PROVIDER_OFFER            0x2000

#define VMBUS_PACKET_FLAG_REQUEST_COMPLETION    1

typedef struct vmbus_message_header {
    uint32_t message_type;
    uint32_t _padding;
} vmbus_message_header;

typedef struct vmbus_message_initiate_contact {
    vmbus_message_header header;
    uint32_t version_requested;
    uint32_t target_vcpu;
    uint64_t interrupt_page;
    uint64_t monitor_page1;
    uint64_t monitor_page2;
} vmbus_message_initiate_contact;

typedef struct vmbus_message_version_response {
    vmbus_message_header header;
    uint8_t version_supported;
    uint8_t status;
} vmbus_message_version_response;

typedef struct vmbus_message_offer_channel {
    vmbus_message_header header;
    uint8_t  type_uuid[16];
    uint8_t  instance_uuid[16];
    uint64_t _reserved1;
    uint64_t _reserved2;
    uint16_t channel_flags;
    uint16_t mmio_size_mb;
    uint8_t  user_data[VMBUS_CHANNEL_USER_DATA_SIZE];
    uint16_t sub_channel_index;
    uint16_t _reserved3;
    uint32_t child_relid;
    uint8_t  monitor_id;
    uint8_t  monitor_flags;
    uint16_t interrupt_flags;
    uint32_t connection_id;
} vmbus_message_offer_channel;

typedef struct vmbus_message_rescind_channel_offer {
    vmbus_message_header header;
    uint32_t child_relid;
} vmbus_message_rescind_channel_offer;

typedef struct vmbus_gpa_range {
    uint32_t byte_count;
    uint32_t byte_offset;
    uint64_t pfn_array[];
} vmbus_gpa_range;

typedef struct vmbus_message_gpadl_header {
    vmbus_message_header header;
    uint32_t child_relid;
    uint32_t gpadl_id;
    uint16_t range_buflen;
    uint16_t rangecount;
    vmbus_gpa_range range[];
} QEMU_PACKED vmbus_message_gpadl_header;

typedef struct vmbus_message_gpadl_body {
    vmbus_message_header header;
    uint32_t message_number;
    uint32_t gpadl_id;
    uint64_t pfn_array[];
} vmbus_message_gpadl_body;

typedef struct vmbus_message_gpadl_created {
    vmbus_message_header header;
    uint32_t child_relid;
    uint32_t gpadl_id;
    uint32_t status;
} vmbus_message_gpadl_created;

typedef struct vmbus_message_gpadl_teardown {
    vmbus_message_header header;
    uint32_t child_relid;
    uint32_t gpadl_id;
} vmbus_message_gpadl_teardown;

typedef struct vmbus_message_gpadl_torndown {
    vmbus_message_header header;
    uint32_t gpadl_id;
} vmbus_message_gpadl_torndown;

typedef struct vmbus_message_open_channel {
    vmbus_message_header header;
    uint32_t child_relid;
    uint32_t open_id;
    uint32_t ring_buffer_gpadl_id;
    uint32_t target_vp;
    uint32_t ring_buffer_offset;
    uint8_t  user_data[VMBUS_CHANNEL_USER_DATA_SIZE];
} vmbus_message_open_channel;

typedef struct vmbus_message_open_result {
    vmbus_message_header header;
    uint32_t child_relid;
    uint32_t open_id;
    uint32_t status;
} vmbus_message_open_result;

typedef struct vmbus_message_close_channel {
    vmbus_message_header header;
    uint32_t child_relid;
} vmbus_message_close_channel;

typedef struct vmbus_ring_buffer {
    uint32_t write_index;
    uint32_t read_index;
    uint32_t interrupt_mask;
    uint32_t pending_send_sz;
    uint32_t _reserved1[12];
    uint32_t feature_bits;
} vmbus_ring_buffer;

typedef struct vmbus_packet_hdr {
    uint16_t type;
    uint16_t offset_qwords;
    uint16_t len_qwords;
    uint16_t flags;
    uint64_t transaction_id;
} vmbus_packet_hdr;

typedef struct vmbus_pkt_gpa_direct {
    uint32_t _reserved;
    uint32_t rangecount;
    vmbus_gpa_range range[];
} vmbus_pkt_gpa_direct;

typedef struct vmbus_xferpg_range {
    uint32_t byte_count;
    uint32_t byte_offset;
} vmbus_xferpg_range;

typedef struct vmbus_pkt_xferpg {
    uint16_t buffer_id;
    uint8_t sender_owns_set;
    uint8_t _reserved;
    uint32_t rangecount;
    vmbus_xferpg_range range[];
} vmbus_pkt_xferpg;

#endif